<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Clojurists Together</title>
    <link>https://www.clojuriststogether.org/</link>
    <description>Recent content on Clojurists Together</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 04 Mar 2026 08:30:00 +0800</lastBuildDate>
    
        <atom:link href="https://www.clojuriststogether.org/index.xml" rel="self" type="application/rss+xml" />
    
    
    
    
    
    <item>
      <title>Call for Proposals. Feb. 2026 Survey</title>
      <link>https://www.clojuriststogether.org/news/call-for-proposals.-feb.-2026-survey/</link>
      <pubDate>Wed, 04 Mar 2026 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-proposals.-feb.-2026-survey/</guid>
      <description>We are awarding up to $33K for Q2 2026 Projects</description>
      <content:encoded><![CDATA[<p>Greetings folks!</p>
<p>Clojurists Together is pleased to announce that we are opening our Q2 2026 funding round for Clojure Open Source Projects.  Applications will be accepted through the 19th of March 2026 (midnight Pacific Time). We are looking forward to reviewing your proposals! <a href="https://clojuriststogether.org/open-source/">More information and the application can be found here.</a></p>
<p>We will be awarding up to $33,000 USD for a total of 5-7 projects. The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established. Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed. We expect projects to start at the beginning of April 2026.</p>
<p>A BIG THANKS to all our members for your continued support. We also want to encourage you to reach out to your <a href="https://www.clojuriststogether.org/developers/">colleagues</a> and <a href="https://www.clojuriststogether.org/companies/">companies</a> to join Clojurists Together so that we can fund EVEN MORE great projects throughout the year.</p>
<h3 id="and-now-the-survey">And Now the Survey&hellip;</h3>
<p>We surveyed the community in February to find out what what issues were top of mind and types of initiatives they would like us to focus on for this round of funding. As always, there were a lot of ideas and we hope they will be useful in informing your project proposals.</p>
<p><strong>A number of themes appeared in the survey results.</strong></p>
<p><strong>The biggest theme, by far, was related to adoption and growth of Clojure.</strong> Respondents repeatedly mentioned that Clojure is niche, and although they are happy with Clojure, that makes it harder to justify for projects, to find employment, and to persuade others than it is for more popular languages. Respondents want a larger community and wider adoption. In particular, they want more public advocacy for Clojure, including videos, tutorials, public success stories, starter projects, and outreach in general.</p>
<p><strong>Another major theme was AI.</strong> Respondents were concerned about AI coding assistants being perceived as having weak Clojure support, and they expressed frustration that Python is perceived as the safe choice for AI despite how well Clojure works with AI tooling. Nonetheless, respondents would like to see more work on tooling, guides, and resources for using AI with Clojure.</p>
<p><strong>ClojureScript and JavaScript interop received the most specific attention.</strong> Respondents want CLJS/Cherry/Skittle to provide frictionless support for modern JavaScript standards (ES6 and ESM) and would like an overall simplification of the build and run process.</p>
<p><strong>Developer experience issues</strong> came up a number of times, including: confusing error messages, poor documentation, and under-supported libraries. Improvements to any of those would be welcome.</p>
<p><strong>Difficulty finding Clojure employment</strong> was another recurring theme. Respondents were not sure how to solve it, but suggested a community job board might be helpful.  <br></p>
<hr>
<h2 id="february-2026-survey">February 2026 Survey</h2>
<h3 id="88-of-respondents-use-or-refer-to-projects-funded-by-clojurists-together">88% of respondents use or refer to projects funded by Clojurists Together</h3>
<p><img width="688" height="302" alt="time spent q2 2026" src="https://github.com/user-attachments/assets/db3e8c70-5450-4b32-a205-9d8349e3653b" />  <br></p>
<hr>
<p><img width="664" height="333" alt="communication q2 2026" src="https://github.com/user-attachments/assets/a02718dd-7d76-48a3-8c56-1c79214fac12" />  <br></p>
<hr>
<p><img width="688" height="367" alt="platform q2 survey" src="https://github.com/user-attachments/assets/fa4fdcf5-3eea-407f-8d4e-96ba7bb7fd65" />  <br></p>
<hr>
<p><img width="687" height="497" alt="clojure improvements q2 2026" src="https://github.com/user-attachments/assets/62a40e38-b0fc-4267-807f-718cdab7de89" />  <br></p>
<hr>
<p><img width="687" height="446" alt="CLojure script improvement q2 2026" src="https://github.com/user-attachments/assets/af94a4ae-12b6-4bef-9c34-241e783a8dcb" />  <br></p>
<hr>
<h4 id="plans-for-conference-attendance-in-2026-number-of-mentions">Plans for Conference Attendance in 2026 (number of mentions):</h4>
<ul>
<li>Clojure/Conj: 8</li>
<li>Dutch Clojure Days: 6</li>
<li>babashka conference: 5</li>
<li>Clojure South: 1</li>
<li>Clojure Jam: 1</li>
<li>reClojure: 1  <br></li>
</ul>
<hr>
<h4 id="if-you-were-only-to-name-one-what-is-the-biggest-challenge-facing-clojure-developers-today-and-how-can-clojurists-together-support-you-or-your-organization-in-addressing-those-challenges-if-you-could-wave-a-magic-wand-and-change-anything-inside-the-clojure-community-what-would-it-be-select-responses-by-category">If you were only to name ONE, what is the biggest challenge facing Clojure developers today and how can Clojurists Together support you or your organization in addressing those challenges? If you could wave a magic wand and change anything inside the Clojure community, what would it be? (select responses by category).</h4>
<p><strong>Adoption:</strong></p>
<ul>
<li>Advertising video like that one on Clojure Conj five years ago or so</li>
<li>Language Adoption and popularity, projects that helps to grow the popularity of the language or helps to start programming easily</li>
<li>Lack of widespread adoption is not a problem&hellip; until you want to convince others that Clojure is a technology you can count on and is worth developing with. Convincing others that Clojure is a great and solid technology that&rsquo;s here to stay, regardless of low(er) adoption, is sometimes tough.</li>
<li>The fact that many teams and project would rule out Clojure as an option, being perceived as niche, far from mainstream, and thus risky</li>
<li>I would have more Clojure evangelism. More videos/blog posts/demos around using Clojure, both about whatever is currently at the peak of the broader tech hype cycle &ndash; LLMs currently &ndash; as well as uses and topics outside of the hype cycle.</li>
</ul>
<p><strong>AI/LLMs</strong></p>
<ul>
<li>Keeping relevant in a programming market is the top challenge. With the IA, everyone is moving toward the most popular languages. If nobody uses Clojure, it is more difficult to justify its use, no matter how much better it could be.</li>
<li>The biggest challenge is the spreading expectation that everything will be done in Python because AI will fix whatever problems Python will allegedly cause.</li>
<li>How will Clojure and the Community fare in the light of LLMs and coding assistants?</li>
<li>We are being encouraged to use Agentic AI coding assistants, but their support for Clojure is behind that of other languages.</li>
<li>How can we articulate the value of Clojure as a sustainable, modern solution when discussion about AI is taking all of the air in the room. We can for example fortify our tooling regards this. Projects such as Calva make Clojure easy to approach for newbies and ClojureMCP is a great tool for Agentic developers.</li>
<li>I am unsure about how LLM driven development fits with Clojure. I find myself building some things with JS and Python. For larger projects I am relying on Clojure for it&rsquo;s correctness properties and lower likelyhood of bugs.</li>
<li>Support AI integration Clojure projects</li>
</ul>
<p><strong>Employment</strong></p>
<ul>
<li>Difficulty finding interesting and reliable work, but this isn&rsquo;t just Clojure-specific, the whole industry is weird right now.</li>
<li>Finding employment writing Clojure code</li>
<li>I would say that the biggest challenge for Clojure developers is in the job search. I&rsquo;m not certain of a solution to this challenge, but perhaps some kind of Clojurists Together Job Board?</li>
</ul>
<p><strong>Developer Experience</strong></p>
<ul>
<li>Developer tooling improvements competitive with modern JavaScript/TypeScript tooling</li>
<li>Missing parts of the data science stack</li>
<li>Better documentation of the tools and projects and more tutorials</li>
<li>Better integration with cljs/scittle/js/typescript - separate cljs compilation too complicated - scittle/squint/cherry with ES6 integration is the way
clojurescript support for ESM libraries. It&rsquo;s crazy the hoops you have to jump through to use ESM with clojurescript, most people probably assume it&rsquo;s not possible at all because it&rsquo;s so difficult.</li>
<li>Closer integration with JavaScript/TypeScript tooling
-Seamless integration of cljs/cherry/scittle into the js-ecosystem with live repl and load-file support, standard sente/websocket communication included, standard/default solid telemetry/instrumentation API</li>
<li>Quicker resolution of outstanding Clojure (JIRA) issues</li>
<li>Have a official support program to people that focus on promote the language and/or community instead of library maintainers (like GDE from Google, MVP from Microsoft, Github Stars from Github)</li>
<li>I would encourage &ldquo;cljc&rdquo; as a default idiom. The linter could say, &ldquo;This could be a cljc file!&rdquo; or &ldquo;Change this to that and suddenly it would be cljc-compatible&rdquo;.</li>
<li>It remains Error Reporting imho, and anyone working on improving it would get my eternal gratitude.  <br></li>
</ul>
<hr>
<h4 id="what-areas-of-the-clojure-ecosystem-need-support-select-responses">What areas of the Clojure ecosystem need support? (select responses)</h4>
<ul>
<li>&ldquo;I think something around marketing/evangelism; I have worked on several teams using Clojure/ClojureScript that have had to defend the use of Clojure/ClojureScript against more mainstream JVM/JS languages, and the core issue we&rsquo;ve run up against is a confluence of the following three items:<br>
&ndash; 1. there are more Kotlin/Scala/TypeScript/Java developers than there are Clojure/ClojureScript developers<br>
&ndash; 2. The salary ranges for those languages tends to be lower than that for Clojure/ClojureScript<br>
&ndash; 3. The greatest benefits to be gained from using Clojure/ClojureScript &ndash; systems which are far easier to understand, maintain, and extend, thus accelerating business goals &ndash; are exceptionally difficult to quantify.&rdquo;</li>
<li>&ldquo;data.xml – My ticket has been rotting away for 14 months. :) (XML is a core technology at my company.)&rdquo;</li>
<li>Repl tooling and setup, more official tutorials and guides. Data validation and schemas.</li>
<li>Data science, clojure for frontend</li>
<li>Guides for LLM driven development that don&rsquo;t invoke huge piles of software just to modify code.</li>
<li>Growth to new domains and use cases, specifically scientific / academic / teaching <br></li>
</ul>
<hr>
<h4 id="heading"></h4>
]]></content:encoded>
    </item>
    
    <item>
      <title>Last Call for Q2 2026 Funding Survey</title>
      <link>https://www.clojuriststogether.org/news/last-call-for-q2-2026-funding-survey/</link>
      <pubDate>Mon, 16 Feb 2026 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/last-call-for-q2-2026-funding-survey/</guid>
      <description>We Need Your Input</description>
      <content:encoded><![CDATA[<p>Greetings Clojurists!</p>
<p>We are about to close our Q2 2026 Funding Survey which helps inform our Q2 project awards. It is not a heavy lift - maybe 5 minutes of your time.  But your input is invaluable! A link to the survey was sent to your email in the last few weeks - and just in case it made its way to spam, you can look for &ldquo;We Need Your Input - Q2 2026 Funding&rdquo;. The survey closes midnight PST on February 21, 2026.</p>
<p>Thanks as always for your support of Clojurists Together and for being a part of this awesome community.</p>
<p>Any questions, please email me at <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a></p>
<p>Kathy Davis
Program Manager
Clojurists Together Foundation</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojars Maintenance and Support: November/December 2025 Update</title>
      <link>https://www.clojuriststogether.org/news/clojars-maintenance-and-support-november/december-2025-update/</link>
      <pubDate>Sun, 25 Jan 2026 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojars-maintenance-and-support-november/december-2025-update/</guid>
      <description>Toby Crawley Reports on Clojars logs, fixes, and updates</description>
      <content:encoded><![CDATA[<h2 id="critical-infrastructure-clojars-maintentance-and-support-update-by-toby-crawley">Critical Infrastructure: Clojars Maintentance and Support Update by Toby Crawley</h2>
<p>November-December, 2025. Published January 24, 2026</p>
<p>This is an update on the work I&rsquo;ve done maintaining <a href="https://clojars.org">Clojars</a> in November and December of 2025.<br>
Most of my work on Clojars is reactive, based on issues reported through the community or noticed through monitoring.</p>
<p><strong>If you have any issues or questions about Clojars,</strong> you can find me in the <a href="https://clojurians.slack.com/archives/C0H28NMAS"><code>#clojars</code> channel on the Clojurians Slack</a>, or you can file an issue on the <a href="https://github.com/clojars/clojars-web/issues/new/choose">main Clojars GitHub repository</a>.</p>
<p>You can see the <a href="https://github.com/clojars/clojars-web/blob/main/CHANGELOG.org">CHANGELOG</a> for notable changes, and see all commits in the <a href="https://github.com/clojars/clojars-web/compare/d46668f0e1f535f803ae2b8e110ffcef5ab9f124...6008d9b73add2c38c0c738eb47203be9b01278cc"><code>clojars-web</code></a> and <a href="https://github.com/clojars/infrastructure/commit/48ddd9c5968d306b2d539473b32a024f9ef80e93"><code>infrastructure</code></a> repositories for this period. I also <a href="https://tcrawley.org/clojars-worklog/">track my work</a> over the years for Clojurists Together (and, before that, the <a href="https://sfconservancy.org/">Software Freedom Conservancy</a>.</p>
<p>Below are some highlights for work done in November and December:</p>
<ul>
<li>I did lots of dependency upgrades, based on an <a href="https://github.com/liquidz/antq"><code>antq</code></a> task I added to the project.</li>
<li>I <a href="https://github.com/clojars/clojars-web/commit/1c950b45c2d24cb230cd033f3a13940968633ba4">fixed a bug where would still try do generate an email for an address in the denylist</a>, which resulted in an NPE and noise in Sentry.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Annually-Funded Developers&#39; Update: November and December 2025</title>
      <link>https://www.clojuriststogether.org/news/annually-funded-developers-update-november-and-december-2025/</link>
      <pubDate>Tue, 20 Jan 2026 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/annually-funded-developers-update-november-and-december-2025/</guid>
      <description>Dragan Djuric, Eric Dallo, Michiel Borkent, Oleksandr Yakushev, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Hello Fellow Clojurists!</p>
<p>This is the sixth and final report from the 5 developers who received Annual Funding in 2025. You can review their reports from throughout the year here:</p>
<p><a href="https://www.clojuriststogether.org/news/annually-funded-developers-update-jan./feb.-2025/">Jan/Feb 2025</a><br>
<a href="https://www.clojuriststogether.org/news/annually-funded-developers-update-mar./april-2025/">March/April 2025</a> <br>
<a href="https://www.clojuriststogether.org/news/annually-funded-developers-update-may/june-2025/">May/June 2025</a><br>
<a href="https://www.clojuriststogether.org/news/annually-funded-developers-update-july/august-2025/">July/Aug 2025</a> <br>
<a href="https://www.clojuriststogether.org/news/annually-funded-developers-update-september/october-2025/">Sept/Oct 2025</a></p>
<p>Thanks everyone for the fantastic work!</p>
<p><a href="#dragan-djuric">Dragan Djuric</a>: Neanderthal, Deep Diamond, Diamond ONNX Runtime<br>
<a href="#eric-dallo">Eric Dallo</a>: ECA, clojure-lsp<br>
<a href="#michiel-borkent">Michiel Borkent</a>: clj-kondo, Reagami, Squint, babashka, SCI, and more&hellip;<br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>: CIDER nREPL, Orchard, clj-async-profiler, Virgil<br>
<a href="#peter-taoussanis">Peter Taoussanis</a>: Telemere, Tufte, Sente, Tempel, Carmine, Trove    <br>
<br>
<br></p>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>2025 Annual Funding Report 6. Published January 4, 2026.</p>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpus) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>Having achieved a lot of the goals for this project in 2025 in the previous 10 months,
in this funding period, my main effort was concentrated on the icing on the cake.</p>
<ul>
<li>I improved support for various data types in Deep Diamond (including :double)</li>
<li>improved the implementation of the info method in DD</li>
<li>released Deep Diamond 0.41.0</li>
<li>improved cuda handling of :long descriptors</li>
<li>extended Neanderthal Vector with the support for Tensor protocols,</li>
<li>extended Neanderthal Matrix with the support for Tensor protocols,</li>
<li>simplified the code in various places,</li>
<li>wrote new tests,</li>
<li>GE matrices are now also tensors</li>
<li>fixed the transfer support for integer matrices</li>
<li>implementated integer kernels for vectors and GE matrices in CUDA,</li>
<li>updated Apple BNNS tensor to be compatible with the changes in the last 3-4 months,</li>
<li>fixed leftover reflections in the old BNNS-based engine in DD</li>
<li>released Neanderthal 0.60.0,</li>
<li>released Deep Diamond 0.42.0,</li>
<li>Update upstream onnxruntime to 1.23.2, also build it locally with CUDA to update diamond-onnxrt,</li>
<li>released diamond-onnxrt 0.21.0</li>
</ul>
<p>I released several new versions of Uncomplicate libraries with these user-facing improvements including:</p>
<ul>
<li>Deep Diamond</li>
<li>Neanderthal</li>
<li>Diamond ONNX Runtime</li>
</ul>
<p>Hammock time. Did some research on LLMs and the future Clojure implementation of high-level LLMs based on Diamond ONNX Runtime</p>
<p>I also wrote a tutorial on dragan.rocks. I had plans to write more, but couldn&rsquo;t find time and energy, since December was especially full with lectures at the university, and I did not want to risk burnout :)  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>2025 Annual Funding Report 6. Published January 6, 2026.</p>
<p>What a year! This was probably the year that I most commited and worked in some many things for Clojure community, all of that thanks to ClojuristsTogether, thank you very much!
In November I met so many people at ClojureConj that I work for 5 years and never met personally, it was a very good feeling to talk about so many subjects, projects, and hear about the best people in Clojure community. Check it out the picture with the biggest names in developer tooling for Clojure!</p>
<p><img width="684" height="385" alt="image" src="https://github.com/user-attachments/assets/6a1b295d-9721-4e39-a7c6-81a1126a3211" /></p>
<p>(From left to right: Eric Dallo, Rich Hickey, Peter Strömberg, Michiel Borkent, and Arthur Fücher)</p>
<p>I spent some time preparing my talk that I gave there about ECA which should be available soon for anyone interested.</p>
<h3 id="ecahttpsgithubcomeditor-code-assistanteca"><a href="https://github.com/editor-code-assistant/eca">eca</a></h3>
<p><strong>ECA is growing even faster</strong>, with more people using, testing, finding bugs, asking for features, and **I&rsquo;m confident to say that after 6 months, ECA is a tool as good comparing with big players in the market, being free, OSS, written in Clojure and so much extensible, I&rsquo;m really happy with the result so far and there are so many ideas and improvements I wanna do next year thanks to community sponsor and support!</p>
<h4 id="0782---0872">0.78.2 - 0.87.2</h4>
<ul>
<li>Add workspaces to <code>/doctor</code></li>
<li>Improve LLM request logs to include headers.</li>
<li>Add <code>openai/gpt-5.1</code> to default models.</li>
<li>Fix regression exceptions on specific corner cases with log obfuscation.</li>
<li>Fix absolute paths being interpreted as commands. #199</li>
<li>Remove non used sync models code during initialize. #100</li>
<li>Fix system prompt to mention the user workspace roots.</li>
<li>Improve system prompt to add project env context.</li>
<li>Add support to rollback messages via <code>chat/rollback</code> and <code>chat/clear</code> messages. #42</li>
<li>Add new models to GitHub config (Gpt 5.1 and Opus 4.5).</li>
<li>Update anthropic default models to include opus-4.5</li>
<li>Update anthropic default models to use alias names.</li>
<li>Fix binary for macos amd64. #217</li>
<li>Support rollback file changes done by <code>write_file</code>, <code>edit_file</code> and <code>move_file</code>. #218</li>
<li>Improve rollback to keep consistent UI before the rollback, fixing tool names and user messages.</li>
<li>Support nested folder for rules and commands. #220</li>
<li>Fix custom tools output to return stderr when tool error. #219</li>
<li>Support dynamic string parse (<code>${file:/path/to/something}</code> and <code>${env:MY_ENV}</code>) in all configs with string values. #200</li>
<li>Improve <code>/compact</code> UI in chat after running, cleaning chat and showing the new summary.</li>
<li>Better config values dynamic string parse:
<ul>
<li>Support <code>${classapath:path/to/eca/classpath/file}</code> in dynamic string parse.</li>
<li>Support <code>${netrc:api.foo.com}</code> in dynamic string parse to parse keys. #200</li>
<li>Support default env values in <code>${env:MY_ENV:default-value}</code>.</li>
<li>Support for ECA_CONFIG and custom config file.</li>
</ul>
</li>
<li>Deprecate configs:
<ul>
<li><code>systemPromptFile</code> in favor of <code>systemPrompt</code> using <code>${file:...}</code> or <code>${classpath:...}</code></li>
<li><code>urlEnv</code> in favor of <code>url</code> using <code>${env:...}</code></li>
<li><code>keyEnv</code> in favor of <code>key</code> using <code>${env:...}</code></li>
<li><code>keyRc</code> in favor of <code>key</code> using <code>${netrc:...}</code></li>
<li><code>compactPromptFile</code> in favor of <code>compactPrompt</code> using <code>${classpath:...}</code></li>
</ul>
</li>
<li>Fix <code>${netrc:...} </code> to consider <code>:netrcFile</code> config.</li>
<li>Fix <code>${netrc:...} </code> to consider <code>:netrcFile</code> config properly.</li>
<li>Enhanced hooks documentation with new types (sessionStart, sessionEnd, chatStart, chatEnd), JSON input/output schemas, execution options (timeout)</li>
<li>Fix custom tools to support argument numbers.</li>
<li>Improve read_file summary to mention offset being read.</li>
<li>Enhanced hooks documentation with new types (sessionStart, sessionEnd, chatStart, chatEnd), JSON input/output schemas, execution options (timeout)</li>
<li>Support rollback only messages, tool call changes or both in <code>chat/rollback</code>.</li>
<li>Fix backwards compatibility for chat rollback.</li>
<li>Support <code>providers &lt;provider&gt; httpClient version</code> config, allowing to use http-1.1 for some providers like lmstudio. #229</li>
<li>Support <code>openai/gpt-5.2</code> and <code>github-copilot/gpt-5.2</code> by default.</li>
<li>Improve agent behavior prompt to mention usage of editor_diagnostics tool. #230</li>
<li>Use selmer syntax for prompt templates.</li>
<li>Support Google Gemini thought signatures.</li>
<li>Support <code>gemini-3-pro-preview</code> and <code>gemini-3-flash-preview</code> models in Google and Copilot providers.</li>
<li>Fix deepseek reasoning with openai-chat API #228</li>
<li>Support <code>~</code> in dynamic string parser.</li>
<li>Support removing nullable values from LLM request body if the value in extraPayload is null. #232</li>
<li>Improve read-file summary to show final range properly.</li>
<li>Improve model capabilities for providers which model name has slash: <code>my-provider/anthropic/my-model</code></li>
<li>Fix openai-chat tool call + support for Mistral API #233</li>
<li>Skip missing/unreadable @file references when building context</li>
<li>Fix regression: /compact not working for some models. Related to #240</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>We finally support vertical alignment in clojure-lsp format via cljfmt, one of the most requested features!<br>
I started a sequence of lots of outdated bumps which fixed some issues and intend to finish on the next release as some break tests and some existing features.
Also, we had some new features like squint projects support!</p>
<h4 id="20251128-124743">2025.11.28-12.47.43</h4>
<ul>
<li>New keywords completion inside namespaced maps. #2113</li>
<li>Pass current namespace aliases to cljfmt when range-formatting. #2129</li>
<li>bump clj-kondo to <code>2025.10.24-20251120.193408-8</code> improving performance, fixing false-positives and supporting java inner classes.</li>
<li>Bump cljfmt to <code>0.15.5</code> - adding support for vertical alignment.</li>
<li>Support <code>squint</code> projects when having <code>squint.edn</code>. #2158</li>
<li>Support find definition of java inner classes (Foo$Bar). #2157</li>
<li>Bump babashka/fs to <code>0.5.28</code>.</li>
<li>Bump opentelemetry to <code>1.51.0</code>.  <br></li>
</ul>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>2025 Annual Funding Report 6. Published January 6, 2026.</p>
<p>In this post I&rsquo;ll give updates about open source I worked on during November and December 2025.</p>
<p>To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work
possible. Without you, the below projects would not be as mature or wouldn&rsquo;t
exist or be maintained at all! So a sincere thank you to everyone who
contributes to the sustainability of these projects.</p>
<img alt="gratitude" src="https://emoji.slack-edge.com/T03RZGPFR/gratitude/f8716bb6fb7e5249.png" width="30px" text-align="center">  
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br">Nubank</a></li>
</ul>
<p>Open the details section for more info about sponsoring.</p>
<details>
<summary>Sponsor info</summary>
<p>If you want to ensure that the projects I work on are sustainably maintained,
you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babashka</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
</details>
<!--

- ls -lat ~/dev
- babashka sub dir checken

-->  
<h3 id="updates">Updates</h3>
<h3 id="clojure-conj-2025">Clojure Conj 2025</h3>
<p>Last November I had the honor and pleasure to visit the Clojure Conj 2025. I met
a host of wonderful and interesting long-time and new Clojurians, many that I&rsquo;ve
known online for a long time and now met for the first time. It was especially exciting to finally meet Rich Hickey and talk to him during a meeting about Clojure dialects and Clojure tooling. The talk that I gave there: &ldquo;Making tools developers actually use&rdquo; will come online soon.</p>
<img src="https://photos.clojure-conj.org/uploads/medium2x/21/bb/eee18492f42518506f78b0f48587.jpg" width="80%" align="center" alt="presentation at Dutch Clojure meetup">
<p>(From left to right: Steven Lombardi, Eric Dallo, Rich Hickey, Peter Strömberg, Michiel Borkent, Burin Choomnuan, and Arthur Fücher).</p>
<h3 id="babashka-conf-and-dutch-clojure-days-2026">Babashka conf and Dutch Clojure Days 2026</h3>
<p>In 2026 I&rsquo;m organizing Babashka Conf 2026. It will be an afternoon event (13:00-17:00) hosted in the Forum hall of the beautiful public library of Amsterdam.
More information <a href="https://babashka.org/conf/">here</a>. Get your ticket via <a href="https://www.meetup.com/the-dutch-clojure-meetup/events/312079164/">Meetup.com</a> (currently there&rsquo;s a waiting list, but more places will come available once speakers are confirmed). CfP will open mid January.
The day after babashka conf, Dutch Clojure Days 2026 will be happening. It&rsquo;s not too late to get your talk proposal in. More info <a href="https://clojuredays.org/">here</a>.</p>
<h3 id="clojurists-together-long-term-funding">Clojurists Together: long term funding</h3>
<p>I&rsquo;m happy to announce that I&rsquo;m among the 5 developers that were granted Long term support for 2026. Thanks to all who voted! Read the announcement <a href="https://www.clojuriststogether.org/news/clojurists-together-2026-annual-funding-announcement/">here</a>.</p>
<h3 id="projects">Projects</h3>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months in detail.</p>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Bump <code>process</code> to <code>0.6.25</code></li>
<li>Bump <code>deps.clj</code></li>
<li>Fix #1901: add <code>java.security.DigestOutputStream</code></li>
<li>Redefining namespace with <code>ns</code> should override metadata</li>
<li>Bump <code>nextjournal.markdown</code> to <code>0.7.222</code></li>
<li>Bump <code>edamame</code> to <code>1.5.37</code></li>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1899">#1899</a>: <code>with-meta</code> followed by <code>dissoc</code> on records no longer works</li>
<li>Bump <code>fs</code> to <code>0.5.30</code></li>
<li>Bump <code>nextjournal.markdown</code> to <code>0.7.213</code></li>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1882">#1882</a>: support for reifying <code>java.time.temporal.TemporalField</code> (<a href="https://github.com/EvenMoreIrrelevance">@EvenMoreIrrelevance</a>)</li>
<li>Bump Selmer to <code>1.12.65</code></li>
<li>SCI: <code>sci.impl.Reflector</code> was rewritten into Clojure</li>
<li><code>dissoc</code> on record with non-record field should return map instead of record</li>
<li>Bump edamame to <code>1.5.35</code></li>
<li>Bump <code>core.rrb-vector</code> to <code>0.2.0</code></li>
<li>Migrate detecting of executable name for self-executing uberjar executable from <code>ProcessHandle</code> to to native image <code>ProcessInfo</code> to avoid sandbox errors</li>
<li>Bump <code>cli</code> to <code>0.8.67</code></li>
<li>Bump <code>fs</code> to <code>0.5.29</code></li>
<li>Bump <code>nextjournal.markdown</code> to <code>0.7.201</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting</p>
<ul>
<li>Add support for <code>:refer-global</code> and <code>:require-global</code></li>
<li>Add <code>println-str</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/997">#997</a>: Var is mistaken for local when used under the same name in a <code>let</code> body</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/1001">#1001</a>: JS interop with reserved js keyword fails (regression of <a href="https://github.com/babashka/sci/issues/987">#987</a>)</li>
<li><code>sci.impl.Reflector</code> was rewritten into Clojure</li>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1886">babashka/babashka#1886</a>: Return a map when dissociating a
record basis field.</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/1011">#1011</a>: reset ns metadata when evaluating ns form multiple times</li>
<li>Fix for <a href="https://github.com/babashka/babashka/issues/1899">https://github.com/babashka/babashka/issues/1899</a></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/1010">#1010</a>: add <code>js-in</code> in CLJS</li>
<li>Add <code>array-seq</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.<br></p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2600">#2600</a>: NEW linter: <code>unused-excluded-var</code> to warn on unused vars in <code>:refer-clojure :exclude</code> (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2459">#2459</a>: NEW linter: <code>:destructured-or-always-evaluates</code> to warn on s-expressions in <code>:or</code> defaults in map destructuring (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li>Add type checking support for <code>sorted-map-by</code>, <code>sorted-set</code>, and <code>sorted-set-by</code> functions
(<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li>Add new type <code>array</code> and type checking support for the next functions: <code>to-array</code>, <code>alength</code>,
<code>aget</code>, <code>aset</code> and <code>aclone</code> (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2696">#2695</a>: false positive <code>:unquote-not-syntax-quoted</code> in leiningen&rsquo;s <code>defproject</code></li>
<li>Leiningen&rsquo;s <code>defproject</code> behavior can now be configured using <code>leiningen.core.project/defproject</code></li>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2699">#2699</a>: fix false positive unresolved string var with extend-type on CLJS</li>
<li>Rename <code>:refer-clojure-exclude-unresolved-var</code> linter to <code>unresolved-excluded-var</code> for consistency</li>
<li>v2025.12.23</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2654">#2654</a>: NEW linter: <code>redundant-let-binding</code>, defaults to <code>:off</code> (<a href="https://github.com/tomdl89">@tomdl89</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2653">#2653</a>: NEW linter: <code>:unquote-not-syntax-quoted</code> to warn on <code>~</code> and <code>~@</code> usage outside syntax-quote (<code>`</code>) (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2613">#2613</a>: NEW linter: <code>:refer-clojure-exclude-unresolved-var</code> to warn on non-existing vars in <code>:refer-clojure :exclude</code> (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2668">#2668</a>: Lint <code>&amp;</code> syntax errors in let bindings and lint for trailing <code>&amp;</code> (<a href="https://github.com/tomdl89">@tomdl89</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2590">#2590</a>: <code>duplicate-key-in-assoc</code> changed to <code>duplicate-key-args</code>, and now lints <code>dissoc</code>, <code>assoc!</code> and <code>dissoc!</code> too (<a href="https://github.com/tomdl89">@tomdl89</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2651">#2651</a>: resume linting after paren mismatches</li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/issues/2157">clojure-lsp#2651</a>: Fix inner class name for java-class-definitions.</li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/issues/2157">clojure-lsp#2651</a>: Include inner class java-class-definition analysis.</li>
<li>Bump <code>babashka/fs</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2532">#2532</a>: Disable <code>:duplicate-require</code> in <code>require</code> + <code>:reload</code> / <code>:reload-all</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2432">#2432</a>: Don&rsquo;t warn for <code>:redundant-fn-wrapper</code> in case of inlined function</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2599">#2599</a>: detect invalid arity for invoking collection as higher order function</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2661">#2661</a>: Fix false positive <code>:unexpected-recur</code> when <code>recur</code> is used inside <code>clojure.core.match/match</code> (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2617">#2617</a>: Add types for <code>repeatedly</code> (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li>Add <code>:ratio</code> type support for <code>numerator</code> and <code>denominator</code> functions (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2676">#2676</a>: Report unresolved namespace for namespaced maps with unknown aliases (<a href="https://github.com/jramosg">@jramosg</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2683">#2683</a>: data argument of <code>ex-info</code> may be nil since clojure 1.12</li>
<li>Bump built-in ClojureScript analysis info</li>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2687">#2687</a>: support new <code>:refer-global</code> and <code>:require-global</code> ns options in CLJS</li>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2544">#2554</a>: support inline configs in <code>.cljc</code> files</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/edamame">edamame</a>: configurable EDN and Clojure parser with location metadata and more<br>
Edamame: configurable EDN and Clojure parser with location metadata and more</p>
<ul>
<li>Minor: leave out <code>:edamame/read-cond-splicing</code> when not splicing</li>
<li>Allow <code>:read-cond</code> function to override <code>:edamame/read-cond-splicing</code> value</li>
<li>The result from <code>:read-cond</code> with a function should be spliced. This behavior differs from <code>:read-cond</code> + <code>:preserve</code> which always returns a reader conditional object which cannot be spliced.</li>
<li>Support function for <code>:features</code> option to just select the first feature that occurs</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li>Allow macro namespaces to load <code>&quot;node:fs&quot;, etc.</code> to read config files for conditional compilation</li>
<li>Don&rsquo;t emit IIFE for top-level let so you can write <code>let</code> over <code>defn</code> to capture values.</li>
<li>Fix <code>js-yield</code> and <code>js-yield*</code> in expression position</li>
<li>Implement <code>some?</code> as macro</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/758">#758</a>: <code>volatile!</code>, <code>vswap!</code>, <code>vreset!</code></li>
<li><code>pr-str</code>, <code>prn</code> etc now print EDN (with the idea that you can paste it back into your program)</li>
<li>new <code>#js/Map</code> reader that reads a JavaScript <code>Map</code> from a Clojure map (maps are printed like this with <code>pr-str</code> too)</li>
<li>Support passing keyword to <code>mapv</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/759">#759</a>: <code>doseq</code> can&rsquo;t be used in expression context</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/753">#753</a>: optimize output of dotimes</li>
<li><code>alength</code> as macro</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/reagami">reagami</a>: A minimal zero-deps Reagent-like for Squint and CLJS</p>
<ul>
<li>Performance enhancements</li>
<li>treat <code>innerHTML</code> as a property rather than an attribute</li>
<li>Drop support for camelCased properties / (css) attributes</li>
<li>Fix <code>:default-value</code> in input range</li>
<li>Support data param in <code>:on-render</code></li>
<li>Support default values for uncontrolled components</li>
<li>Fix child count mismatch</li>
<li>Fix re-rendering/patching of subroots</li>
<li>Add <code>:on-render</code> hook for mounting/updating/unmounting third part JS components</li>
</ul>
</li>
<li>
<p>NEW: <a href="https://github.com/borkdude/parmezan">parmezan</a>: fixes unbalanced or unexpected parens or other delimiters in Clojure files</p>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</p>
<ul>
<li><a href="https://github.com/babashka/cli/issues/126">#126</a>: <code>-</code> value accidentally parsed as option, e.g. <code>--file -</code></li>
<li><a href="https://github.com/babashka/cli/issues/124">#124</a>: Specifying exec fn that starts with hyphen is treated as option</li>
<li>Drop Clojure 1.9 support. Minimum Clojure version is now 1.10.3.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>always analyze doc (but not deps) when no-cache is set (#786)</li>
<li>add option to disable inline formulas in markdown (#780)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</p>
<ul>
<li><a href="https://github.com/babashka/scittle/issues/114">#114</a>: Enable source maps (<a href="https://github.com/jeroenvandijk">@jeroenvandijk</a>)</li>
<li><a href="https://github.com/babashka/scittle/issues/140">#140</a>: Enable customizing the nrepl websocket port (<a href="https://github.com/PEZ">@PEZ</a>)</li>
<li>Bump shadow-cljs and SCI</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/markdown">Nextjournal Markdown</a></p>
<ul>
<li>Add config option to avoid TeX formulas</li>
<li>API improvements for passing options</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Fix <code>cherry compile</code> CLI command not receiving file arguments</li>
<li>Bump shadow-cljs to <code>3.3.4</code></li>
<li>Fix <a href="https://github.com/squint-cljs/cherry/issues/163">#163</a>: Add assert to macros (<a href="https://github.com/willcohen">@willcohen</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/cherry/issues/165">#165</a>: Fix ClojureScript protocol dispatch functions (<a href="https://github.com/willcohen">@willcohen</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/cherry/issues/167">#167</a>: Protocol dispatch functions inside IIFEs; bump squint <a href="https://github.com/squint-cljs/squint/commit/db0e3c7b831568a3766e9ade0e2a05490446bfe5">accordingly</a></li>
<li>Fix <a href="https://github.com/squint-cljs/cherry/issues/169">#169</a>: fix <code>extend-type</code> on <code>Object</code></li>
<li>Fix <a href="https://github.com/squint-cljs/cherry/issues/171">#171</a>: Add <code>satisfies?</code> macro (<a href="https://github.com/willcohen">@willcohen</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Released several versions catching up with the clojure CLI</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</p>
<ul>
<li>Fix extra newline in codeblock</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickblog">quickblog</a>: light-weight static blog engine for Clojure and babashka</p>
<ul>
<li>Add support for a blog contained within another website; see <a href="https://github.com/borkdude/quickblog/README.md#serving-an-alternate-content-root">Serving an alternate content root</a> in README.  (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li>Upgrade babashka/http-server to 0.1.14</li>
<li>Fix <code>:blog-image-alt</code> option being ignored when using CLI (<code>bb quickblog render</code>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li><a href="https://github.com/babashka/nbb/issues/395">#395</a>: fix <code>vim-fireplace</code> infinite loop on nREPL session close.</li>
<li>Add <code>ILookup</code> and <code>Cons</code></li>
<li>Add <code>abs</code></li>
<li>nREPL: support <code>&quot;completions&quot;</code> op</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects.<br></p>
<ul>
<li>neil.el - a hook that runs after finding a package (<a href="https://github.com/agzam">@agzam</a>)</li>
<li>neil.el - adds a function for injecting a found package into current CIDER session (<a href="https://github.com/agzam">@agzam</a>)</li>
<li><a href="https://github.com/babashka/neil/issues/245">#245</a>: neil.el - neil-executable-path now can be set to <code>clj -M:neil</code></li>
<li><a href="https://github.com/babashka/neil/issues/251">#251</a>: Upgrade library deps-new to 0.10.3</li>
<li><a href="https://github.com/babashka/neil/issues/255">#255</a>: update maven search URL</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li><a href="https://github.com/babashka/fs/issues/154">#154</a> reflect in directory check and docs that <code>move</code> never follows symbolic links (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/181">#181</a> <code>delete-tree</code> now deletes broken symbolic link <code>root</code> (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/193">#193</a> <code>create-dirs</code> now recognizes sym-linked dirs on JDK 11 (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/184">#184</a>: new check in <code>copy-tree</code> for copying to self too rigid</li>
<li><a href="https://github.com/babashka/fs/issues/165">#165</a>: <code>zip</code> now excludes <code>zip-file</code> from <code>zip-file</code> (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/167">#167</a>: add <code>root</code> fn which exposes <code>Path</code> <code>getRoot</code> (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/166">#166</a>: <code>copy-tree</code> now fails fast on attempt to copy parent to child (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/152">#152</a>: an empty-string path <code>&quot;&quot;</code> is now (typically) understood to be the current working directory (as per underlying JDK file APIs) (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/155">#155</a>: <code>fs/with-temp-dir</code> clj-kondo linting refinements (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/162">#162</a>: <code>unixify</code> no longer expands into absolute path on Windows (potentially BREAKING)</li>
<li>Add return type hint to <code>read-all-bytes</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</p>
<ul>
<li><a href="https://github.com/babashka/process/issues/181">#181</a>: support <code>:discard</code> or <code>ProcessBuilder$Redirect</code> as <code>:out</code> and <code>:err</code> options</li>
</ul>
</li>
</ul>
<p>Contributions to third party projects:</p>
<ul>
<li><a href="https://github.com/clojure/clojurescript">ClojureScript</a>
<ul>
<li>CLJS-3466: support qualified method in return position</li>
<li>CLJS-3468: :refer-global should not make unrenamed object available</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity
happened in the past month.</p>
<details>
<summary>Click for more details</summary>
- [pod-babashka-go-sqlite3](https://github.com/babashka/pod-babashka-go-sqlite3): A babashka pod for interacting with sqlite3  <br>  
- [unused-deps](https://github.com/borkdude/unused-deps): Find unused deps in a clojure project  <br>  
- [pod-babashka-fswatcher](https://github.com/babashka/pod-babashka-fswatcher): babashka filewatcher pod  <br>  
- [sci.nrepl](https://github.com/babashka/sci.nrepl): nREPL server for SCI projects that run in the browser  <br>  
- [babashka.nrepl-client](https://github.com/babashka/nrepl-client)  <br>  
- [http-server](https://github.com/babashka/http-server): serve static assets  <br>  
- [nbb](https://github.com/babashka/nbb): Scripting in Clojure on Node.js using SCI  <br>  
- [sci.configs](https://github.com/babashka/sci.configs): A collection of ready to be used SCI configs.  <br>  
- [http-client](https://github.com/babashka/http-client): babashka's http-client  <br>  
- [html](https://github.com/borkdude/html): Html generation library inspired by squint's html tag  <br>  
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Use instaparse from babashka  <br> 
- [sql pods](https://github.com/babashka/babashka-sql-pods): babashka pods for SQL databases  <br> 
- [rewrite-edn](https://github.com/borkdude/rewrite-edn): Utility lib on top of  <br> 
- [rewrite-clj](https://github.com/clj-commons/rewrite-clj): Rewrite Clojure code and edn  <br> 
- [tools-deps-native](https://github.com/babashka/tools-deps-native) and [tools.bbuild](https://github.com/babashka/tools.bbuild): use tools.deps directly from babashka  <br> 
- [bbin](https://github.com/babashka/bbin): Install any Babashka script or project with one command  <br> 
- [qualify-methods](https://github.com/borkdude/qualify-methods)  <br> 
  - Initial release of experimental tool to rewrite instance calls to use fully 
    qualified methods (Clojure 1.12 only)  <br>  
- [tools](https://github.com/borkdude/tools): a set of [bbin](https://github.com/babashka/bbin/) installable scripts  <br> 
- [babashka.json](https://github.com/babashka/json): babashka JSON library/adapter  <br>  
- [speculative](https://github.com/borkdude/speculative)  <br>  
- [squint-macros](https://github.com/squint-cljs/squint-macros): a couple of
  macros that stand-in for 
  [applied-science/js-interop](https://github.com/applied-science/js-interop)
  and [promesa](https://github.com/funcool/promesa) to make CLJS projects
  compatible with squint and/or cherry.  <br>  
- [grasp](https://github.com/borkdude/grasp): Grep Clojure code using clojure.spec regexes  <br>  
- [lein-clj-kondo](https://github.com/clj-kondo/lein-clj-kondo): a leiningen plugin for clj-kondo  <br>  
- [http-kit](https://github.com/http-kit/http-kit): Simple, high-performance event-driven HTTP client+server for Clojure.  <br> 
- [babashka.nrepl](https://github.com/babashka/babashka.nrepl): The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs  <br> 
- [jet](https://github.com/borkdude/jet): CLI to transform between JSON, EDN, YAML and Transit using Clojure  <br>  
- [lein2deps](https://github.com/borkdude/lein2deps): leiningen to deps.edn converter  <br>  
- [cljs-showcase](https://github.com/borkdude/cljs-showcase): Showcase CLJS libs using SCI  <br> 
- [babashka.book](https://github.com/babashka/book): Babashka manual  <br>  
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure).  <br>  
- [gh-release-artifact](https://github.com/borkdude/gh-release-artifact): Upload artifacts to Github releases idempotently <br>  
- [carve](https://github.com/borkdude/carve) - Remove unused Clojure vars   <br>  
- [4ever-clojure](https://github.com/oxalorg/4ever-clojure) - Pure CLJS version of 4clojure, meant to run forever!  <br>  
- [pod-babashka-lanterna](https://github.com/babashka/pod-babashka-lanterna): Interact with clojure-lanterna from babashka  <br> 
- [joyride](https://github.com/BetterThanTomorrow/joyride): VSCode CLJS scripting and REPL (via [SCI](https://github.com/babashka/sci))  <br> 
- [clj2el](https://borkdude.github.io/clj2el/): transpile Clojure to elisp  <br> 
- [deflet](https://github.com/borkdude/deflet): make let-expressions REPL-friendly!  <br> 
- [deps.add-lib](https://github.com/borkdude/deps.add-lib): Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI  <br> 
</details>
<br>
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p>2025 Annual Funding Report 6. Published January 8, 2026.</p>
<p>Hello friends! Here&rsquo;s my update on November-December 2025 Clojurists Together work. I&rsquo;ve dedicated time in equal parts to improving clj-async-profiler and to working on nREPL/CIDER stack.</p>
<h3 id="clj-async-profiler">clj-async-profiler</h3>
<p>I&rsquo;ve released the first beta version of the quite disruptive 2.0.0 release of the profiler. The new version contains a whole new type of graph - a heatgraph - which incorporates time as a separate dimension, and allows constructing on-demand flamegraphs over arbitrary time slices. This new version also migrates from profiles as collapsed TXT files to the industry-standard JFR (Java Flight Recorder) profiles which incorporate more data and are more compact and efficient.</p>
<ul>
<li>Released <code>2.0.0-beta</code> with support for JFR profiler data and heatgraphs.</li>
<li><a href="https://github.com/clojure-goes-fast/clj-async-profiler/issues/45">45</a>: Released version 1.7.0 for the older pre-2.0.0 branch of the profiler to restore compatibility with Linux kernerl 6.17.</li>
</ul>
<h3 id="nrepl">nREPL</h3>
<p>nREPL <a href="https://github.com/nrepl/nrepl/releases/tag/v1.6.0-alpha1">1.6.0-alpha1</a> has been prepared which contains many updates that improve the stability of nREPL and simplify its codebase. nREPL is continually moving towards its original goal of being a simple reliable foundation for other tools to build upon.</p>
<ul>
<li><a href="https://github.com/nrepl/nrepl/pull/403">#403</a>: Fix off by 1 error in CallbackBufferedOutputStream.</li>
<li><a href="https://github.com/nrepl/nrepl/pull/408">#408</a>: Refactor <code>stdin</code> middleware.</li>
<li><a href="https://github.com/nrepl/nrepl/pull/409">#409</a>: Refactor handler construction and middleware application.</li>
</ul>
<h3 id="orchard">Orchard</h3>
<p>Plenty of work has gone into Orchard, mostly on the inspector and doc/Javadoc side. These changes will go into the next named CIDER release.</p>
<ul>
<li><a href="https://github.com/clojure-emacs/orchard/pull/362">#362</a>: Info: don&rsquo;t crash if symbol contains $ or /.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/363">#363</a>: Inspector: show duplicates in analytics.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/365">#365</a>: Inspector: don&rsquo;t datafy vars.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/367">#367</a>: Inspector: pretty-print arrays distinctively from vectors.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/369">#369</a>: Inspector: group methods by declaring class.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/370">#370</a>: Inspector: dedicated view for methods.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/371">#371</a>: Inspector: analytics improvements.</li>
<li><a href="https://github.com/clojure-emacs/orchard/pull/368">#368</a>: Print: correctly render empty records.</li>
</ul>
<h3 id="cider-nrepl">cider-nrepl</h3>
<p>Here I worked on the dependency footprint of the library. Cider-nrepl has many dependencies and a complicated solution to managing and shading them.</p>
<ul>
<li><a href="https://github.com/clojure-emacs/cider-nrepl/pull/956">#956</a>: [ci] Include nrepl dependency into releases again.</li>
<li><a href="https://github.com/clojure-emacs/cider-nrepl/pull/959">#959</a>: Stop shading Compliment and clj-reload.</li>
</ul>
<h3 id="virgil">Virgil</h3>
<p>Released Virgil 0.5.1.</p>
<ul>
<li><a href="https://github.com/clj-commons/virgil/pull/45">#45</a>: Address reflection warnings.</li>
<li><a href="https://github.com/clj-commons/virgil/pull/46">#46</a>: Enable linting on CI.  <br></li>
</ul>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>2025 Annual Funding Report 6. Published January 9, 2026.</p>
<p>Hi everyone 👋</p>
<p>Another year behind us! I hope everyone had a peaceful break, and managed to get some quality time with family/friends/pets ^^</p>
<p>2025 was a productive year for my Clojure projects with &gt;36 non-trivial <a href="https://www.taoensso.com/news#2025">library releases</a> and one <a href="https://youtu.be/IlV8R6k8XvY">talk</a> (&ldquo;Effective Open Source Maintenance Maintenance&rdquo;).</p>
<p><strong>Some highlights included:</strong></p>
<ul>
<li><a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0">Telemere v1</a> (now at <a href="https://github.com/taoensso/telemere/releases/tag/v1.2.1">v1.2.1</a>) - Structured logs and telemetry for Clj+s</li>
<li><a href="https://github.com/taoensso/tempel/releases/tag/v1.0.0">Tempel v1</a> (now at <a href="https://github.com/taoensso/tempel/releases/tag/v1.1.0">v1.1</a>) - Data security framework for Clj</li>
<li><a href="https://github.com/taoensso/trove/releases/tag/v1.0.0">Trove v1</a> (now at <a href="https://github.com/taoensso/trove/releases/tag/v1.1.0">v1.1</a>) - Modern logging facade for Clj+s</li>
<li><a href="https://github.com/taoensso/tufte/releases/tag/v3.0.0">Tufte v3</a> - Simple performance monitoring library for Clj+s</li>
<li><a href="https://github.com/taoensso/sente/releases/tag/v1.21.0">Sente v1.21</a> - Realtime web comms library for Clj+s</li>
<li><a href="https://github.com/taoensso/truss/releases/tag/v2.0.0">Truss v2</a> (now at <a href="https://github.com/taoensso/truss/releases/tag/v2.3.0">v2.3</a>) - Micro toolkit for Clj+s errors</li>
<li><a href="https://github.com/http-kit/http-kit/releases/tag/v2.9.0-beta1">http-kit v2.9b1</a> (now at <a href="https://github.com/http-kit/http-kit/releases/tag/v2.9.0-beta3">beta3</a>) - Fast HTTP client+server for Clj</li>
<li><a href="https://github.com/taoensso/carmine/releases/tag/v3.5.0">Carmine v3.5</a> - Redis client + message queue for Clj</li>
</ul>
<p>My main unifying themes for the year were <strong>observability</strong> and <strong>documentation</strong>. I&rsquo;m pretty happy now with the combo of Telemere, Trove, Tufte, and Truss. These work well together as a sort of opinionated <strong>observability suite</strong> for serious Clojure applications. And I think that together they offer a pretty compelling demonstration of some of the kinds of real-world advantages Clojure can offer people trying to get things done at scale.</p>
<p>As always, a very big and warm <em>thank you</em> to the many users and contributors that helped patiently test, give feedback, report bugs, and offer improvements over the year. The Clojure community has always been and continues to be a special one ❤️</p>
<p>Likewise a big thank you to the companies and folks (incl. <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a>) that have helped support my OSS work financially! It&rsquo;s been great being able to dedicate so much time to open source, and it&rsquo;s something I feel very grateful to have been able to benefit from 🙏</p>
<p>Those closely following my releases may have noted that I was unusually quiet over Nov/Dec. tl;dr ended up with some unexpected Life stuff coming up that has required the bulk of my attention and energy. So a few releases I had planned for that period will need to wait until later (likely Q2 2026).</p>
<p>Relatedly, I should warn that I might need to deload a little in 2026. Will still be providing maintenance and support as usual, just not sure yet to what extent I&rsquo;ll be able to contribute the usual amount of attention to substantial greenfield work.</p>
<p>I&rsquo;m in Clojure for the long haul, and will continue to be present and as active as I&rsquo;m able- things may just be a little bit more unpredictable on my side for the next few months as I see how next developments play out.</p>
<p>Best wishes to everyone for the new year, and much love to you all! 🫶</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Thanks..and more</title>
      <link>https://www.clojuriststogether.org/news/thanks..and-more/</link>
      <pubDate>Mon, 29 Dec 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/thanks..and-more/</guid>
      <description>$171,000 in project funding - 18 grants, 16 developers</description>
      <content:encoded><![CDATA[<p>As 2025 comes to a close we want to reach out and thank you for supporting Clojure, open-source, and the Clojurists Together community.</p>
<h3 id="weve-been-able-to-accomplish-a-lot-this-year-with-your-support">We’ve been able to accomplish a lot this year with your support.</h3>
<p>In 2025, we funded a total of $171,000 of projects. 10 developers completed 12 shorter-term projects ($66,000 USD). 6 developers received a monthly stipend for the year ($105,000 USD in long-term funding). Since 2018, Clojurists Together has awarded more than $1.2 million to 87 developers working on more than 154 projects.</p>
<p>Your input on our quarterly surveys is critical to ensuring that we are funding work that is needed, valued, and adopted by the community at large. 22% of members participate every quarter.</p>
<p>30% of members participated in the process for selecting the developers to receive 2026 annual funding. Thank you for reviewing the proposals and voting!</p>
<p>We appreciate your subscription to our regular news and updates dispatches - as we believe it encourages wider use of the tools and resources of the developers we have funded - strengthening and advancing the open-source and Clojure community. For those of you who subscribe but are not yet members, <a href="https://www.clojuriststogether.org/developers/">you can always join the voting community for as little as $5 per month.</a>. For those of you who are already members, even a small increase in membership contributions could enable us to fund more projects. Every little bit helps.</p>
<p>We were able to attend the Heart of Clojure/Conj conference in the U.S. in November - and it was great to see and share with so many of you in person!</p>
<h3 id="the-developers-work-we-fund-is-highly-valued---and-used-daily">The developer’s work we fund is highly valued - and used daily.</h3>
<p>In addition to requesting specific tools and improvements, we have heard a consistent call for better documentation (content, presentation, and organization) and more support for engaging and supporting new Clojure users. This year, we received and funded several proposals that focused on these needs and will continue to encourage work in these areas. It is great to see that so many of you refer to and rely on the work the developers have undertaken throughout the year.</p>
<p><img width="652" height="278" alt="image" src="https://github.com/user-attachments/assets/25e5d733-643a-4738-9650-fd696ddade09" />  <br></p>
<h3 id="short-term-projects-funded-in-2025">Short-Term Projects Funded in 2025</h3>
<p><strong>Q2 2025:</strong>   Bling, CALVA, CIDER, Code Combat, Jank, and Scicloj Building Bridges</p>
<p><strong>Q3 2025:</strong> Fastmath, Fireworks, Jank, Malli, Uncomplicate Clojure ML, and Uix</p>
<p><strong>2025 developers receiving annual funding:</strong> Michiel Borkent, Eric Dallo, Dragan Djuric,  Peter Taoussanis, Oleksandr Yakushev, and Toby Crawley (Clojars maintenance and support).</p>
<h3 id="fun-facts-and-thank-yous">Fun Facts and Thank You&rsquo;s</h3>
<p>We are truly an international group bringing a wide range of experience. From Q1 2022 to Q3 2025, we funded developers working in 22 countries including Austria, Belgium, Brazil, Bulgaria, Canada, Denmark, England, Finland, France, Germany, Israel, Lithuania, Netherlands, Norway, Poland, Serbia, South Korea, Spain, Sweden, Ukraine, UK and the US.</p>
<p><strong>This staggering amount of work has benefited our members and the broader Clojurist community.</strong><br>
A thanks goes out to all the developers for their commitment and contributions to the community over the last 8 years: Adam Helins, Alexander Oloo, Ambrose Bonnaire-Sergeant, Arne Brasseur, Ashima Panjwani, Baptiste Dupuch, Benjamin Kamphaus, Ben Brinckerhoff, Bobbi Tower, Bozhidar Batsov, Brandon Ringe, Bruce Hauman, Chris Badahdah, Chris McCormick, Charles Comstock, Chris Oakman, Christian Johansen, Christophe Grand, Dainius Jocas, Daniel Higginbotham, Daniel Slutsky,Danny Freeman, David Levy, David Nolen, Dragan Duric, Eric Dallo, Ethan Miller, Gert Goet, Grodziski, Henry Widd, Iizuka Masashi, Isaac Johnston, Jack Rusher, Jacob O’Bryant, James Reeves, Janet Carr, Jeaye Wilkerson, Jeremiah Coyle, John Collins, John Stevenson, Joakim Tengstrand, Joel Holdbrooks, José Luis Lafuente, Juho Teperi, Karl Pietrzak, Karol Wójcik, Kira McLean, Konrad Kühne, Kury Harringer, L. Jordan Miller, Lee Hinman, Lukas Domagala, Mark Engelberg, Martin Kavalar, Matthew Davidson, Matthew Huebert, Matthew Ratzke, Michael Sappler, Michiel Borkent, Mike Fikes, Mitesh Shah, Nikita Prokopov, Oleksandr Yakushev, Oleksii Kachaiev, Oliver Caldwell, Othman Azil, Peter Stromberg, Peter Taoussanis, Rafael Krzyważnia, Roman Luitikou, Sam Ritchie, Savo Djuric, Sean Corfield, Sebastian Zartner, Siyoung Byun, Thomas Clark, Thomas Heller, Tim Pope, Toby Crawley, Tommi Jalkanen, Tommi Reiman, VEMV, Vladislav Protsenko, William Acton, Zach Oakes, Žygis Medelis, and the team at Gaiwan.</p>
<p>Finally, a shout-out to the companies and organizations who have supported our work throughout the year and most for many years. They believe in Open Source development and have made a commitment to Clojure as an important tool for their product, service, and organizational projects. If your company might consider becoming a sponsoring member, please contact Daniel Compton at <a href="mailto:daniel@clojuriststogether.org">daniel@clojuriststogether.org</a> to explore further.</p>
<p><strong>Thanks to Map, Transduce, and Filter Members:</strong></p>
<p><img width="600" height="336" alt="image" src="https://github.com/user-attachments/assets/58addedb-14b4-4dcb-a500-a62f3fb4a942" /> <br></p>
<br>  
<p><strong>And a shout out to the Into, Cons and Assoc Members who Contributed in 2025!</strong></p>
<p><img width="600" height="337" alt="image" src="https://github.com/user-attachments/assets/68672dc6-59cd-4e12-b12a-e59ac5217bf5" /> <br></p>
<br> 
<p><strong>&hellip; and another thank you to Revenue Share member Jacek Schae (Learn Reagent, Learn re-frame) and all the 2025 Contributing Members.</strong> <a href="https://www.clojuriststogether.org/members/">All of you make this work possible!</a></p>
<p>Let’s join in celebrating this wonderful community - and hoping for peace in the New Year.   <br></p>
<p>lvh, Maria, Daniel C, Heather, Lorelai, Daniel S., Chrisoph (Clojurists Together Board), and Kathy (Program Manager).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>December Q3 2025 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/december-q3-2025-project-updates/</link>
      <pubDate>Mon, 22 Dec 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/december-q3-2025-project-updates/</guid>
      <description>News from Ambrose Bonnaire-Seargent, Thomas Clark, Jeremiah Coyle, Dragan Djuric, and Jeaye Wilkerson</description>
      <content:encoded><![CDATA[<p>As 2025 winds down, we have several Q3 project updates and  a few more  coming in January 2026 as several are on staggered schedules. A brief summary of each project is included to provide overall context. Thanks to everyone for your incredible work on these projects!</p>
<p><a href="#ambrose-bonnaire-seargent-malli">Ambrose Bonnaire-Seargent: Malli</a><br>
Looking back on this project, it started with a proposal for an external analysis pass that could be used to optimize Malli validators. Now at the completion of the funding
period, we&rsquo;re solving the same problem, but instead of an additional tool, we&rsquo;re applying the analysis directly within Malli&rsquo;s validation algorithm.</p>
<p><a href="#thomas-clark-fastmath">Thomas Clark: Fastmath</a><br>
Inasmuch as Lewis Carrol may have creatively objected, complex numbers are now an essential part of modern life: from quantum computing upwards and whether we are aware of it or not. Clojure&rsquo;s support for these numbers however, remains sporadic while it&rsquo;s biggest competitor, the well-known comedy snake - and scripting language <a href="https://www.geeksforgeeks.org/python/history-of-python/">https://www.geeksforgeeks.org/python/history-of-python/</a> treats complex numbers as first-class citizens.</p>
<p>With this funding, I would like to address the issue somewhat, particularly with regard to the implementation of complex matrices, but concerning a consistent complex API more generally.</p>
<p><a href="#jeremiah-coyle-fireworks">Jeremiah Coyle: Fireworks</a></p>
<ul>
<li>Publish Fireworks editor plugins/extensions/integrations for Emacs, VS Code, and IntelliJ. These are fairly simple extensions that involve some basic form rewriting for wrapping/unwrapping forms.</li>
<li>Add support for automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">Chalk</a>. <a href="https://github.com/paintparty/fireworks/issues/42">#42</a></li>
<li>Documentation of interactive workflow.</li>
<li>Enhanced documentation for theme creation.</li>
<li>Call-site options for quick formatting changes. For hifi printing, support call-site option to disable all truncation and ellipsis <a href="https://github.com/paintparty/fireworks/issues/14">#14</a></li>
</ul>
<p><a href="#dragan-djuric-uncomplicate-clojure-ml">Dragan Djuric: Uncomplicate Clojure ML</a><br>
My goal with this funding in Q3 2005 is to develop a new Uncomplicate library, ClojureML.</p>
<ul>
<li>a Clojure developer-friendly API for AI/DL/ML models (in the first iteration based on ONNX Runtime, but later refined to be even more general).</li>
<li>Implement its first backend engine (based on ONNX Runtime).</li>
<li>support relevant operations as Clojure functions.</li>
<li>an extension infrastructure for various future backend implementations.</li>
<li>a clean low-level integration with Uncomplicate, Neanderthal, Deep Diamond and Clojure abstractions.</li>
<li>assorted improvements to Uncomplicate, Neanderthal, Deep Diamond, to support these additions.</li>
<li>develop examples for helping people getting started.</li>
<li>related bugfixes.</li>
<li>TESTS (of course!).</li>
</ul>
<p><a href="#jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</a> <br>
This quarter, I&rsquo;ll be building packages for Ubuntu, Arch, Homebrew, and Nix. I&rsquo;ll be minimizing jank&rsquo;s dependencies, automating builds, filling in test suites for module loading, AOT building, and the Clojure runtime. I&rsquo;ll be working to get the final Clang and LLVM changes I have upstreamed into LLVM 22, adding a health check to jank to diagnose installation issues, and filling in some C++ interop functionality I couldn&rsquo;t get to last quarter.  Altogether, this quarter is going to be a hodgepodge of all of the various tasks needed to get jank shipped.</p>
<h3 id="and-now-for-the-reports--br">AND NOW FOR THE REPORTS!  <br></h3>
<h2 id="ambrose-bonnaire-seargent-malli">Ambrose Bonnaire-Seargent: Malli</h2>
<p>Q3 2025 $9K, Report No. 3, Published December 12, 2025</p>
<p>Looking back on this project, it started with a proposal for an external analysis pass that could be used to optimize Malli validators. Now at the completion of the funding
period, we&rsquo;re solving the same problem, but instead of an additional tool, we&rsquo;re applying the analysis directly within Malli&rsquo;s validation algorithm. This is an excellent improvement, but the stakes are now <em>much</em> higher as we&rsquo;re changing some of the oldest, most foundational code in Malli.</p>
<p>The big news is that recursive validators now <a href="https://github.com/metosin/malli/pull/1245">compile to recursive functions</a>! This is a major optimization, integrated directly into the heart of Malli.</p>
<p>The road to this point started in 2021, where I <a href="https://github.com/metosin/malli/pull/507">prototyped</a> and ultimately&mdash;a year later&mdash;<a href="https://github.com/metosin/malli/pull/677">contributed</a> a subtle enhancement to <code>malli.generator</code> to map recursive schemas onto recursive generators. The main insight: recursive schemas can be detected by finding cycles of Malli refs.</p>
<p>Over the last few months, I knew I needed to really nail <em>why</em> this works before
exploiting it to optimize Malli&rsquo;s validation.</p>
<p>This culminated in a <a href="https://github.com/metosin/malli/pull/1244">simple but clarifying documentation improvement</a> in which we learn something
new about Malli itself.</p>
<p>I&rsquo;ll include it in full here:</p>
<hr>
<h4 id="mutable-registries-are-a-dev-time-abstraction">Mutable registries are a dev-time abstraction</h4>
<p>For performance reasons, Malli heavily caches registry
lookups once a schema has been created via <code>m/schema</code>.</p>
<p>Don&rsquo;t rely on registry mutations to be recognized consistently
unless all schemas are reparsed. Here&rsquo;s a simple example:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>registry*
  (<span style="color:#a6e22e">atom</span> {<span style="color:#e6db74">:int</span> (<span style="color:#a6e22e">m/-int-schema</span>)
         <span style="color:#e6db74">:string</span> (<span style="color:#a6e22e">m/-string-schema</span>)
         <span style="color:#e6db74">::node</span> <span style="color:#e6db74">:int</span>}))

(<span style="color:#66d9ef">def </span>eagerly-cached
  (<span style="color:#a6e22e">m/schema</span> <span style="color:#e6db74">::node</span> {<span style="color:#e6db74">:registry</span> (<span style="color:#a6e22e">mr/mutable-registry</span> registry*)}))

(<span style="color:#a6e22e">swap!</span> registry* assoc <span style="color:#e6db74">::node</span> <span style="color:#e6db74">:string</span>)

(-&gt; eagerly-cached m/deref m/form)
<span style="color:#75715e">;; =&gt; :int</span>
</code></pre></div><p>Even atomic transactions mutating multiple schemas simultaneously in a mutable registry
is not reliable, as a parsed schema may have cached one eagerly, and another lazily, leading to inconsistent results. See <code>malli.core-test/caching-of-mutable-registries-test</code> for demonstration of this phenomenon.</p>
<p>In practice, this is analogous to Clojure&rsquo;s treatment of vars. If a var
is mutated, the most reliable general strategy to recognize the update
is to refresh all namespaces that use that var. Similarly, if a registry is
mutated, the best strategy for recognizing the update in all schemas is to
recreate all schemas.</p>
<hr>
<p>Back to ref cycles, this doc is relevant to recursive schemas because the cycle detection algorithm <em>also</em> breaks in the presence of unprincipled mutating registries.
If we assume registries are immutable for the duration of cycle detection, then the algorithm seems air-tight to me, and so we
went forward with using ref cycles to <a href="https://github.com/metosin/malli/pull/1245">compile to recursive schemas to recursive validators</a>.</p>
<p>Recursive validators are superior to the previous approach because:</p>
<ol>
<li>they can be fully compiled ahead of time</li>
<li>they take constant space relative to their inputs, before it was linear in the maximum depth of the validated input</li>
<li>they only need to compile one layer of recursion, before it was equal to the maximum depth of the validated input</li>
</ol>
<p>While this is a great improvement, there is even more we can do, with even higher impact. Not everyone uses recursive schemas, but it&rsquo;s much more common to use refs more than once such as <code>[:tuple ::expr ::expr]</code>.
Malli&rsquo;s handling of validators for such schemas could be greatly improved. Here&rsquo;s how I explained it to Malli&rsquo;s maintainers:</p>
<hr>
<p>Plumatic Schema <a href="https://github.com/plumatic/schema/blob/74a1ecdb645d3f43b405a27e2b70f72db861b7ca/src/cljc/schema/spec/core.cljc#L74-L86">solves this</a> by caching validators for <em>all</em> schemas during compilation. In addition to handling recursive schemas, it also prevents a nasty exponential blowup of compilation size for even non-recursive schemas, that Malli also suffers from.</p>
<p>Malli&rsquo;s validator compilation is exponential. This registry demonstrates how:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>registry {<span style="color:#e6db74">::creates-1-validator</span> [<span style="color:#e6db74">:tuple</span>]
               <span style="color:#e6db74">::creates-2-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-1-validator</span> <span style="color:#e6db74">::creates-1-validator</span> <span style="color:#e6db74">::creates-1-validator</span> <span style="color:#e6db74">::creates-1-validator</span>]
               <span style="color:#e6db74">::creates-16-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-2-validators</span> <span style="color:#e6db74">::creates-2-validators</span> <span style="color:#e6db74">::creates-2-validators</span> <span style="color:#e6db74">::creates-2-validators</span>]
               <span style="color:#e6db74">::creates-64-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-16-validators</span> <span style="color:#e6db74">::creates-16-validators</span> <span style="color:#e6db74">::creates-16-validators</span> <span style="color:#e6db74">::creates-16-validators</span>]
               <span style="color:#e6db74">::creates-256-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-64-validators</span> <span style="color:#e6db74">::creates-64-validators</span> <span style="color:#e6db74">::creates-64-validators</span> <span style="color:#e6db74">::creates-64-validators</span>]
               <span style="color:#e6db74">::creates-1024-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-256-validators</span> <span style="color:#e6db74">::creates-256-validators</span> <span style="color:#e6db74">::creates-256-validators</span> <span style="color:#e6db74">::creates-256-validators</span>]
               <span style="color:#e6db74">::creates-4096-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-1024-validators</span> <span style="color:#e6db74">::creates-1024-validators</span> <span style="color:#e6db74">::creates-1024-validators</span> <span style="color:#e6db74">::creates-1024-validators</span>]
               <span style="color:#e6db74">::creates-16384-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-4096-validators</span> <span style="color:#e6db74">::creates-4096-validators</span> <span style="color:#e6db74">::creates-4096-validators</span> <span style="color:#e6db74">::creates-4096-validators</span>]
               <span style="color:#e6db74">::creates-65536-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-16384-validators</span> <span style="color:#e6db74">::creates-16384-validators</span> <span style="color:#e6db74">::creates-16384-validators</span> <span style="color:#e6db74">::creates-16384-validators</span>]
               <span style="color:#e6db74">::creates-262144-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-65536-validators</span> <span style="color:#e6db74">::creates-65536-validators</span> <span style="color:#e6db74">::creates-65536-validators</span> <span style="color:#e6db74">::creates-65536-validators</span>]
               <span style="color:#e6db74">::creates-1048576-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-262144-validators</span> <span style="color:#e6db74">::creates-262144-validators</span> <span style="color:#e6db74">::creates-262144-validators</span> <span style="color:#e6db74">::creates-262144-validators</span>]
               <span style="color:#e6db74">::creates-4194304-validators</span> [<span style="color:#e6db74">:tuple</span> <span style="color:#e6db74">::creates-1048576-validators</span> <span style="color:#e6db74">::creates-1048576-validators</span> <span style="color:#e6db74">::creates-1048576-validators</span> <span style="color:#e6db74">::creates-1048576-validators</span>]})
</code></pre></div><p>With this registry, each level of depth N compiles <code>(m/validator ::creates-1-validator)</code> 4^N times.</p>
<p>e.g., <code>(m/validator ::creates-4194304-validators)</code> compiles <code>(m/validator ::creates-1-validator)</code> 4,194,304 (4^11) times.</p>
<p>Plumatic Schema would only compile it once. It&rsquo;s not so trivial to achieve with dynamically scoped refs, but it&rsquo;s the same idea as detecting ref cycles, which we can now do reliably. Here&rsquo;s a reproduction of the issue <a href="https://github.com/frenchy64/malli/pull/36/files">https://github.com/frenchy64/malli/pull/36/files</a> which I have been pondering since discussing <a href="https://github.com/metosin/malli/pull/1180">https://github.com/metosin/malli/pull/1180</a></p>
<hr>
<p>I may propose work on this for a future Clojurists Together project, please stay tuned.</p>
<p>Thank you Clojurists Together and the Clojure community for funding this project, it was highly enjoyable and I learnt a lot.<br>
I hope you find the results useful. <br></p>
<hr>
<h2 id="thomas-clark-fastmath">Thomas Clark: Fastmath</h2>
<p>Q3 2025 $2K, Report No. 1, Published December 8, 2025</p>
<h3 id="table-of-contents">Table of Contents</h3>
<ol>
<li><a href="#org1c5ce13">Overview</a></li>
<li><a href="#org5787ad0">Surveying the scene</a></li>
<li><a href="#org245f5e3">Revised goals and towards future-proofed user-experience</a></li>
<li><a href="#orgf49cd9c">Outlook</a></li>
</ol>
<p><a id="org1c5ce13"></a></p>
<h3 id="overview">Overview</h3>
<p>Due to various circumstances - life, the universe and everything etc. - this project started significantly later than it should have and I apologise for that. It did however gain momentum quickly. Below, I consider the progress, as measured both chronologically and according to milestone. In a nutshell though, I have considered different possible avenues of implementation, played with various API strategies and made a couple of draft implementations.</p>
<p><a id="org5787ad0"></a></p>
<h3 id="surveying-the-scene">Surveying the scene</h3>
<p>The first task of the project was to more concretely situate the goals with respect to what already exists: that is, with respect to `fastmath` itself, the wider Clojure ecosystem and the available java libraries.</p>
<p>It was clear from the outset that `fastmath` hadn’t yet implemented complex matrices, but how real matrices and complex numbers themselves were implemented, was still a question. Thanks to a valuable discussion with generateme though, I had my first look at the depths and came to understand the mixture of Apache Commons and hard-coded Clojure that made up the library as it was.</p>
<p>It was concluded that `core.matrix`, rightly or wrongly, was currently dead to the community and not the right avenue for this project. The next big Clojure allies were Neanderthal and dtype-next. Both of these are very powerful and mature, but neanderthal was considered too low-level for fastmath and dtype-next, although potentially promising, would realistically require a lot of original code writing, with most operations and decomposition etc. needing to be implemented manually. The maths section of the `qclojure` library was also considered with interest, but it wasn’t implemented with efficiency as a goal. Instead, it will be used as something of a model consumer for this complex matrix project.</p>
<p>The conclusion therefore, was, at least initially, to wrap a java library. But which one? And how? The natural choice, would have beeen to extend the coverage of <a href="https://commons.apache.org/proper/commons-math/">Apache Commons</a>, but, as a working physicist, performance is a strong goal for me and it seemed that there were faster options available. Surveying the existing documentation online,     `jblas` looked powerful, but has complicated dependencies and so the best all round options (as demonstrated by the  <a href="https://github.com/lessthanoptimal/Java-Matrix-Benchmark">Java Matrix Benchmark</a>, and filtered by available ’complex’ API) seemed to be <a href="https://github.com/lessthanoptimal/ejml">EJML</a> and <a href="https://github.com/optimatika/ojAlgo">ojAlgo</a>. I experimented with both of these libraries somewhat and my feeling is that ojAlgo has the greater performance, but that it’s API is much less intuitive. It took me significant time to work out how to do basic constructions and operations - and I also found a bug that required reflection (in the Java sense!) to overcome. Using EJML however, was very straightforward and I could quickly draft a solution. Going forward therefore, in the knowledge that this project has a finite deadline, I decided to continue with EJML, but with a caveat. I wanted to keep the implementation details abstracted, so that we can swap alternative backends in and out more easily in the future.</p>
<p><a id="org245f5e3"></a></p>
<h3 id="revised-goals-and-towards-future-proofed-user-experience">Revised goals and towards future-proofed user-experience</h3>
<p>Realising that I might have to change how complex ’numbers’ are implemented opened up a considerable can of worms, as did the temptation of unifying the complex implementation with the real implementation. In fact, (over)thinking and implementing a separation of user experience from the Java backend took up much of the remaining time so far. And the decision of how much to change of the existing `fastmath` API is an ongoing question, that will have to be finalized with generateme in the second half.</p>
<p>Fundamentally, the tension in this project is to make a library that is easy to use for maths/physics-minded people, is flexible enough to be extended into the future and yet still still fast enough to live up to the library’s name. The current solution therefore is a sophisticated hierarchy of protocols: to represent mathematical identities, and for fast implementation; as well as a new, versioned, multimethod-based API. This second layer features overloaded mathematical operators such that the full linear algebra stack can be used intuitively, with operator ordering and type coercion happening ’under the hood’. If this proves too much of a performance cost though, then you can simply revert to the explicit protocol methods.</p>
<p>As an example, rather than `fastmath.protocols.matrix` beeing one of only two protocols, we now have a full mathematical structure available, with implementations like `fastmath.algebra.object.number.complex.ejml` and `fastmath.algebra.object.matrix.rectangular.complex.ejml`. This provides more obvious places for future specializations or alternative backends.</p>
<p>With mathematical properties, we can use Clojure protocols as they were intended, for flexibility and without reinventing the wheel, when it comes to how to partition functions. For example, a complex number, can now be easily implemented according to its definition: as ’a field on a normed space that has complex and polar coordinates’. What is a field you might ask? Well, it’s an algebraic structure that forms a ring and a multiplicative group. As an example, that last sentence can now be represented programmatically (below). And by structuring the protocols this way, we get polymorphism across different types and domains for free.</p>
<pre><code>(ns fastmath.protocol.algebra.structure.field
  (:require [fastmath.protocol.algebra.structure.ring :as ring]
            [fastmath.protocol.algebra.structure.multiplicative.group :as mgroup]))

(defprotocol  Field)

(def add ring/add)
(def multiply ring/multiply)
(def negate ring/negate)
(def one ring/one)
(def zero ring/zero)

(def inverse mgroup/inverse)

(defn ? [x]
  (and
   (ring/?  x)
   (mgroup/?  x)
   (satisfies? Field x)))
</code></pre>
<p><a id="orgf49cd9c"></a></p>
<h3 id="outlook">Outlook</h3>
<p>Having considered the architecture, API creation and first implementation tests, the project, as a whole, is on a firm footing for development. With the expansion of API goals however, the proposal metrics will have to be reprioritised. In this light, the next steps will be to widen the matrix implementations beyond basic operations and to integrate them with other `fastmath` functions, like decomposition and fourier functions. After this, I will focus on integration with the `clay` system, so that some sort of report and documentation can be published on time. On the current trajectory, it’s not clear that the performance comparisons, for example, will be completed during the official funding period, but, if not, they will surely follow promptly.<br>
<br></p>
<hr>
<h2 id="jeremiah-coyle-fireworks">Jeremiah Coyle: Fireworks</h2>
<p>Q3 2025 $2K, Report No. 2, Published November 30, 2025</p>
<p>I&rsquo;m happy to report that 5 of the primary goals and 6 of the secondary goals were achieved in Q3. Many thanks to Clojurists Together for supporting this work!</p>
<h3 id="primary-goals">Primary goals</h3>
<ul>
<li>
<p>Add support for automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">Chalk</a>.<br><a href="https://github.com/paintparty/fireworks/issues/42">#42</a><br>
<a href="https://github.com/paintparty/fireworks/pull/76">Completed</a>
<br></p>
</li>
<li>
<p>Support call-site option to disable all truncation and ellipsis<br>
<a href="https://github.com/paintparty/fireworks/issues/14">#14</a><br>
<a href="https://github.com/paintparty/fireworks/commit/d1232b7fe3d522f751009c2cccc8aeca87966d34">Completed</a>
<br></p>
</li>
<li>
<p>Documentation of interactive workflow:</p>
<ul>
<li><a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#jvm-clojure-deps-setup"><code>deps.edn</code> sample project</a></li>
<li><a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#jvm-clojure-leiningen-setup"><code>Leiningen</code> sample project</a>
<br></li>
</ul>
</li>
<li>
<p>VS Code Integration <br>
<a href="https://github.com/paintparty/fireworks/blob/main/docs/editors/vscode/vscode.md">Completed</a>
<br></p>
</li>
<li>
<p>Cursive / IntelliJ Integration <br>
<a href="https://github.com/paintparty/fireworks/blob/main/docs/editors/cursive/cursive.md">Completed</a>
<br></p>
</li>
<li>
<p>Emacs Integration<br>
In progress. Work on this will commence and once a sufficient amount of data from the use of the Joyride and Cursive implementations is gathered. This will inform any unforeseen details about ergonomics and/or implementation details.
<br></p>
</li>
</ul>
<h3 id="secondary-goals">Secondary goals</h3>
<ul>
<li>Allow for call-site changes to the label color.<br><a href="https://github.com/paintparty/fireworks/issues/53">#53</a><br>
<a href="https://github.com/paintparty/fireworks/pull/76">Completed</a><br></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">?</span> {<span style="color:#e6db74">:label-color</span> <span style="color:#e6db74">:red</span>} (+ <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">1</span>))
</code></pre></div><br>
<ul>
<li>Flag for eliding truncation and ellipsis at callsite <br>
<a href="https://github.com/paintparty/fireworks/issues/77">#77</a><br>
<a href="https://github.com/paintparty/fireworks/pull/77">Completed</a><br></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">?</span> <span style="color:#e6db74">:+</span> my-coll)
<span style="color:#75715e">;; as shorthand for:</span>
(<span style="color:#a6e22e">?</span> {<span style="color:#e6db74">:truncation?</span> false} my-coll)
</code></pre></div><br>
<ul>
<li>Add option to produce bold output. <br>
<a href="https://github.com/paintparty/fireworks/issues/70">#70</a><br>
<a href="https://github.com/paintparty/fireworks/pull/76">Completed</a><br></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">?</span> {<span style="color:#e6db74">:bold?</span> true} (+ <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">1</span>))
</code></pre></div><br>
<ul>
<li>Add option to format the label as code. <br>
<a href="https://github.com/paintparty/fireworks/issues/82">#82</a><br>
<a href="https://github.com/paintparty/fireworks/pull/82">Completed</a><br></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">?</span> {<span style="color:#e6db74">:format-label-as-code?</span> true}
   (<span style="color:#a6e22e">mapv</span> (<span style="color:#66d9ef">fn </span>[i] (str <span style="color:#e6db74">&#34;id-&#34;</span> i))
         (range <span style="color:#ae81ff">20</span>)))
</code></pre></div><br>
<ul>
<li>Add function to set options globally for project, at runtime, with a <code>config!</code> macro. <br>
<a href="https://github.com/paintparty/fireworks/issues/81">#81</a><br>
<a href="https://github.com/paintparty/fireworks/pull/81">Completed</a></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">fireworks.core/config!</span>
 {<span style="color:#e6db74">:format-label-as-code?</span> true
  <span style="color:#e6db74">:template</span>              [<span style="color:#e6db74">:file-info</span> <span style="color:#e6db74">:form-or-label</span> <span style="color:#e6db74">:result</span>]
  <span style="color:#e6db74">:label-length-limit</span>    <span style="color:#ae81ff">100</span>})
</code></pre></div><br>
<ul>
<li>Properly display contents and badges of native js data structures, when they are within a native cljs data structure.<br>
<a href="https://github.com/paintparty/fireworks/issues/46">#46</a><br>
<a href="https://github.com/paintparty/fireworks/pull/86">Completed</a></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">?</span> [<span style="color:#f92672">#</span>js {<span style="color:#e6db74">:a</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:b</span> <span style="color:#ae81ff">2</span>}
    (<span style="color:#66d9ef">new </span>js/Set <span style="color:#f92672">#</span>js[<span style="color:#e6db74">&#34;foo&#34;</span> <span style="color:#e6db74">&#34;bar&#34;</span>])
    (into-array [<span style="color:#ae81ff">1</span> <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">3</span>])
    (<span style="color:#66d9ef">new </span>js/Map <span style="color:#f92672">#</span>js[<span style="color:#f92672">#</span>js[<span style="color:#ae81ff">3</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">#</span>js[<span style="color:#ae81ff">4</span> <span style="color:#ae81ff">2</span>]])
    (<span style="color:#66d9ef">new </span>js/Int8Array <span style="color:#f92672">#</span>js[<span style="color:#ae81ff">1</span> <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">3</span>])])
</code></pre></div><br>
<br>
<br>
<p>The latest release of Fireworks is <a href="https://clojars.org/io.github.paintparty/fireworks/versions/0.13.0"><code>v0.16.1</code></a>, which features the enhancements listed above.<br></p>
<hr>
<h2 id="dragan-djuric-uncomplicate-clojure-ml">Dragan Djuric: Uncomplicate Clojure ML</h2>
<p>Q3 2025 $9K, Report No. 3, Published December 1, 2025</p>
<h3 id="final-progress-after-the-third-month">Final progress after the third month:</h3>
<p>In the first two months, I have already released more than 10 versions to Clojars
as <code>org.uncomplicate/diamond-onnxrt</code>, with the progressively better coverage
of the onnxruntime&rsquo;s C API, established a nicer Clojure API for onnxruntime internals,
higher level Deep Diamond and Neanderthal model integrations, and make inroads
into GPU support with CUDA.</p>
<p>In the third month, i tried several typical open models, and did the development
and refinements to support the necessary features required by these real-world examples.</p>
<p>I refined the low-level and high-level model support incrementally, to support
as much automatic wiring of the models with Clojure as possible, and I am quite pleased
with the result. One of the goals of all Uncomplicate libraries
is to offer access to all abstraction levels to Clojure programmers: from the lowest fine grained just above the C API,
to the highest &ldquo;magic&rdquo; that configures itself, and we supported this here to the fullest.
Everyone can use the internal core namespace to program every single detail by themselves in Clojure - if they wish so -
while they also can leverage mid-level abstract functions that build standalone models,
OR, let Deep Diamond do everything for themselves. There&rsquo;s something even handier:
even the most abstract level supports detailed configuration of the models, with sane defaults.
This is what I spent most of the time in the third month of the project: the overall usability
and polishing!</p>
<p>The final result: now we can load a model, and almost everything
related to loading and setting that model up with Deep Diamond&rsquo;s Clojure tensors is automatic.
If we want to configure most of the stuff that can be configured, it&rsquo;s an options map away,
with nice Clojure keywords, while we don&rsquo;t have to worry how that configuration
produces its results. At the same time, if the users have more specific requirements,
or they don&rsquo;t like how I implemented it, or they simply just want to learn, they
still have a ladder down the rabbit hole, and they can use any of the lower layers
as they please, as independent nuts and bolts for their own creations.</p>
<p>I released a few more versions to Clojars (the most recent one is 0.20.0).</p>
<p>An example of what we can do now is that we can now clone a Hugging Face repository of
Google&rsquo;s open model Gemma 3 in ONNX format, we can load it without much hassle as DD blueprint,
instantiate it as a standalone layer function, get the access to input and output parameters
as nice DD Clojure tensors, easily load them with data, and run the model as a straightforward
Clojure function evaluation! Now, a casual onlooker would think: &ldquo;Great. Now I just load Gemma 3,
and I have a home-sized mini Gemini!&rdquo; Well, no. This model accepts tensor full of numbers, and
it can infer tensors full of numbers that indicate next token(s). But, LLM is more than that. It accepts
strings (or images, etc) re-computes these strings into appropriate numbers (tensors),
runs the inference in a loop, bookkeep various context tensors, makes sense of the output numbers,
etc. That&rsquo;s a whole new level of application of these moving parts, and requires
another level of applicative automation.
Some models do not need that applicative automation, but LLMs are more complex beasts.</p>
<p>So, looking back at what I proposed to implement, I would declare that I&rsquo;m quite
happy that I achieved everything planned, and even achieved a simpler API than envisioned at the start.<br>
No we can bite even at the LLMs at the next step, which is a focused effort on its own.<br>
<br></p>
<hr>
<h2 id="jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</h2>
<p>Q3 2025 $9K, Report No. 3, Published November 30, 2025</p>
<p>Howdy folks! Thank you so much for the sponsorship this quarter. This month was
Conj 2025 month, so leading up to the Conj I was very focused on preparing for
my talk and two different Conj working groups. Outside of that, though, I have
been tackling overall jank stability. The number one concern there was GC
stability, since our GC usage of BDWGC (Boehm) was leading to either leaks or
intermittent crashes. In total, this has involved three weeks of spelunking in
both the GC code and jank&rsquo;s code.</p>
<p>The crashes were nearly always caused by the GC prematurely collecting an object
because it could no longer find a usage of it. In some cases, this happened
because that object was only accessible from the system heap (i.e. normal <code>new</code>
or <code>malloc</code>), rather than the GC heap. These cases could be fixed by correct
usage of the GC allocator for C++ collections, which we sometimes missed. In
another case, jank was using a thread-local collection to store Clojure
bindings. However, on Linux, thread-local memory is stored separately from
normal memory, so the GC is unable to find references to the objects within that
collection. Finally, I have found that there are some aspects of our LLVM IR
generation which lead the GC to prematurely collect. I have solved some of these
issues, but more investigation and development remains. Curiously, though, I
found that using jank&rsquo;s C++ code generation, rather than LLVM IR, skirts these
issues.</p>
<p>To prioritize stability for the upcoming alpha release in December, I decided to
focus on C++ generation as the default. This has required some catching up,
since we&rsquo;ve been running both for a while but we&rsquo;ve been focusing on LLVM IR.
Now, at the end of the month, all tests are passing with C++ code generation and
there are no known GC issues on macOS and Linux. I&rsquo;ll continue developing the
LLVM IR generation, to resolve these issues, but I&rsquo;ll take the time needed to do
it right. Until then, C++ generation as a default provides many benefits and no
behavioral change.</p>
<p>The biggest remaining task for the alpha release is now documentation, which I
will be tackling in the next few weeks. Then it&rsquo;s alpha time!<br>
<br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together 2026 Annual Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-2026-annual-funding-announcement/</link>
      <pubDate>Tue, 16 Dec 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-2026-annual-funding-announcement/</guid>
      <description>Clojurists Together is funding 5 developers $1.5k/month for 12 months</description>
      <content:encoded><![CDATA[<p>The votes are in!! Clojurists Together members have voted to to fund 5 developers $1.5k/month for 12 months ($90k USD total!). We&rsquo;re pleased to announce the following developers/teams who will be funded:</p>
<p><a href="#bozhidar-batsov">Bozhidar Batsov</a><br>
<a href="#michiel-borkent">Michiel Borkent</a><br>
<a href="#clojure-camp">Clojure Camp</a><br>
<a href="#eric-dallo">Eric Dallo</a><br>
<a href="#jeaye-wilkerson">Jeaye Wilkerson</a></p>
<p>We are very excited to see what these developers will do over the next year. They will share updates of what they&rsquo;ve been working on, and we&rsquo;ll post and email them as part of  our regular updates. You&rsquo;ll find summaries below of what each of these developers plan to work on (although they are just a starting points and they&rsquo;re free to change their plans as they see fit). If you want more detail, you can refer back to the proposals submitted on our <a href="https://www.clojuriststogether.org/news/vote-on-2026-annual-funding/">website</a>.</p>
<p>Thanks to the all of you - the Members -  who took the time to review the applications and make the difficult decision to select just 5 from many excellent proposals. Congratulations are in order to Bozhidar, Michiel, Eric, Jeaye, and the Clojure Camp team! For everyone else who submitted their projects, there will be more grant opportunities in 2026 - so keep posted.</p>
<h3 id="bozhidar-batsov">Bozhidar Batsov</h3>
<p><a href="https://github.com/bbatsov">https://github.com/bbatsov</a></p>
<p>Continuously improving CIDER, nREPL, clojure-ts-mode and their related projects. Building a formal nREPL specification is one of the bigger challenges I hope to tackle next year. As is fully decoupling clojure-mode from CIDER.<br>
Most of the projects are hosted under the following GitHub orgs:<br>
<a href="https://github.com/clojure-emacs">https://github.com/clojure-emacs</a>
<a href="https://github.com/nrepl">https://github.com/nrepl</a> <br></p>
<hr>
<h3 id="michiel-borkent">Michiel Borkent</h3>
<p><a href="https://github.com/borkdude">https://github.com/borkdude</a></p>
<p>My main projects are clj-kondo, babashka / SCI, and squint/cherry.<br>
Links:<br>
<a href="https://github.com/clj-kondo/clj-kondo">https://github.com/clj-kondo/clj-kondo</a><br>
<a href="https://github.com/babashka/babashka">https://github.com/babashka/babashka</a><br>
<a href="https://github.com/babashka/sci">https://github.com/babashka/sci</a><br>
<a href="https://github.com/squint-cljs/squint">https://github.com/squint-cljs/squint</a></p>
<p>I have identified the following long-term goals that I want to focus on in 2026:</p>
<ul>
<li>Clj-kondo: run macros directly from source code</li>
<li>Clj-kondo: run exported configs/hooks directly from classpath (instead of having to copy files to a local dir)</li>
<li>Squint/Cherry: browser nREPL support</li>
<li>Squint/Cherry: source maps</li>
<li>Squint: protocolize coll functions so you can extend them to e.g. ImmutableJS or other custom collections</li>
<li>Scittle2 (working name): better/faster/smaller version of Scittle using Cherry (in-browser CLJS compiler)</li>
<li>Babashka: support CIDER middleware from source directly in bb</li>
<li>Babashka: distinguished parallel task output (e.g. colors or prefix)</li>
<li>Clj-kondo: add first-class support for Clojure dialects like ClojureDart and Jank</li>
<li>Clojure CLI: help improve UX via a new tools working group</li>
<li>Clj-kondo: performance improvements for bigger projects</li>
</ul>
<p>Apart from these long-term goals, there are plenty of maintenance-type issues to work on. Babashka consists of several libraries like SCI, fs, process, deps.clj, http-client and edamame that benefit not only babashka, but also the wider Clojure ecosystem. These libraries all need some love from time to time. There are several ideas to improve clj-kondo with more linter rules as well.<br></p>
<hr>
<h3 id="clojure-camp">Clojure Camp</h3>
<p>(Rafal Dittwald, Jordan Miller, and others)<br>
<a href="https://clojure.camp">https://clojure.camp</a></p>
<p><strong>Continue various existing Clojure Camp projects:</strong></p>
<ul>
<li>supporting new developers to attend Conj and other Clojure conferences (travel bursaries, and or/ organizing and subsidizing shared accommodation)</li>
<li>continue our peer-to-peer pairing program, with a new goal to also appeal to existing Clojurians</li>
<li>continue offering weekly online vents (mobs, office hours, etc)</li>
<li>improve communication of our offerings (by regularly posting)</li>
</ul>
<p><strong>Explore new Clojure Camp projects:</strong></p>
<ul>
<li>develop our &ldquo;curriculum map&rdquo; into a learning roadmap and badge system</li>
<li>facilitate a mentorship program, pairing Clojure OSS devs with other devs (junior and senior)</li>
<li>experiment with hosting &ldquo;micro-conjs&rdquo; (6-10 person, in-person weekend coding retreats)<br></li>
</ul>
<hr>
<h3 id="eric-dallo">Eric Dallo</h3>
<p><a href="https://github.com/ericdallo">https://github.com/ericdallo</a></p>
<p><a href="https://github.com/editor-code-assistant/eca"><strong>ECA (Editor Code Assistant)</strong></a> <br>
This project was born 5 months ago (with clj-together&rsquo;s help!) and it&rsquo;s growing, there are so many improvements to this project related to features and parity with other big tools like Claude/Cursor, compatibility with more editors, fix and support community issues.
This AI tool is written in Clojure but works in any language which is huge for discoverability of Clojure community outside Clojure bubble, it has a lot of potential in my opinion, and projects for each editor to maintain and evolve.</p>
<p><a href="https://github.com/clojure-lsp/clojure-lsp"><strong>Clojure-lsp</strong></a> <br>
I want to work on custom code actions, support for new clojure.java.javadoc lib, improve java interop support like go to class locations, methods etc, lots of this would require me working in clj-kondo too</p>
<p><a href="https://github.com/ericdallo/metrepl"><strong>metrepl</strong></a><br>
I want to help with guide and examples of metrics of your repl and how that can help companies understand developers REPL usage<br></p>
<hr>
<h3 id="jeaye-wilkerson">Jeaye Wilkerson</h3>
<p><a href="https://github.com/jeaye">https://github.com/jeaye</a></p>
<p>I will be working full-time on <a href="https://github.com/jank-lang/jank">jank.</a></p>
<p>jank&rsquo;s alpha release is going out in December 2025, which will lead us into a hectic start to 2026 as we&rsquo;ll be collecting/fixing as many bugs as we can. Meanwhile, I will be developing jank&rsquo;s build system for native system dependencies, improving stability, significantly improving performance, and adding the remaining features to achieve strong Clojure parity (records, protocols, futures, etc). Furthermore, I will be authoring the jank book, which will be a free standalone resource for learning jank (and Clojure), inspired by and very similar to the Rust book.</p>
<p>I will also continue to lead the clojure-test-suite initiative, which provides thorough unit test coverage for all core Clojure functions and is currently serving Clojure JVM, Clojure CLR, ClojureScript, babashka, and jank. I aim to capture ClojureDart and Basilisp in 2026 and I have already started discussions with the creators of both dialects.</p>
<p>I am currently mentoring four different open source contributors, who&rsquo;re learning to be compiler hackers, and I aim to pick up a fifth during 2026. I&rsquo;m specifically looking to add a Clojure lady to the gang and I began outreach for this at the Conj.</p>
<p>Additionally, I will continue streaming on Twitch regularly, to raise Clojure awareness. I will generally use that time to either develop jank itself or to use jank to develop Clojure-related tooling.</p>
<p>Overall, my goal for EOY 2026 is production readiness for jank. This is an aggressive goal, but I will work aggressively on it. <br></p>
<h2 id="thanks">Thanks</h2>
<p>Thanks again  to all of our members for selecting these developers. If it wasn&rsquo;t for your generous support, this wouldn&rsquo;t be possible. A special thanks goes to Latacora, Roam Research, Whimsical, Nubank, Cisco, JUXT, Metosin, Solita, Grammarly, Nextjournal, ClojureStream, Shortcut, Flexiana, Toyokumo,doctronic, and 180° Seguros. They have all contributed significant amounts to Clojurists Together which helps us award $90,000 in long-term funding to Clojure developers in the coming year.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Vote on 2026 Annual Funding</title>
      <link>https://www.clojuriststogether.org/news/vote-on-2026-annual-funding/</link>
      <pubDate>Tue, 02 Dec 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/vote-on-2026-annual-funding/</guid>
      <description>It Is Up To You to Decide Who Will Receive Funding</description>
      <content:encoded><![CDATA[<p>Greetings Clojurists Together Members! Last year, based on your feedback, we tried a new process to identify annual funding recipients.  It was a vast improvement from years past, so this year we are using it again.</p>
<p>We put out the call - and we received 16 applications for you to consider. The board reviewed and voted to move all 16 to the 2026 Ranked Vote ballot.</p>
<p>Now it is up to you, the members, to select the 5 developers who will each receive $1,500 monthly stipends (for a total of $18K USD). <strong>Be on the lookout for an email that contains the link to your Ranked Vote ballot.</strong> Deadline for voting is <strong>12 December 2025</strong> midnight Pacific Time.</p>
<p>You can review past long-term project updates on our <a href="https://www.clojuriststogether.org/news/">website</a> to get an idea of what past annual (or long-term) funding recipients have been able to accomplish with your support (pretty amazing!)</p>
<p>Thanks again to all the members for making this happen. We know from our surveys that you and the larger Clojurist Community that receive our project updates refer to this work on a regular basis - 83% daily or several times a week! This is a testament to its importance of these projects.</p>
<h3 id="deadline-for-your-vote-to-be-counted-december-12-2025-midnight-pacific-time">Deadline for your vote to be counted: December 12, 2025 Midnight Pacific Time</h3>
<p>Here we go ..in alphabetical order (by last name)&hellip;.<br>
<a href="#bozhidar-batsov">Bozhidar Batsov</a><br>
<a href="#adrian-bendel">Adrian Bendel</a><br>
<a href="#michiel-borkent">Michiel Borkent</a><br>
<a href="#clojure-camp-rafal-dittwald-jordan-miller-and-others">Clojure Camp (Rafal Dittwald, Jordan Miller, and others)</a><br>
<a href="#thomas-cothran">Thomas Cothran</a><br>
<a href="#alex-coyle">Alex Coyle</a><br>
<a href="#jeremiah-coyle">Jeremiah Coyle</a><br>
<a href="#eric-dallo">Eric Dallo</a><br>
<a href="#dragan-djuric">Dragan Djuric</a><br>
<a href="#siavash-mohammady">Siavash Mohammady</a><br>
<a href="#nikita-prokopov">Nikita Prokopov</a><br>
<a href="#james-reeves">James Reeves</a><br>
<a href="#tomasz-sulej">Tomasz Sulej</a><br>
<a href="#peter-taoussanis">Peter Taoussanis</a><br>
<a href="#jeaye-wilkerson">Jeaye Wilkerson</a><br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>   <br></p>
<hr>
<h3 id="bozhidar-batsov">Bozhidar Batsov</h3>
<p><a href="https://github.com/bbatsov">https://github.com/bbatsov</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
Continuously improving CIDER, nREPL, clojure-ts-mode and their related projects. Building a formal nREPL specification is one of the bigger challenges I hope to tackle next year. As is fully decoupling clojure-mode from CIDER.</p>
<p>Most of the projects are hosted under the following GitHub orgs:</p>
<ul>
<li><a href="https://github.com/clojure-emacs">https://github.com/clojure-emacs</a></li>
<li><a href="https://github.com/nrepl">https://github.com/nrepl</a></li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong><br>
CIDER and nREPL are two of the pillars of the Clojure community and are widely used by Clojure developers. The libraries developed originally for CIDER (cider-nrepl, refactor-nrepl, orchard, etc) are used by many other development tools as well.  <br></p>
<hr>
<h3 id="adrian-bendel">Adrian Bendel</h3>
<p><a href="https://github.com/onbreath">https://github.com/onbreath</a></p>
<p><strong>What do you plan to work on throughout the year?</strong></p>
<p><a href="https://github.com/scicloj/clay"><strong>Clay</strong></a></p>
<p>Recently I&rsquo;ve started to collaborate with people in the Scicloj-community on extending and improving Clay. Clay is superficially similar to other notebook environments, literate programming and visualization systems, but unique in that it acts as a companion to the REPL, situating itself in the workflow we&rsquo;re used to.</p>
<p>We started work on features that were on halt for quite a while. For now this is primarily about extending Clay to be able to integrate with other runtimes, where we&rsquo;re using Babashka for a prototype. This is still in an exploratory and design phase, though we already have Clay working in Babashka, there is testing and backwards compatibility to ensure. Further, just building whole notebooks in different Clojure dialects is not necessarily the end goal here, because it is much more interesting to use the large ecosystem of the JVM and Clojure proper to integrate and work with data from other runtimes and their Clojure dialects.</p>
<p>Overall this work is primarily to prepare for integrating with Jank, as soon as that is feasible. There are lots of C++-projects in scientific computing, machine learning and similar fields. Being able to interface with them directly, in a REPL integrated notebook environment, would potentially help a great deal in advancing Clojure&rsquo;s use in those fields.  Other Clojure dialects are of interest as well, but have a lower priority for now.</p>
<p>The second area that needs work is integrating Clay more with the different Clojure programming environments. While solutions for integration with Emacs, Calva, Conjure and Cursive exist, the error reporting of Clay should be improved and better integrated with the development environments where possible. Since some of the primary work above, with different runtimes, already encompasses possible nREPL-based integration, this could also be leveraged for improved error reporting in packages/extensions.</p>
<p>My great hope for Clay is that its use in Civitas (see link below), a community and publishing platform for articles, books, tutorials etc. on Clojure will, as its developer Timothy Pratley intended, further the exchange of ideas in the Clojure community and beyond.</p>
<p>On Civitas there are also great opportunities to extend the Clay rendering system to support different kinds of Clojure code visualization. With Stratify (see below), clj-kondo and Flowstorm among many others, we have great sources for code structure, metrics, analysis and traces of our program. In many cases those tools are not used, only used very situated or are vendor locked, as Stratify&rsquo;s DGML based code structure graphs, which can only be viewed properly in Visual Studio on Windows.</p>
<p>At the same time, we have a lot of the tools needed to mold this information into polished code quality reports, internal documentation and similar. A common complaint about Clojure is its dynamic nature and dense, opaque code structure. But what if we leveraged readily available technology to introspect and visualize our programs?  I want to approach this topic by writing articles on the work we do on Clay, in Clay, publishing to Civitas, showcasing Clay&rsquo;s architecture and operation. This should exemplify some of the tools available in everyday work with Clojure. It is also an opportunity to develop a library that uses readily available automatic graph layout engines to render DGML to SVG, to visualize and possibly interact with code structure. Other visualizations necessary for the reporting mentioned before are also of interest.</p>
<p>I know, this seems very broad, but I rely on and deeply appreciate the collaboration with the other maintainers at Scicloj, to keep focus and set priorities as they seem feasible and necessary.</p>
<p><a href="https://scicloj.github.io">https://scicloj.github.io</a><br>
<a href="https://clojurecivitas.github.io">https://clojurecivitas.github.io</a><br>
<a href="https://github.com/dundalek/stratify">https://github.com/dundalek/stratify</a></p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Integrating Clay with Clojure dialects on runtimes that are used in scientific computing etc.
Showcasing and extending the ecosystem of tools to make sense (and images!) of all our work.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
I have another, older GitHub account that shows I&rsquo;ve been around for a while, though not as a prolific open source contributor, but <a href="https://github.com/abp">great explorer:</a>  <br></p>
<hr>
<h3 id="michiel-borkent">Michiel Borkent</h3>
<p><a href="https://github.com/borkdude">https://github.com/borkdude</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
My main projects are clj-kondo, babashka / SCI, and squint/cherry.</p>
<p>Links:<br>
<a href="https://github.com/clj-kondo/clj-kondo">https://github.com/clj-kondo/clj-kondo</a><br>
<a href="https://github.com/babashka/babashka">https://github.com/babashka/babashka</a><br>
<a href="https://github.com/babashka/sci">https://github.com/babashka/sci</a><br>
<a href="https://github.com/squint-cljs/squint">https://github.com/squint-cljs/squint</a></p>
<p>I have identified the following long-term goals that I want to focus on in 2026:</p>
<ul>
<li>Clj-kondo: run macros directly from source code</li>
<li>Clj-kondo: run exported configs/hooks directly from classpath (instead of having to copy files to a local dir)</li>
<li>Squint/Cherry: browser nREPL support</li>
<li>Squint/Cherry: source maps</li>
<li>Squint: protocolize coll functions so you can extend them to e.g. ImmutableJS or other custom collections</li>
<li>Scittle2 (working name): better/faster/smaller version of Scittle using Cherry (in-browser CLJS compiler)</li>
<li>Babashka: support CIDER middleware from source directly in bb</li>
<li>Babashka: distinguished parallel task output (e.g. colors or prefix)</li>
<li>Clj-kondo: add first-class support for Clojure dialects like ClojureDart and Jank</li>
<li>Clojure CLI: help improve UX via a new tools working group</li>
<li>Clj-kondo: performance improvements for bigger projects</li>
</ul>
<p>Apart from these long-term goals, there are plenty of maintenance-type issues to work on. Babashka consists of several libraries like SCI, fs, process, deps.clj, http-client and edamame that benefit not only babashka, but also the wider Clojure ecosystem. These libraries all need some love from time to time. There are several ideas to improve clj-kondo with more linter rules as well.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Clj-kondo and babashka are used by a large portion of the community and available in popular editors like Calva and Cursive. I think it&rsquo;s fair to say they are established projects and lots of people rely on them from day to day.</p>
<p>Babashka is used by 90% of Clojure Survey respondents who answered the question &ldquo;What Clojure dialects do you use&rdquo;, as shown in Alex Miller&rsquo;s 2024 Conj talk. Babashka and clj-kondo have 4.4k and 1.8k stars on GitHub respectively. Their channels on Clojurians Slack have almost 1900 + 1000 users.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Thank you so much to Clojurists Together for keeping the Clojure OSS ecosystem sustainable!  <br></p>
<hr>
<h3 id="clojure-camp-rafal-dittwald-jordan-miller-and-others">Clojure Camp (Rafal Dittwald, Jordan Miller, and others)</h3>
<p><a href="https://clojure.camp">https://clojure.camp</a></p>
<p><strong>What do you plan to work on throughout the year?</strong></p>
<p><strong>Continue various existing Clojure Camp projects:</strong></p>
<ul>
<li>supporting new developers to attend Conj and other Clojure conferences (travel bursaries, and or/ organizing and subsidizing shared accommodation)</li>
<li>continue our peer-to-peer pairing program, with a new goal to also appeal to existing Clojurians</li>
<li>continue offering weekly online vents (mobs, office hours, etc)</li>
<li>improve communication of our offerings (by regularly posting)</li>
</ul>
<p><strong>Explore new Clojure Camp projects:</strong></p>
<ul>
<li>develop our &ldquo;curriculum map&rdquo; into a learning roadmap and badge system</li>
<li>facilitate a mentorship program, pairing Clojure OSS devs with other devs (junior and senior)</li>
<li>experiment with hosting &ldquo;micro-conjs&rdquo; (6-10 person, in-person weekend coding retreats)</li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Clojure Camp aims to help new Clojurians integrate into the Clojure community, particularly those who may be under-served by existing self-directed methods. We&rsquo;d like to be the place for existing Clojurians to send anyone struggling with getting started with Clojure. Our current approach is to foster a welcoming community and provide educational scaffolding (pairing, events, resource lists, roadmap). Going forward, we hope to focus more on &ldquo;connection&rdquo;: creating more opportunities for new Clojurians and existing Clojurians to interact and work together.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Clojure Camp is now an incorporated non-profit (in Ontario, Canada). Ideally, this funding would go to the organization, not to an individual.  <br></p>
<hr>
<h3 id="thomas-cothran">Thomas Cothran</h3>
<p><a href="https://github.com/thomascothran">https://github.com/thomascothran</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
I plan to work on <a href="https://github.com/thomascothran/pavlov">pavlov:</a></p>
<p>Pavlov is a functional implementation of behavioral programming, which is a programming paradigm invented by David Harel, the creator of statecharts. This <a href="https://cacm.acm.org/research/behavioral-programming/">ACM article is a good introduction to the idea:</a></p>
<p>Pavlov is currently in alpha status. It is well tested (in Clojure) and has been reliable in production use. It has a number of useful features on top of the behavioral programming core:</p>
<ol>
<li>A model checker that verifies safety properties (though not yet liveness properties)</li>
<li><a href="https://github.com/thomascothran/pavlov/blob/master/doc/navigating-bprograms.md">Program states can be programmatically navigated using datafy and nav</a></li>
<li><a href="https://github.com/thomascothran/pavlov/blob/master/doc/designing-business-programs-with-behavioral-threads.md#pavlov-program-explorer">A portal-based program explorer, where you can point and click through program execution paths (including time travel)</a></li>
</ol>
<p><strong>However, there are a few things I&rsquo;d like to do to get it to a stable release:</strong></p>
<ol>
<li>Better testing with Clojurescript. While the Clojure test suite is comprehensive, the Clojurescript tests do not provide as much coverage.</li>
<li>Recipes document showing how to solve common problems with pavlov.</li>
<li>LLM instructions. Context7 has not been adequate in production, and LLMs need a bit more guidance.</li>
</ol>
<p><strong>After the stable release, I would like to work on:</strong></p>
<ol>
<li>A more robust program explorer. The portal-based one uses the <code>nav</code> support. However, it is clunky and it doesn&rsquo;t visualize the program execution paths in a single view as a graph.</li>
<li>Durable execution. Pavlov&rsquo;s behavioral programming implementation is designed to be fully serialized. Durable execution is not yet implemented.</li>
<li>Demo applications. Since behavioral programming is not a well-known paradigm, demo applications will be useful to help the community understand it.</li>
</ol>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Behavioral programming is, I believe, uniquely suited to Clojure. In part, this is because behavioral programming is, in principle, very loosely coupled. At the same time, it enables developer tooling that makes it easy to use and test.</p>
<p>But Clojure&rsquo;s functional and data-oriented approach solves a lot of problems with implementing behavioral programs. For example, the canonical implementation on the JVM relies on serializing threads. With Clojure, we represent behavioral threads as data. This opens the door to a lot of nice tooling, such as program explorer GUIs and durable execution.</p>
<p>I previously wrote an article expanding on this question <a href="https://thomascothran.tech/2024/10/a-new-paradigm/">here:</a>.  <br></p>
<hr>
<h3 id="alex-coyle">Alex Coyle</h3>
<p><a href="https://github.com/alza-bitz">https://github.com/alza-bitz</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
My <a href="https://github.com/alza-bitz/snowpark-clj">Clojure API for Snowflake:</a></p>
<p>This project is non-commercial and open-source. I planned to develop and test it in collaboration with academics, data scientists and others in the Clojure community, in order to help solve real-world data challenges.</p>
<p>The aims are as stated in the readme, with specific focus on extending the <a href="https://github.com/alza-bitz/snowpark-clj/blob/main/doc%2Fapi-coverage.md">API coverage</a> and adding <a href="https://github.com/alza-bitz/snowpark-clj/blob/main/.github/instructions/problem_statement_and_requirements.instructions.md#features-that-are-planned-but-have-not-yet-been-elaborated">features that are planned but not yet elaborated</a></p>
<p>Note: the build is only failing because my Snowflake license has expired.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I recently wrote on Civitas concerning the extent of Clojure support for the popular on-cluster data tools and why it&rsquo;s important. In the article I also introduced my new Clojure API for <a href="https://clojurecivitas.github.io/data_engineering/support_for_popular_data_tools/snowflake.html">Snowflake:</a></p>
<p>I believe these efforts are beneficial to Clojure because it puts the language in front of a different community and makes it more accessible in a space where it doesn&rsquo;t really have any visibility at the moment.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
This proposal isn&rsquo;t strictly limited to Snowflake, the scope could most definitely include other on-cluster tools that I write about in my article. For example, I identified some key fixes and improvements for using Spark from Clojure, either to be made in the existing Geni library or in a completely new library:</p>
<ol>
<li>Supporting <a href="https://spark.apache.org/docs/latest/spark-connect-overview.html">Spark Connect:</a>. This would reduce the complexity of using Spark SQL &amp; Dataframe APIs directly from the Clojure REPL and also align with client usage for GoLang, Python, etc. I already did <a href="https://github.com/zero-one-group/geni/issues/345">some investigation on this:</a></li>
<li>Supporting <a href="https://github.com/zero-one-group/geni/issues/356">Databricks:</a>   <br></li>
</ol>
<hr>
<h3 id="jeremiah-coyle">Jeremiah Coyle</h3>
<p><a href="https://github.com/paintparty">https://github.com/paintparty</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
These are the 5 projects that I have been working on in 2025, and plan to continue working on in 2026. All are fairly mature alpha-stage projects.</p>
<p><strong>Project #1 Bling</strong><br>
<a href="https://github.com/paintparty/bling">Bling provides hifi console printing for Clojure, ClojureScript, and Babashka.</a><br>
Thanks to the generous support from Clojurists Together, I&rsquo;m happy to report that a great deal of progress was made in Q2 of 2025. Building on the momentum, I would love to continue to grow and improvement the project going forward.</p>
<p>The 2026 Roadmap for Bling can be found <a href="https://github.com/paintparty/bling/blob/main/resources/docs/Bling-2026-roadmap.md">here:</a></p>
<p><strong>Project #2 - Kushi</strong><br>
Kushi is UI design library for ClojureScript<br>
<a href="https://github.com/kushidesign/kushi">Source repo:</a><br>
<a href="https://kushi.design/">Interactive docs:</a></p>
<p>Progress in 2025:<br>
Thanks to the generous support of an experimental projects grant from Clojurists Together in Q3 of 2024, great progress was made towards the goal of delivering a rich, first class, Clojure(Script)-native UI framework for building and evolving web projects. That momentum was leveraged to maintain an increased focus on the project in Q1 of 2025, with an emphasis on refining the architecture and performance of the build system. In q2, I updated the design for the project splash page. I resumed work on the project in Q3 &amp; Q4, concentrating on the Malli-driven runtime safety / warning system, as well as rethinking and implementing an improved shared property system for styling of the library of stock UI components.</p>
<p><strong>Goals for Kushi in 2026:</strong></p>
<ol>
<li>Continued refinement of the build system. This part of the project has recently been re-written and evolved to efficiently precompile all css via source analyzation at build-time. The build system currently assumes shadow-cljs. I would like to keep it moving in the direction it is currently headed, towards a completely standalone side-process.</li>
<li>The styling story is very much evolving in a direction which promotes the tweaking of UI via making adjustments to Kushi’s well-thought-out design token system. In concert with the pre-built ui components, this means there is a reduced need for CSS and style syntax within components themselves.</li>
<li>Like most UI libs, Kushi is designed to be agnostic with regard to the underlying rendering framework. I am currently working towards providing a comprehensive quickstart kitchen-sink project for both Reagent and Uix.</li>
<li>Add more functionality, docs, and examples for working with the <code>kushi.playground</code> namespace. The playground gives the user an elegant way to build their own white-labeled interactive documentation site that features Kushi base components in addition to any custom components specific to their project. It is similar to Storybook.js or Portfolio (cjohansen/portfolio). The playground namespace was used to create the current project website at kushi.design. I would like to add a separate section for configurable cut-and-paste Design Blocks. Design Blocks are like recipes for composing library UI primitives into common UI patterns. Many of these could be transpiled from existing open-source examples in mainstream JS-land. I think this could offer tremendous value when combined with the above mentioned universal component transpiler.</li>
<li>Design and implement 4-5 global themes, using a variety of styles, and incorporate them via a theme switcher into the kushi.design site. I think this would open up a lot of possibilities for users. I am confident that the implementation of this will pave the way for a next-level experience of pre-tuning a design system. On any given team, something like this this could be used in collaboration with a non-technical designer to save weeks of time.</li>
<li>Add additional ui library components. Components followed by an asterisk are internally complete and just need to be turned into public functions with documentation:
<ul>
<li>Avatar*</li>
<li>Tabs*</li>
<li>Blockquote</li>
<li>Treeviewer</li>
<li>Carousel</li>
<li>Dropdown menu</li>
<li>Context menu (right-click)</li>
<li>Table</li>
<li>Data List</li>
<li>More card layouts (with inset margins)</li>
<li>Keyboard input / hotkey e.g. <code>⌘ C</code> styled as button</li>
<li>Aspect Ratio (displays content within a desired ratio)</li>
<li>Wrapper for native color picker input</li>
</ul>
</li>
<li>Browser-based interactive design tweaking, with round trip to file system. An initial spike was prototyped last year, and I have since been wanting to revisit the idea. Even a simple version of this that worked reliably could massively reduce iteration cycles when implementing a dense, highly-polished UI.</li>
</ol>
<p><strong>Project #3 - Fireworks</strong><br>
<a href="https://github.com/paintparty/fireworks">Fireworks is a themeable tapping library and color pretty-printing engine.</a></p>
<p>Thanks to the generous support from Clojurists Together, I&rsquo;m happy to report that a great deal of progress was made in Q3 of 2025. Building on the momentum, I would love to continue to grow and improve the project going forward.</p>
<p>Goals for Fireworks in 2026:</p>
<ul>
<li>Address all current issues (mostly enhancements)</li>
<li>Editor extensions/integrations have been created for Cursive and VSCode. Initial work has commenced on an Emacs integration. I would like to turn the existing VSCode Joyride user script into an actual VSCode extension, in order to provide an even smoother beginner experience.
<ul>
<li><a href="https://github.com/paintparty/fireworks/blob/main/docs/editors/cursive/cursive.md">https://github.com/paintparty/fireworks/blob/main/docs/editors/cursive/cursive.md</a></li>
<li><a href="https://github.com/paintparty/fireworks/blob/main/docs/editors/vscode/vscode.md">https://github.com/paintparty/fireworks/blob/main/docs/editors/vscode/vscode.md</a></li>
</ul>
</li>
<li>Produce written and/or video documentation of my current live hot-reloading dev environment for JVM Clojure, with versions for both Leiningen and Deps. I recently got a PR merged that adds this to <a href="https://github.com/jakemcc/test-refresh/pull/91">test-refresh</a>.</li>
<li>For ClojureScript developers using Fireworks in a browser dev console, I made a dedicated Chrome extension to enable the setting of the Chrome DevTools console background and foreground color with a very nice GUI interface. Would be cool to get updated and also work in most other [Chromium-based browsers, and potentially Firefox, if there is any demand for it.](<a href="https://github.com/paintparty/fireworks?">https://github.com/paintparty/fireworks?</a>  tab=readme-ov-file#setting-the-background-color-and-font-in-chrome-devtools-clojurescript)</li>
</ul>
<p><strong>Project #4 - Domo</strong><br>
<a href="https://github.com/kushidesign/domo">Domo is a modern ClojureScript DOM utility library.</a></p>
<p>Goals for Domo in 2026:</p>
<ul>
<li>Write quality docstrings with examples for all 82 public functions.</li>
<li>Add simple validation and dev-time warnings for all public functions (very useful when working with the DOM). Make sure this code is elided for production builds so as not to add extra weight</li>
<li>Continue to add useful utility functions as the need for them arises within the context of real-world project work.</li>
<li>Add more tests to the existing browser test suite at in <code>starter.browser.browser-tests.cljs</code> namespace.</li>
<li>The <code>starter.browser</code> namespace in the examples/browser dir currently serves as a quickstart and (exhaustive) API tour. I would like to get user feedback on this to determine its effectiveness/usefulness.</li>
<li>Many of the core functions should “just work” as they are written in the context of a Squint project. I would like to make most, if not all of the public API available in Squint-land.</li>
</ul>
<p><strong>Project #5 Lasertag</strong><br>
<a href="https://github.com/paintparty/lasertag">Lasertag is a utility for categorizing types of values in Clojure, ClojureScript, and Babaskha.</a></p>
<p>Goals for Lasertag in 2026:</p>
<ul>
<li>Solidify current public API</li>
<li>Extensive coverage for all Java and Javascript types/classes</li>
<li>Extensive test suite for all types and classes</li>
<li>Make cool demo for usage in ClojureScript</li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I believe work on these projects could benefit the Clojure community for the following reasons (listed out project-by-project):</p>
<p><a href="https://github.com/paintparty/bling"><strong>#1 - Bling</strong></a></p>
<p>Many mature language communities have a library for rich text printing in the terminal, for example Rich (Python), Chalk (JS), LipGloss (Go), etc.</p>
<p>With Clojure, the main existing option seems to be org.clj-commons/pretty. The original impetus for creating Bling came out of my experience of trying to use Pretty extensively for formatting error and warning messages.</p>
<p>The most unique thing that Bling offers is a carefully curated palette of 11 basic colors which are readable on both light and dark backgrounds. Because these colors are located in the 16-255 ansi range, they are guaranteed to look the same on almost any terminal, regardless of the user&rsquo;s terminal theme. Other libraries, including Pretty, leave the colorizing up to the user&rsquo;s terminal emulator profile/theme, which often leads to wildly different colorized output in the user space.</p>
<p>Bling also offers two simple functions for creating &ldquo;blocks&rdquo; of text in the console. Check out the readme for exhaustive visual examples - These can be semantically colored (errors, warnings, info). Bling also offers a simple function for constructing a point-of-interest diagram, like when you want to call out the namespace, line, column and show some source code with a red squiggly underline. I think the Clojure community would benefit from more library authors adding neatly-formatted, actionable warning and error messages to their codebases. It would also be great if such warnings and messages where formatted in a way that loosely followed some set of conventions. Perhaps Bling could play a small role in fostering this within the Clojure community.</p>
<p><a href="https://kushi.design/"><strong>#2 - Kushi</strong></a> <br>
Kushi aims to provide a complete solution to the design layer of web UI projects.
It is an ambitious project, but I believe there is an opportunity for Kushi to offer a UI dev experience that is unique and more compelling than any equivalent in any other language. This could lead to increased organizational awareness and consideration of ClojureScript as an attractive choice for building mission-critical UI. If more companies used ClojureScript to build UI, I think it would be very beneficial for the community.</p>
<p><a href="https://github.com/paintparty/fireworks"><strong>#3 - Fireworks</strong></a> <br>
Fireworks is the only lib to provide a colorizing and themeable pretty-printer that works beautifully in both Clojure and ClojureScript (and Babashka).</p>
<p>The output is, arguably, orders of magnitude faster and easier to read than equivalent output from clojure.pprint/pprint. This is especially true in the case of maps with data-structures as keys, or any kind of collection that features metadata.</p>
<p>The library also provides very powerful debugging and tapping macros. These macros provide a lightweight complement to discovery-centric, UI-heavy data exploration tools such as Portal and Flowstorm. With a simple hot-reloading setup in clj or cljs, and minimal editor integration (now available in Cursive and VSCode), Fireworks can drive an extremely compelling live-feedback dev experience without any reliance on a repl connection, or repl-related concepts. I think the continued codification, documentation, and demonstration of such a workflow could make a difference in the on-ramping of newcomers to Clojure. The maturation of this kind of workflow could also benefit existing users of similar community tools such as playback, debux, hashp, telemere, ken, spyscope, omni-trace, postmortem, and sayid.</p>
<p><a href="https://github.com/kushidesign/domo"><strong>#4 - Domo</strong></a> <br>
This lib has been slow-cooking over a 3 years to serve various web projects, including Kushi.
The syntax is very Clojure-y, and feels much nicer than writing gnarly JS interop code.
To my knowledge, there are only a few ClojureScript DOM libs (Dommy, Enlive, Enfocus), and all were written 9-10 years ago.</p>
<p>Compared to these libs, Domo offers even more specific functionality across 83 public functions and macros such as:</p>
<ul>
<li>copy-to-clipboard</li>
<li>Getting viewport information</li>
<li>Geometry for elements</li>
<li>Getting screen quadrant for element or event</li>
<li>Attribute querying and manipulation</li>
<li>Computed styles of elements</li>
<li>Adding, removing, and toggling attributes and classes</li>
<li>Optional zipper-like syntax for selecting elements</li>
<li>matches-media? helpers</li>
<li>a11y-friendly on-mouse-down helper (zippier alternative to on-click)</li>
<li>Helper for keyboard-based tab navigation</li>
<li>&amp; much, much more!</li>
</ul>
<p><a href="https://github.com/paintparty/lasertag"><strong>#5 - Lasertag</strong></a> <br>
Lasertag is a utility library that was spun out of Fireworks. I believe it to be quite unique in the current landscape of cljc libraries that deal with reflection and categorization of values.</p>
<p>lasertag.core/tag-map makes it easy to get detailed information about values, particularly in the context of interop with Java or JavaScript.</p>
<p>I think that Lasertag could potentially offer great utility to rich-tooling projects developed in the Clojure community of the present and future.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Very much appreciate the recent support from Clojurists Together for these projects, would love to keep it going!  <br></p>
<hr>
<h3 id="eric-dallo">Eric Dallo</h3>
<p><a href="https://github.com/ericdallo">https://github.com/ericdallo</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
<a href="https://github.com/editor-code-assistant/eca"><strong>ECA (Editor Code Assistant)</strong></a> <br>
This project was born 5 months ago (with clj-together&rsquo;s help!) and it&rsquo;s growing, there are so many improvements to this project related to features and parity with other big tools like Claude/Cursor, compatibility with more editors, fix and support community issues.
This AI tool is written in Clojure but works in any language which is huge for discoverability of Clojure community outside Clojure bubble, it has a lot of potential in my opinion, and projects for each editor to maintain and evolve.</p>
<p><a href="https://github.com/clojure-lsp/clojure-lsp"><strong>Clojure-lsp</strong></a> <br>
I want to work on custom code actions, support for new clojure.java.javadoc lib, improve java interop support like go to class locations, methods etc, lots of this would require me working in clj-kondo too</p>
<p><a href="https://github.com/ericdallo/metrepl"><strong>metrepl</strong></a><br>
I want to help with guide and examples of metrics of your repl and how that can help companies understand developers REPL usage</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I believe those are really important tools for the developer, especially clojure-lsp and ECA which run in all major editors during daily programming. In my opinion, developer tools for programming are critical for user happiness with Clojure language, especially new users arriving in the Clojure land.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Thank you for the magnificent work you do!  <br></p>
<hr>
<h3 id="dragan-djuric">Dragan Djuric</h3>
<p><a href="https://dragan.rocks">https://dragan.rocks</a>, <a href="https://github.com/uncomplicate">https://github.com/uncomplicate</a></p>
<p><strong>What do you plan to work on throughout the year?</strong></p>
<p><strong>Uncomplicate,  Neanderthal, Clojure AI and ML</strong><br>
My goal with this funding in 2026 is to continuously develop Clojure AI, ML, and high-performance
ecosystem of Uncomplicate libraries (Neanderthal and many more), on Nvidia GPUs, Apple Silicon, and traditional PC.</p>
<p>In this year, I will also focus on writing tutorials on my blog and creating websites for the projects involved, which is something that I wanted for years, but didn&rsquo;t have time to do because I spent all time on programming.</p>
<p><strong>This work will highly benefit the Clojure community</strong> as this is THE AI ecosystem for Clojure,
and supporting AI is arguably the main focus on probably all software platforms.
Clojure has something to offer on that front, beyond just calling OpenAI API as a web service!</p>
<p>Uncomplicate grew to quite a few libraries (of which some are quite big; just Neanderthal is 28,000 lines of
highly-condensed, aggresively macroized, and reusable code): Diamond ONNX Runtime, Neanderthal, Deep Diamond,
ClojureCUDA, ClojureCPP, Apple Presets, ClojureCL, Fluokitten, Bayadera, Clojure Sound, and Commons.</p>
<p>Here&rsquo;s a word or two of how I hope to improve each of these libraries with Clojurists Together funding in 2026.</p>
<p><strong>Neanderthal (Clojure&rsquo;s alternative to NumPy, on steroids)</strong><br>
In 2025, Neanderthal celebrated its 10th birthday. It started as a humble but fast matrix and vector library
for Clojure, but after 10 years of relentless improvements, now it boasts a general matrix/vector/linear algebra API
implemented by no less than 5(!) engines for CPUs, GPU (Nvidia CUDA), GPU (OpenCL: AMD, Intel, Nvidia), Apple Silicon (Accelerate),
and general CPU (OpenBLAS). And this is not a superficial support for the sake of ticking a checking; each of these
engines support much more operations on exotic structures, and configuration options, than I&rsquo;ve seen elsewhere.
It has almost everything, but it doesn&rsquo;t (YET!) have a METAL-based engine for Apple GPUs. Let&rsquo;s work on that!</p>
<p><strong>Deep Diamond (the Clojure Tensor and Deep Learning library, not quite unlike PyTorch, but of different philosophy)</strong><br>
In 2019, I started Deep Diamond as a demo showcase for Neanderthal&rsquo;s capabilities as the foundation
for high-performance number-crunching software. It quickly outgrew that, and became a general Tensor/Deep Learning
API, implemented by several fast, native optimized, backends, that run on both CPUs and GPUs, across
hardware platforms (x86_64, GPUs, arm64, Apple Silicon, you name it) and operating systems (Linux, MasOS, Windows).
Of course, it does not clash with Neanderthal, but complements it, in the best manner of highly focused
Clojure libraries that do one job and do it well.</p>
<p>Deep Diamond is quite capable, but it cries for a METAL-based engine for Apple GPUs, too.</p>
<p><strong>Diamond ONNX Runtime (the Clojure library for executing AI models)</strong><br>
This is the latest gem in Uncomplicate&rsquo;s store, and I developed it thanks to Clojurists Together
funding in Q3 2025. Similarly to how I started Deep Diamond mainly as a teaching showcase for Neanderthal,
I started this to show Clojure programmers how close we, Clojurists, are to the latest and shiniest AI stuff
that everyone&rsquo;s raving about. But of course, being close does not mean that we can close the gap
to the multi-billion funded Python ecosystem in a few afternoons. It needs laser-focused development
and knowing what to do, when, and where. Nevertheless, Clojure <em>is there</em>. Now we can run inference on the trained models
from Hugging Face and other vibrant AI communities directly in Clojure&rsquo;s REPL. Does this make an effortless billion-dollar
AI startup? NO. Does it bring Clojurians to the party? YES! And there&rsquo;s more to come.</p>
<p>Not only that this library is new, but the whole wider ecosystem exploded in the last year
with the wide availability of open-weights model that you can run at home. So, lots of functionality
is added upstream all the time, and I hope to be able to stay current and have the best and newest stuff in Clojure..</p>
<p><strong>ClojureCUDA (REPL-based low-level CUDA development)</strong><br>
Not many Clojurians may prefer to work with GPU directly, or to write their own kernels. Neither do I.
But, this library is one of the un-celebrated workhorses that enables me to implement whatever I want
in Neanderthal, Deep Diamond, and Diamond ONNX Runtime, instead of just trying to wrap whatever there
is in upstream C++ libraries. ClojureCUDA gives us the superpower of choice: wrap whatever works,
but then implement the missing parts yourself!</p>
<p>As CUDA is receiving a steady stream of changes and improvements, I&rsquo;d like to improve and extend
ClojureCUDA to always be in top shape! It is not as easy as it seems to the casual onlooker.</p>
<p><strong>ClojureCPP (the gateway to native C++ libraries)</strong><br>
From 20,000 feet, integrating a native library to JVM and Clojure may look straightforward.
Oh, how wrong they are. Virtually every C++ library is a special kind of jungle, with its
own structures, patterns and inventions. What might seem a minor technical detail might
require special acrobatics to support it on the JVM. Masking that mess under the hood
so that a Clojurian do not need to care might be insanely brittle if it weren&rsquo;t for
ClojureCPP! It is not as large as Neanderthal or Deep Diamond, but it is one of the reasons
that enables these upper level libraries stay on the 25,000 or 3,000 lines of code mark,
instead of being 500,000 or 50,000, as many of their counterparts in other languages.</p>
<p><strong>Apple Presets (native JNI bindings for various Apple libraries)</strong><br>
Yup. To support Apple Silicon in Neanderthal and Deep Diamond I had to make these bindings,
since there weren&rsquo;t any to &ldquo;just&rdquo; wrap. And to support more Apple high performance computing apis,
I&rsquo;ll have to create additional bindings (for example, for METAL) and only then
develop the Clojure part.</p>
<p><strong>Fluokitten, Bayadera, ClojureCL, Commons, Clojure Sound, etc.</strong><br>
These libraries will not be in focus in 2026., but will probably need some care and
assorted improvements here and there.</p>
<p><strong>Summary:</strong>
In short, my focus with this funding with Clojurists Together will have two main branches:</p>
<ol>
<li>Development of new functionalities, supporting more hardware and platforms for existing functionality,
and fixing issues for a dozen Uncomplicate libraries that already exist. This is what is described
in the text you&rsquo;ve just read.</li>
<li>Develop an unified website for Uncomplicate and stuff it with useful information in one place.
Currently, some libraries have websites that I wrote many years ago, while some rely
on GitHub Clojure tests, in-code documentation, tutorials on dragan.rocks and my books.
There are many resources, some of which are quite detailed (2 full books!), but people
without experience (which is the majority of Clojure programmers) have a hard time using all these in organized way.<br>
I hope to solve this with the unified website!</li>
</ol>
<p><strong>Projects directly involved:</strong><br>
<a href="https://github.com/uncomplicate/diamond-onnxrt">https://github.com/uncomplicate/diamond-onnxrt</a><br>
<a href="https://github.com/uncomplicate/neanderthal">https://github.com/uncomplicate/neanderthal</a><br>
<a href="https://github.com/uncomplicate/deep-diamond">https://github.com/uncomplicate/deep-diamond</a><br>
<a href="https://github.com/uncomplicate/clojurecuda">https://github.com/uncomplicate/clojurecuda</a><br>
<a href="https://github.com/uncomplicate/clojure-cpp">https://github.com/uncomplicate/clojure-cpp</a><br>
<a href="https://github.com/uncomplicate/clojurecl">https://github.com/uncomplicate/clojurecl</a><br>
<a href="https://github.com/uncomplicate/apple-presets">https://github.com/uncomplicate/apple-presets</a><br>
<a href="https://github.com/uncomplicate/fluokitten">https://github.com/uncomplicate/fluokitten</a></p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
This will highly benefit the Clojure community as this is THE AI ecosystem for Clojure,
and supporting AI is arguably the main focus on probably all software platforms.
Clojure has something to offer on that front, beyond just calling OpenAI API as a web service!</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong><br>
I&rsquo;m outside the USA and EU, but other than that I guess it&rsquo;s just the usual challenges of open-source developers worldwide.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Yes! Clojurists Together funding in the past years greatly helped me in making Uncomplicate as awesome as it is today. Developing large open source projects for 10 years can be tough!  <br></p>
<hr>
<h3 id="siavash-mohammady">Siavash Mohammady</h3>
<p><a href="https://github.com/siavashmohammady66">https://github.com/siavashmohammady66</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
Easy data dashboard builder like <a href="https://rstudio.github.io/shinydashboard/">Shiny dashboards</a>  + adding capability building dashboard using prompts.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Development productivity is essential for  adaptation of a language, as python &amp; R has such a feature which make life simpler for their data-scientists, Clojure so needs to become a viable data-science alternative choice.  <br></p>
<hr>
<h3 id="nikita-prokopov">Nikita Prokopov</h3>
<p><a href="https://github.com/tonsky">https://github.com/tonsky</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
I want to resume working on Humble UI, a desktop UI for Clojure that is based on Skia and doesn&rsquo;t involve a browser.</p>
<p>In 2024, with Clojurists Together support, we got the basics of layout figured out, implemented a VDOM-like API, and started working on a self-documented component library. We’ve got labels, buttons, scroll containers, splits, and tables.</p>
<p>In 2026, I would like to iron out the underlying API model, so the fundamentals will become stable and Humble can be extended with just implementing more components. I also aim at production-grade multi-line text based on ICU and Harfbuzz, finalizing text inputs, and figuring out packaging. This should get Humble to the point where real-world applications can be built with it.</p>
<p>This will be accompanied by detailed progress reports describing the problem space and thinking process, in the form of <a href="https://github.com/humbleui/humbleui">regular blog posts.</a></p>
<p>In addition to Humble, there’s a small amount of maintenance work with already existing projects like DataScript, clj-reload, Clojure+, fast-edn, Clojure Sublimed, and such.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Desktop UIs are not in a good place right now, with only the viable option being Electron and other web-based solutions. These have downsides of a complex execution model and poor performance.</p>
<p>At the same time, people are getting tired of slow, complex software that runs in a browser and that you can’t own. A lot of things simply can’t be done in a browser, or security is questionable, or it can disappear on a whim.</p>
<p>Clojure really has a chance to make a difference here. Being so pragmatic, dynamic, and extensible, it is nice to use it to build web servers, but I always felt that a huge class of programs &ndash; the ones with GUI &ndash; is missing, and will be a great fit.</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong><br>
I am an immigrant from Russia (living in Germany for 6 years now).</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
I loved working with Clojurists Together in the past &ndash; would love to do it again.  <br></p>
<hr>
<h3 id="james-reeves">James Reeves</h3>
<p><a href="https://github.com/weavejester">https://github.com/weavejester</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
I plan on continuing development on <a href="https://github.com/weavejester/cljfmt">cljfmt</a>, a formatting tool for Clojure that&rsquo;s both a standalone tool, and used in other projects like Clojure-LSP. I&rsquo;m particularly interested in making it easier for people to include custom styling in their libraries, similar to how clj-kondo handles custom linting rules.</p>
<p>I&rsquo;m also working on a stable version of Duct, a data-oriented framework for Clojure based on <a href="https://duct-framework.org/">Integrant</a>. My focus is on ensuring it has excellent documentation and will serve as an easy way to write web applications in Clojure.</p>
<p>In addition to these two projects, I&rsquo;m also maintaining <a href="https://github.com/ring-clojure/ring">Ring</a>. My current goal with Ring is to submit PRs to third-party Ring adapters (like httpkit) that improve their overall compatibility with the Ring specification.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Having a good Clojure formatter keeps codebases consistent and readable.</p>
<p>Having a good and well documented web framework in Clojure gives developers a quick way to get started with a very common use case (web applications).</p>
<p>Finally, increasing compatibility between Ring adapters ensures that developers can create code that isn&rsquo;t tied to a particular adapter.  <br></p>
<hr>
<h3 id="tomasz-sulej">Tomasz Sulej</h3>
<p><a href="https://github.com/genmeblog">https://github.com/genmeblog</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
Here is the set of things I want to do in 2026:</p>
<p><strong><a href="https://github.com/generateme/fastmath">fastmath</a></strong><br>
• Document most of the functions and build more holistic documentation – it’s a really time consuming task, <a href="https://generateme.github.io/fastmath/clay/">current status:</a> <br>
• Validate crucial functions by increasing test coverage<br>
• Implement GAM regression modelling as an enhancement of existing LM and GLM models. PoC is done.</p>
<p><strong><a href="https://github.com/Clojure2D/clojure2d">Clojure2D</a></strong><br>
• Extract a clojure2d.color namespace as a separate library<br>
• Add a SVG drawing support. PoC is done.</p>
<p><strong><a href="https://github.com/generateme/cljplot">cljplot</a></strong><br>
• Revisit currently postponed cljplot library and start to refactor it to give it a new life, inc. the following things:<br>
- Highly decouple chart processing pipeline making each step testable and easy to enhance
- Better use of grammar of graphics concept<br>
- Add SVG rendering<br>
- Build more specific, scientific charts<br>
- (optional) declarative chart generation to allow binding to tableplot library<br>
• Revisit examples and create the library of chart types</p>
<p><strong>Other</strong>
• Review and update the following libraries:<br>
- <a href="https://github.com/scicloj/wadogo">wadogo – scales for charts</a><br>
- <a href="https://github.com/generateme/fitdistr">fitdistr – distribution fitting / modelling</a><br>
- (optional) <a href="https://github.com/generateme/inferme">inferme – Bayesian inference library</a><br>
• Continue an user support which I do online though Slack/Zulip chats.<br>
• Prepare workshops and talks for incoming Clojure Jam / <a href="https://clojurecivitas.github.io/scicloj/clojure_jam/clojure_jam_2026">Clojure Creative Coding conference in April 2026</a><br>
• Build more Clojure Civitas notebooks showing Clojure2d capabilities.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I&rsquo;m a creator and maintainer of several projects in the mathematics, data science and visualization areas which I did under the nickname GenerateMe/genmeblog. My main and notable projects are:<br>
•	tablecloth - a dataset library<br>
•	fastmath – general mathematics and science library<br>
•	clojure2d – visualization library<br>
•	clojisr - a bridge for seamless R interoperability (co-creator)<br>
•	cljplot - pure Clojure charts library<br>
•	fitdistr - statistical distribution modelling<br>
•	inferme - Bayesian modelling and inference.</p>
<p>As a member of the Scicloj community I want to build much more awareness of these libraries, boost the quality and make better adoption of them in existing or future projects.</p>
<p>My other activities include also mentoring in the <a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">Scicloj open-source mentoring program:</a><br>
2026 funding will help me with to focus on two libraries which are require much more care and quality:</p>
<p>A fastmath is not only a pure math library but aims to be a complete toolset for doing fast scientific and numerical computing in Clojure. My personal goal is to bring the scope of SciPy (Python) or JuliaStats (Julia) suites. I believe that coverage is really high already but still needs a lot of work to validate and document all the functions.</p>
<p>Clojure2d covers not only 2d drawing and binding to Java2d but also allow pixel manipulation, various pixel rendering methods and aims to cover all possible color manipulation functions including color space conversion, palette/gradient generation and colorimetry.</p>
<p>I believe support from  Clojurists Together will help me to focus more on Clojure open source and community support which I’ve been doing for more than 8 years.</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong><br>
No really. But I quit my current job (I&rsquo;m on the C-level, management side in a software house) as of  January 2026 and I am trying  to switch to a Clojure programming side.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
As a Scicloj member I would like to be more visible next year in various on/offline activities like conferences, meetups, jams etc. The first opportunity will be on the <a href="https://scicloj.github.io/clojure-jam-2026/">Clojure Jam 2026,</a> where I plan to present details of fastmath/clojure2d libraries as a creative toolset and also host some workshop around the topic.  <br></p>
<hr>
<h3 id="peter-taoussanis">Peter Taoussanis</h3>
<p><a href="https://www.taoensso.com/clojure">https://www.taoensso.com/clojure</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
Multiple projects, incl. significant work on Nippy and Carmine, possibly working on Babashka support for more libraries (e.g. Telemere)</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
<strong>Nippy:</strong> want to experiment with porting a subset of Nippy (binary serialization library) to ClojureScript. Nippy&rsquo;s pretty widely used, and it&rsquo;d be nice to have data portability between Clj and Cljs. Recently worked on a Clj/s implementation of MessagePack, which ended up being a nice PoC for this effort. MessagePack itself isn&rsquo;t ideal for Clojure data though, we can do better with a Clojure-first format. A cross-platform Nippy would be particularly useful for Sente and Clojure/Script web apps.</p>
<p><strong>Carmine:</strong> recently (finally!) pushed the first publicly available version of the core v4 API, but there&rsquo;s still tons of work to do to get it properly polished and documented for wider use. Also seeing increased enquiries recently re: Redis Cluster and/or Sentinel. Have an early prototype ready for Sentinel support, and foundations laid for Cluster - but both would also require substantial effort to bring to a usable state. This alone would probably be several months of work to do right.</p>
<p>Increased Babashka support: plenty of folks have asked for this, esp. re: Telemere. Expect this may also be a non-trivial job, but should be doable in steps. Would need to investigate further re: specific timeline, etc.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Would just make a similar statement to last year: I&rsquo;m super grateful to have been able to receive support from Clojurists Together for the past few years. From my side I&rsquo;d of course be thrilled to continue as long as the community sees value in my work.</p>
<p>But I also totally understand if it&rsquo;s not possible to continue with funding - I know you must get a lot of great applications each year!</p>
<p>Whatever the outcome re: funding I&rsquo;ll of course keep trying to contribute where I can.</p>
<p>And again, a big thanks to all the folks quietly keeping Clojurists Together running so well behind the scenes! This has been such a great project, and something awesome to be involved in.  <br></p>
<hr>
<h3 id="jeaye-wilkerson">Jeaye Wilkerson</h3>
<p><a href="https://github.com/jeaye">https://github.com/jeaye</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
I will be working full-time on <a href="https://github.com/jank-lang/jank">jank.</a></p>
<p>jank&rsquo;s alpha release is going out in December 2025, which will lead us into a hectic start to 2026 as we&rsquo;ll be collecting/fixing as many bugs as we can. Meanwhile, I will be developing jank&rsquo;s build system for native system dependencies, improving stability, significantly improving performance, and adding the remaining features to achieve strong Clojure parity (records, protocols, futures, etc). Furthermore, I will be authoring the jank book, which will be a free standalone resource for learning jank (and Clojure), inspired by and very similar to the Rust book.</p>
<p>I will also continue to lead the clojure-test-suite initiative, which provides thorough unit test coverage for all core Clojure functions and is currently serving Clojure JVM, Clojure CLR, ClojureScript, babashka, and jank. I aim to capture ClojureDart and Basilisp in 2026 and I have already started discussions with the creators of both dialects.</p>
<p>I am currently mentoring four different open source contributors, who&rsquo;re learning to be compiler hackers, and I aim to pick up a fifth during 2026. I&rsquo;m specifically looking to add a Clojure lady to the gang and I began outreach for this at the Conj.</p>
<p>Additionally, I will continue streaming on Twitch regularly, to raise Clojure awareness. I will generally use that time to either develop jank itself or to use jank to develop Clojure-related tooling.</p>
<p>Overall, my goal for EOY 2026 is production readiness for jank. This is an aggressive goal, but I will work aggressively on it.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
jank is still the <em>only</em> native Clojure dialect which has its own JIT and embraces interactive programming. It unlocks REPL-driven development for a whole ecosystem previously unserved by Clojure.</p>
<p>Clojurists have demonstrated their desire for native executables with their use of GraalVM. Compared to Graal, jank will offer REPL support, better performance, better native interop, smaller binaries, and faster compilation times.  <br></p>
<hr>
<h3 id="oleksandr-yakushev">Oleksandr Yakushev</h3>
<p><a href="https://github.com/alexander-yakushev">https://github.com/alexander-yakushev</a><br>
<a href="https://github.com/clojure-goes-fast">https://github.com/clojure-goes-fast</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
On Clojure Goes Fast side, during 2025, I&rsquo;ve released several versions of clj-async-profiler (added dynamic diff modes), clj-memory-meter (heap usage tracing), Flamebin (encrypted private flamegraphs). I&rsquo;ve also started working on integrating the latest async-profiler features into clj-async-profiler and transitioning to more compact and efficient JFR-compatible profiles. For 2026, I plan to:</p>
<ul>
<li>Wrap up the JFR transition in clj-async-profiler and upgrade to async-profiler 4.0+.</li>
<li>Release the new flamegraph type that includes the time dimension.</li>
<li>Implement CPU time and allocation heatmaps.</li>
<li>Flamebin: add support for the new flamegraph type supported by clj-async-profiler.</li>
<li>Add the converter between JFR and clj-async-profiler dense profiles, allowing to upload Java Flight Recorder profiles directly to Flamebin.</li>
<li>clj-java-decompiler: add support for alternative decompiler backends (e.g. Fernflower) and make the decompilers pluggable and auto-discoverable via dependencies.</li>
<li>New performance-oriented libraries (e.g., event-passport for efficient in-memory event timestamping).</li>
</ul>
<p>As for CIDER and related tooling, which I returned to as a co-maintainer and primary contributor, a great deal has been achieved in 2025 (multiple big releases of CIDER and nREPL), but there is still a lot to be done:</p>
<ul>
<li>Adopt and modernize refactor-nrepl - a widely used part of CIDER that doesn&rsquo;t currently have an active maintainer.</li>
<li>Rework cider-nrepl codebase to rely less on dependency &ldquo;shading&rdquo; (which is done by mranderson).</li>
<li>Improve and unify nREPL configuration approach.</li>
<li>Enhance CIDER inspector, improve feature discoverability.</li>
<li>Improve multi-REPL experience.</li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Clojure Goes Fast is the centerpiece of Clojure performance-related tools and information (1.2K stars, 2.8M total Clojars downloads, 4000 unique site visitors in 2025, 18k page views).</p>
<p>CIDER is still the most used Clojure IDE according to the last State of Clojure survey. nREPL is the primary backend for all popular Clojure IDEs (including Calva and Cursive).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Annually-Funded Developers&#39; Update: September/October 2025</title>
      <link>https://www.clojuriststogether.org/news/annually-funded-developers-update-september/october-2025/</link>
      <pubDate>Fri, 28 Nov 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/annually-funded-developers-update-september/october-2025/</guid>
      <description>Dragan Djuric, Eric Dallo, Michiel Borkent, Oleksandr Yakushev, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Hello Fellow Clojurists!
This is the fifth report from the 5 developers receiving Annual Funding in 2025. Thanks everyone for the fantastic work!</p>
<p><a href="#dragan-djuric">Dragan Djuric</a>: Clojure ML, Clojure CUDA, Neanderthal, Deep Diamond, Commons<br>
<a href="#eric-dallo">Eric Dallo</a>: ECA, clojure-lsp<br>
<a href="#michiel-borkent">Michiel Borkent</a>: Eucalypt, Reagent, Squint, babashka, and more&hellip;<br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>: CIDER, nREPL, JDK25<br>
<a href="#peter-taoussanis">Peter Taoussanis</a>: Sente, Tempel, Carmine</p>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>2025 Annual Funding Report 5. Published November 9, 2025.</p>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpus) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>Having a decent Apple CPU engine for Neanderthal and a BNNS-based CPU engine for Deep Diamond completed in the previous periods,  my main focus was on improving things achieved in the previous periods to support features and fix bugs that discovered while working on Clojure ML (diamond-onnxrt), the other major project funded by CT.</p>
<p>The first milestone for THIS project is that I supproted Intel&rsquo;s DNNL (the Deep Diamond&rsquo;s CPU backend)
on Apple&rsquo;s MacOS (both arm64 and older intel based). Due to Deep Diamond&rsquo;s flexible design, this required only small changes to DD code, while the main issue was enabling and testing that architecture in the build of upstream libraries.</p>
<p><strong>Several other areas fixed/improved throughout Uncomplicate libraries during this period include:</strong></p>
<ul>
<li>Upgrading CUDA to the major new version 13.0, including improvements in code</li>
<li>Working with upstream libraries on improving support for functionality that we need in Clojure/Uncomplicate</li>
<li>Improving the UX of the distribution of dependency artifacts for CUDA and other dependencies that we use.</li>
<li>Upgrading DNNL to 3.9.2</li>
<li>Enable standalone activations, and other small changes to make sure DD accomodate onnx models inside DD network machinery</li>
<li>Assorted improvements in supported types</li>
<li>Helped in enabling CoreML in upstream onnxruntime build on MacOS</li>
</ul>
<p><strong>I released several new versions of Uncomplicate libraries with these user-facing improvements including:</strong></p>
<ul>
<li>Deep Diamond</li>
<li>Neanderthal</li>
<li>ClojureCUDA</li>
<li>Commons</li>
</ul>
<p><strong>Hammock time.</strong> Researched available native libraries that we can integrate next into Clojure ecosystem, including Nvidia&rsquo;r TensorRT and Triton, Intel&rsquo;s OpenVino, and similar AI-related stuff.</p>
<p>I wrote two tutorials and published them on dragan.rocks blog. They were received quite favorably,
and it seems to me that Clojure programmers are quite eager to learn how to apply the stuff I&rsquo;ve worked on.  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>2025 Annual Funding Report 5. Published November 10, 2025.</p>
<p>In these last 2 months I mainly focused on ECA development and related projects and improvements along with my Clojure Conj talk that&rsquo;s coming this week, excited for it!</p>
<h3 id="ecahttpsgithubcomeditor-code-assistanteca"><a href="https://github.com/editor-code-assistant/eca">eca</a></h3>
<p>ECA (Editor Code Assistant) is a OpenSource, free, standardized server written in Clojure to make any editor have AI features like Cursor, Continue, Claude and others.<br>
There were so many releases and changes to ECA making it way more stable, with new features and fixing lots of bugs, especially with way more people using it daily and contributing!</p>
<h4 id="0440---0781">0.44.0 - 0.78.1</h4>
<p><strong>Most important changes:</strong></p>
<ul>
<li><strong>Hooks support</strong>: This makes ECA one of the few opensource public tools with high customizable hooks support, hooks allow users to react to certain events like pre or post request or tool call.</li>
<li><strong>Rewrite</strong>: A new brand feature allowing to select a code and tell LLM to do something.</li>
<li><strong>Completion (alpha)</strong>: First big step to allow completion, requiring only improvements in LLM output quality via model/prompt tunning.</li>
<li><strong>Plan behavior</strong>: Hugely improve plan behavior, making ECA one of the best tools for planning code changes, really a key feature of ECA.</li>
<li><strong>Clojure MCP integration</strong>: ECA is extensible so we can make it behave differently for MCPs, and we did for clojureMCP with Bruce&rsquo;s help, making ECA show diffs beautifully before they actually happen.</li>
<li><strong>Contexts improvements</strong>: better context management via user/system prompts with options to unwrap files or just mention, making more token effective/controllable.</li>
<li><strong>More providers</strong>: Support google and more providers via more API improvements, making ECA compatible with most models at market and local.</li>
<li><strong>Native tool improving</strong>: Improved lots of ECA tools, based on tests and user feedback, making way more assertive and precise.</li>
<li><strong>Metrics via Opentelemetry</strong>: If you wanna take metrics of prompts and tools, ECA supports that now, really useful for companies that wanna track LLM usage.</li>
</ul>
<p><strong>And many more, check all changes below:</strong></p>
<ul>
<li>Fix regression: completion broken after rewrite feature API changes.</li>
<li>Prefix tool name with server to LLM: <server>__<toolname>. #196</li>
<li>Remove <code>eca_</code> prefix from eca tools, we already pass server prefix (eca) after #196.</li>
<li>Add <code>approval</code> arg to preToolCall hook input.</li>
<li>Add error rewrite message content message.</li>
<li>Fix token renew when using rewrite feature.</li>
<li>Improve rewrite error handling.</li>
<li>Custom providers do not require the existense of <code>key</code> or <code>keyEnv</code>. #194</li>
<li>New feature: rewrite. #13</li>
<li>Updated instructions for <code>/login</code> command and invalid input handling.</li>
<li>Fix server name on <code>chat/contentReceived</code> when preparing tool call.</li>
<li>Fix variable replacing in some tool prompts.</li>
<li>Improve planning mode prompt and tool docs; clarify absolute-path usage and preview rules.</li>
<li>Centralize path approval for tools and always list all missing required params in INVALID_ARGS.</li>
<li>Fix 0.75.3 regression on custom openai-chat providers.</li>
<li>Support custom think tag start and end for openai-chat models via <code>think-tag-start</code> and <code>think-tag-end</code> provider configs. #188</li>
<li>Bump MCP java sdk to 0.15.0.</li>
<li>Add missing models supported by Github Copilot</li>
<li>Fix regression: openai-chat tool call arguments error on some models.</li>
<li>Improve protocol for tool call output formatting for tools that output json.</li>
<li>Fix inconsistencies in <code>eca_read_file</code> not passing correct content to LLM when json.</li>
<li>Improved file contexts: now use :lines-range</li>
<li>BREAKING ECA now only supports standard plain-text netrc as credential file reading. Drop authinfo and gpg decryption support. Users can choose to pass in their own provisioned netrc file from various secure source with <code>:netrcFile</code> in ECA config.</li>
<li>Improved <code>eca_edit_file</code> to automatically handle whitespace and indentation differences in single-occurrence edits.</li>
<li>Fix contexts in user prompts (not system contexts) not parsing lines ranges properly.</li>
<li>Support non-stream providers on openai-chat API. #174</li>
<li>Support use API keys even if subscription is logged. #175</li>
<li>Fix tool call approval ignoring eca tools.</li>
<li>Fix tool call approval ignoring configs for mcp servers.</li>
<li>Fix tool call approval thread lock.</li>
<li>Improve chat title generation.</li>
<li>Fix completion error handling.</li>
<li>Default to <code>openai/gpt-4.1</code> on completion.</li>
<li>Add <code>:config-file</code> cli option to pass in config.</li>
<li>Add support for completion. #12</li>
<li>Run <code>preToolCall</code> hook before user approval if any. #170</li>
<li>Only include <code>parallel_tool_calls</code> to openai-responses and openai-chat if true. #169</li>
<li>Support clojureMCP dry-run flags for edit/write tools, being able to show preview of diffs before running tool.</li>
<li>Assoc <code>parallel_tool_calls</code> to openai-chat only if truth.</li>
<li>Fix regression in <code>/compact</code> command. #162</li>
<li>Fix to use local zone for time presentation in <code>/resume</code>.</li>
<li>Use web-search false if model capabiltiies are not found.</li>
<li>Support <code>/resume</code> a specific chat.</li>
<li>Fix <code>openai-chat</code> api not following <code>completionUrlRelativePath</code>.</li>
<li>Fix web-search not working for custom models using openai/anthropic apis.</li>
<li>Support <code>visible</code> field in hooks configuration to show or not in client.</li>
<li>Deprecate prePrompt and postPrompt in favor of preRequest and prePrompt.</li>
<li>Fix model capabilities for models with custom names.</li>
<li>Fix prePrompt hook.</li>
<li>Add hooks support. #43</li>
<li>Fix regression on models with no extraPayload.</li>
<li>Support multiple model configs with different payloads using same model name via <code>modelName</code> config. (Ex: gpt-5 and gpt-5-high but both use gpt-5)</li>
<li>Add <code>anthropic/haiku-4.5</code> model by default.</li>
<li>Unwrap mentioned @contexts in prompt appending as user message its content. #154</li>
<li>Improved flaky test #150</li>
<li>Obfuscate env vars in /doctor.</li>
<li>Bump clj-otel to 0.2.10</li>
<li>Rename $ARGS to $ARGUMENTS placeholder alias for custom commands.</li>
<li>Support recursive AGENTS.md file inclusions with @file mention. #140</li>
<li>Improve plan behavior prompt. #139</li>
<li>Add support for secrets stored in authinfo and netrc files</li>
<li>Added tests for stopping concurrent tool calls. #147</li>
<li>Improve logging.</li>
<li>Improve performance of <code>chat/queryContext</code>.</li>
<li>Added ability to cancel tool calls. Only the shell tool currently. #145</li>
<li>Bump mcp java sdk to 0.14.1.</li>
<li>Improve json output for tools that output json.</li>
<li>Fix duplicated arguments on <code>toolCallPrepare</code> for openai-chat API models. <a href="https://github.com/editor-code-assistant/eca-emacs/issues/56">https://github.com/editor-code-assistant/eca-emacs/issues/56</a></li>
<li>Add <code>server</code> to tool call messages.</li>
<li>Fix last word going after tool call for openai-chat API.</li>
<li>Fix retrocompatibility with some models not working with openai-chat like deepseek.</li>
<li>Add <code>gpt-5-codex</code> model as default for <code>openai</code> provider.</li>
<li>Support &ldquo;accept and remember&rdquo; tool call per session and name.</li>
<li>Avoid generating huge chat titles.</li>
<li>Add <code>claude-sonnet-4.5</code> for github-copilot provider.</li>
<li>Add <code>prompt-received</code> metric.</li>
<li>Use a default of 32k tokens for max_tokens in openai-chat API.</li>
<li>Improve rejection prompt for tool calls.</li>
<li>Use <code>max_completion_tokens</code> instead of <code>max_tokens</code> in openai-chat API.</li>
<li>Support context/tokens usage/cost for openai-chat API.</li>
<li>Support <code>anthropic/claude-sonnet-4.5</code> by default.</li>
<li>More tolerant whitespace handling after <code>data:</code>.</li>
<li>Fix login for google provider. #134</li>
<li>Fix chat titles not working for some providers.</li>
<li>Enable reasoning for google models.</li>
<li>Support reasoning blocks in models who use openai-chat api.</li>
<li>Support google gemini as built-in models. #50</li>
<li>Deprecate repoMap context, will be removed in the future.
<ul>
<li>After lots of tunnings and improvements, the repoMap is no longer relevant as <code>eca_directory_tree</code> provides similar and more specific view for LLM to use.</li>
</ul>
</li>
<li>Support <code>toolCall shellCommand summaryMaxLength</code> to configure UX of command length. #130</li>
<li>Fix MCP prompt for native image.</li>
<li>Improve progress notification when tool is running.</li>
<li>Bump MCP java sdk to 0.13.1</li>
<li>Improve MCP logs on stderr.</li>
<li>Support tool call rejection with reasons inputed by user. #127</li>
<li>Greatly reduce token consuming of <code>eca_directory_tree</code>
<ul>
<li>Ignoring files in gitignore</li>
<li>Improving tool output for LLM removing token consuming chars.</li>
</ul>
</li>
<li>Fix renew oauth tokens when it expires in the same session.</li>
<li>Fix metrics exception when saving to db.</li>
<li>Fix db exception.</li>
<li>Fix usage reporting.</li>
<li>Return new chat metadata content.
<ul>
<li>Add chat title via prompt to LLM.</li>
</ul>
</li>
<li>Add support for Opentelemetry via <code>otlp</code> config.
<ul>
<li>Export metrics of server tasks, tool calls, prompts, resources.</li>
</ul>
</li>
<li>Use jsonrpc4clj instead of lsp4clj.</li>
<li>Bump graalvm to 24 and java to 24 improving native binary perf.</li>
<li>Avoid errors on multiple same MCP server calls in parallel.</li>
<li>Fix openai cache tokens cost calculation.</li>
<li>Improve welcome message.</li>
<li>Improve large file handling in <code>read-file</code> tool:
<ul>
<li>Replace basic truncation notice with detailed line range information and next-step instructions.</li>
<li>Allow users to customize default line limit through <code>tools.readFile.maxLines</code> configuration (keep the current 2000 as default).</li>
</ul>
</li>
<li>Moved the future in :on-tools-called and stored it in the db. #119</li>
<li>Support <code>compactPromptFile</code> config.</li>
<li>Fix tools not being listed for servers using mcp-remote.</li>
<li>Add <code>/compact</code> command to summarize the current conversation helping reduce context size.</li>
<li>Add support for images as contexts.</li>
<li>Support http-streamable http servers (non auth support for now)</li>
<li>Fix promtps that send assistant messages not working for anthropic.</li>
<li>Fix manual anthropic login to save credentials in global config instead of cache.</li>
<li>Minor log improvement of failed to start MCPs.</li>
<li>Bump mcp java sdk to 1.12.1.</li>
<li>Fix mcp servers default timeout from 20s -&gt; 60s.</li>
<li>Support timeout on <code>eca_shell_command</code> with default to 1min.</li>
<li>Support <code>@cursor</code> context representing the current editor cursor position. #103</li>
<li>Fix setting the <code>web-search</code> capability in the relevant models</li>
<li>Fix summary text for tool calls using <code>openai-chat</code> api.</li>
<li>Bump mcp-java-sdk to 0.12.0.</li>
<li>Added missing parameters to <code>toolCallRejected</code> where possible.  PR #109</li>
<li>Improve plan prompt present plan step.</li>
<li>Add custom behavior configuration support. #79
<ul>
<li>Behaviors can now define <code>defaultModel</code>, <code>disabledTools</code>, <code>systemPromptFile</code>, and <code>toolCall</code> approval rules.</li>
<li>Built-in <code>agent</code> and <code>plan</code> behaviors are pre-configured.</li>
<li>Replace <code>systemPromptTemplateFile</code> with <code>systemPromptFile</code> for complete prompt files instead of templates.</li>
</ul>
</li>
<li>Remove <code>nativeTools</code> configuration in favor of <code>toolCall</code> approval and <code>disabledTools</code>.
<ul>
<li>Native tools are now always enabled by default, controlled via <code>disabledTools</code> and <code>toolCall</code> approval.</li>
</ul>
</li>
<li>Add <code>totalTimeMs</code> to reason and toolCall content blocks.</li>
<li>Add nix flake build.</li>
<li>Stop prompt does not change the status of the last running toolCall. #65</li>
<li>Add <code>toolCallRunning</code> content to <code>chat/contentReceived</code>.</li>
<li>Support more providers login via <code>/login</code>.
<ul>
<li>openai</li>
<li>openrouter</li>
<li>deepseek</li>
<li>azure</li>
<li>z-ai</li>
</ul>
</li>
<li>Remove the need to pass <code>requestId</code> on prompt messages.</li>
<li>Support empty <code>/login</code> command to ask what provider to login.</li>
<li>Support user configured custom tools via <code>customTools</code> config. #92</li>
<li>Fix default approval for read only tools to be <code>allow</code> instead of <code>ask</code>.</li>
<li>Fix renew token regression.</li>
<li>Improve error feedback when failed to renew token.</li>
<li>Support <code>deny</code> tool calls via <code>toolCall approval deny</code> setting.</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>I worked together with @weavejester from cljfmt to fix some bugs and finally deliver vertical alignment of maps to Clojure via LSP!<br>
I should release these changes when coming back from Conj.  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>2025 Annual Funding Report 5. Published November 3, 2025.</p>
<p>In this post I&rsquo;ll give updates about open source I worked on during September and October 2025.<br>
To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work
possible. Without you, the below projects would not be as mature or wouldn&rsquo;t
exist or be maintained at all! So a sincere thank you to everyone who
contributes to the sustainability of these projects.</p>
<img alt="gratitude" src="https://emoji.slack-edge.com/T03RZGPFR/gratitude/f8716bb6fb7e5249.png" width="50px" text-align="center">  
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br">Nubank</a></li>
</ul>
<p>Open the details section for more info about sponsoring.</p>
<details>
<summary>Sponsor info</summary>
<p>If you want to ensure that the projects I work on are sustainably maintained,
you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babashka</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
</details>
<!--

- ls -lat ~/dev
- babashka sub dir checken

-->
<h3 id="updates">Updates</h3>
<p>The summer heat has faded, and autumn is upon us. One big focus for me is
preparing my talk for <a href="https://www.2025.clojure-conj.org/schedule">Clojure Conj
2025</a>, titled &ldquo;Making tools
developers actually use&rdquo;. I did a test run of the talk at the Dutch Clojure
Meetup. It went a bit too long at 45 minutes, so I have to shrink it almost by
half for the Conj. The more I work on the talk the more ideas come up, so it&rsquo;s
challenging!</p>
<p><img width="445" height="414" alt="image" src="https://github.com/user-attachments/assets/fe19fe55-ed04-4645-aaee-6466580aa719" /></p>
<p>Presentation at Dutch Clojure meetup in October 2025.</p>
<p>Of course I spent a ton of time on OSS the past two months as well.
Some special mentions:</p>
<ul>
<li>I&rsquo;m pretty excited by <a href="https://github.com/chr15m/eucalypt">Eucalypt</a>, a remake
of <a href="https://github.com/reagent-project/reagent">Reagent</a> for
<a href="https://github.com/squint-cljs/squint">Squint</a> without React by Chris
McCormick. It lets you build UIs with the Reagent API in less than 10kb of
gzip&rsquo;ed JS. The code was initially generated by an LLM, but now work is going
into making the code base thoroughly tested and simplified where possible.</li>
<li>After studying Eucalypt&rsquo;s code I figured that making an even more minimal
Reagent-like by hand would be fun. This is where I came up with
<a href="https://github.com/borkdude/reagami">Reagami</a>. The API looks like a hybrid
between Reagent and <a href="https://replicant.fun/">Replicant</a>. You can build apps with Reagami starting around 5kb gzip&rsquo;ed.</li>
<li><a href="https://github.com/borkdude/edamame">Edamame</a> got <a href="https://github.com/clojure/clojure-clr">Clojure CLR</a> support thanks to Ambrose Bonnaire-Sergeant.</li>
<li><a href="https://github.com/babashka/sci">SCI</a> Clojure CLR support is underway. The <code>sci.impl.Reflector</code> code, based on <code>clojure.lang.Reflector</code> was ported to Clojure with the purpose that it would then be easier to translate to Clojure CLR.</li>
<li><a href="https://github.com/cljdoc/cljdoc/blob/488fe6282737c1237c5394a66a7e8392a000c6bb/doc/cljdoc-developer-technical-guide.adoc#front-end-code">Cljdoc</a> chose squint for its small bundle sizes and easy migration off of TypeScript towards CLJS</li>
<li>Via work on Squint, I found a way to optimize <code>str</code> in ClojureScript (worst case 4x, best case 200x)</li>
</ul>
<p><strong>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months in detail.</strong></p>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Bump to clojure 1.12.3</li>
<li><a href="https://github.com/babashka/babashka/issues/1870">#1870</a>: add <code>.addMethod</code> to clojure.lang.MultiFn</li>
<li><a href="https://github.com/babashka/babashka/issues/1869">#1869</a>: add <code>clojure.lang.ITransientCollection</code> for <code>instance?</code> checks</li>
<li><a href="https://github.com/babashka/babashka/issues/1865">#1865</a>: support <code>reify</code> + <code>equals</code> + <code>hashCode</code> on <code>Object</code></li>
<li>Add <code>java.nio.charset.CharsetDecoder</code>, <code>java.nio.charset.CodingErrorAction</code>, <code>java.nio.charset.CharacterCodingException</code> in support of the <a href="https://github.com/outskirtslabs/sfv">sfv</a> library</li>
<li>Fix <code>nrepl-server</code> completions and lookup op to be compatible with rebel-readline</li>
<li>Add <code>clojure.lang.Ref</code> for <code>instance?</code> checks</li>
<li>Bump SCI: align unresolved symbol error message with Clojure</li>
<li>Use GraalVM 25</li>
<li>Bump deps.clj to 1.12.3.1557</li>
<li>Change unknown or REPL file path to <code>NO_SOURCE_PATH</code> instead of <code>&lt;expr&gt;</code> since this can cause issues on Windows when checking for absolute file paths</li>
<li><a href="https://github.com/babashka/babashka/issues/1001">#1001</a>: fix encoding issues on Windows in Powershell. Also see this <a href="https://github.com/oracle/graal/issues/12249">GraalVM</a> issue</li>
<li>Fixes around <code>java.security</code> and allowing setting deprecated Cipher suites at runtime. See this <a href="https://github.com/babashka/babashka/commit/ace237832a5844330f5f9c342e1498eb0ca5f7ac">commit</a>.</li>
<li>Support Windows Git Bash in bash install script</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting</p>
<ul>
<li>ClojureCLR support in progress (with Ambrose Bonnaire Sergeant)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/edamame">edamame</a>: configurable EDN and Clojure parser with location metadata and more</p>
<ul>
<li>1.5.33 (2025-10-28)</li>
<li>Add ClojureCLR support (<a href="https://github.com/frenchy64">@frenchy64</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.<br></p>
<ul>
<li>Unreleased</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2651">#2651</a>: resume linting after paren mismatches</li>
<li>2025.10.23</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2590">#2590</a>: NEW linter: <code>duplicate-key-in-assoc</code>, defaults to <code>:warning</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2639">#2639</a>: NEW <code>:equals-nil</code> linter to detect <code>(= nil x)</code> or <code>(= x nil)</code> patterns and suggest <code>(nil? x)</code> instead (<a href="https://github.com/conao3">@conao3</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2633">#2633</a>: support new <code>defparkingop</code> macro in core.async alpha</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/pull/2635">#2635</a>: Add <code>:interface</code> flag to <code>:flags</code> set in <code>:java-class-definitions</code> analysis output to distinguish Java interfaces from classes (<a href="https://github.com/hugoduncan">@hugoduncan</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2636">#2636</a>: set global SCI context so hooks can use <code>requiring-resolve</code> etc.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2641">#2641</a>: fix linting of <code>def</code> body, no results due to laziness bug</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1743">#1743</a>: change <code>:not-empty?</code> to only warn on objects that are already seqs</li>
<li>Performance optimization for <code>:ns-groups</code> (thanks <a href="https://github.com/severeoverfl0w">@severeoverfl0w</a>)</li>
<li>Flip <code>:self-requiring-namespace</code> level from <code>:off</code> to <code>:warning</code></li>
<li>2025.09.22</li>
<li>Remove <code>dbg</code> from <code>data_readers.clj</code> since this breaks when using together with CIDER</li>
<li>2025.09.19</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1894">#1894</a>: support <code>destruct</code> syntax</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2624">#2624</a>: lint argument types passed to <code>get</code> and <code>get-in</code> (especially to catch swapped arguments to get in threading macros) (<a href="https://github.com/borkdude">@borkdude</a>, <a href="https://github.com/Uthar">@Uthar</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2564">#2564</a>: detect calling set with wrong number of arguments</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2603">#2603</a>: warn on <code>:inline-def</code> with nested <code>deftest</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li>Support passing keyword to <code>mapv</code></li>
<li>Inline <code>identical?</code> calls</li>
<li>Clean up emission of paren wrapping</li>
<li>Add <code>nat-int?</code>, <code>neg-int?</code>, <code>pos-int?</code> (<a href="https://github.com/eNotchy">@eNotchy</a>)</li>
<li>Add <code>rand</code></li>
<li>Fix rendering of <code>null</code> and <code>undefined</code> in <code>#html</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/747">#747</a>: <code>#html</code> escape fix</li>
<li>Optimize nested <code>assoc</code> calls, e.g. produced with <code>-&gt;</code></li>
<li>Avoid object spread when object isn&rsquo;t shared (<code>auto-transient</code>)</li>
<li>Optimize <code>=</code>, <code>and</code>, and <code>not=</code> even more</li>
<li><code>not=</code> on undefined and false should return <code>true</code></li>
<li>Optimize code produced for <code>assoc</code>, <code>assoc!</code> and <code>get</code> when object argument can be inferred or is type hinted with <code>^object</code></li>
<li>Optimize <code>str</code> using macro that compiles into template strings + <code>?? ''</code> for null/undefined</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/732">#732</a>: <code>take-last</code> should return <code>nil</code> or empty seq for negative numbers</li>
<li><a href="https://github.com/squint-cljs/squint/issues/725">#725</a>: <code>keys</code> and <code>vals</code> should work on <code>js/Map</code></li>
<li>Make <code>map-indexed</code> and <code>keep-indexed</code> lazy</li>
<li>Compile time optimization for <code>=</code> when using it on numbers, strings or keyword literals</li>
<li>Switch <code>=</code> to a deep-equals implementation that works on primitives, objects, <code>Arrays</code>, <code>Maps</code> and <code>Sets</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/710">#710</a>: add <code>parse-double</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/714">#714</a>: <code>assoc-in</code> on <code>nil</code> or <code>undefined</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/714">#714</a>: <code>dissoc</code> on <code>nil</code> or <code>undefined</code></li>
<li>Basic <code>:import-maps</code> support in <code>squint.edn</code> (just literal replacements, prefixes not supported yet)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/reagami">reagami</a>: A minimal zero-deps Reagent-like for Squint and CLJS</p>
<ul>
<li>First releases</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>Support evaluation of quoted regex</li>
<li>Support macros defined in notebooks</li>
<li>Bump cherry</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/cljs-str">cljs-str</a></p>
<ul>
<li>More efficient drop-in replacement for CLJS str. This work was already upstreamed into CLJS, so coming near you in the next CLJS release.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/unused-deps">unused-deps</a>: Find unused deps in a clojure project</p>
<ul>
<li>Support finding unused git deps</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</p>
<ul>
<li>Fix SCI regression where interop on keywords like <code>(.catch ...)</code> was accidentally munched</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/markdown">Nextjournal Markdown</a></p>
<ul>
<li>Add <code>:start</code> attribute to ordered lists not starting with 1 (@spicyfalafel)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Bump squint compiler common component and standard library</li>
<li>Bump other deps</li>
<li>Optimize <code>=</code>, <code>str</code>, <code>not=</code></li>
<li>Support <code>:macros</code> option + <code>:refer</code> so you can use unqualified macros using compiler state (see <code>macro-state-test</code>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Released several versions catching up with the clojure CLI</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3</p>
<ul>
<li>Add <code>close-connection</code></li>
<li>Fix #38: add <code>get-connection</code> to cache connection</li>
<li>Fix potential memory leak</li>
<li>Better handling of parent process death by handling EOF of stdin</li>
<li><a href="https://github.com/babashka/pod-babashka-go-sqlite3/issues/25">#25</a>: use musl to compile linux binaries to avoid dependency on glibc</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</p>
<ul>
<li>Fix extra newline in codeblock</li>
</ul>
</li>
</ul>
<p>Contributions to third party projects:</p>
<ul>
<li>
<p><a href="https://github.com/clojure/clojurescript">ClojureScript</a></p>
<ul>
<li>Optimize <code>str</code> (4x worst case, 200x best case)</li>
<li>Make <code>munge-str</code> public</li>
</ul>
</li>
<li>
<p><a href="https://github.com/yogthos/Selmer">Selmer</a></p>
<ul>
<li><a href="https://github.com/yogthos/Selmer/commit/7588259c9e356372c0e010594ae0d3d35a89ffca">Handle error for template without closing delimiter</a></li>
</ul>
</li>
<li>
<p><a href="https://github.com/clojure-lsp/clojure-lsp">clojure-lsp</a></p>
<ul>
<li>Optimize <code>:ns-groups</code> handling by caching regex creation and usage</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity
happened in the past month.</p>
<details>
<summary>Click for more details</summary>  
<ul>
<li><a href="https://github.com/babashka/cli">CLI</a>:Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>:babashka filewatcher pod</li>
<li><a href="https://github.com/babashka/sci.nrepl">sci.nrepl</a>: nREPL server for SCI projects that run in the browser</li>
<li><a href="https://github.com/babashka/nrepl-client">babashka.nrepl-client</a></li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</li>
<li><a href="https://github.com/babashka/http-server">http-server</a>: serve static assets</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/borkdude/html">html</a>: Html generation library inspired by squint&rsquo;s html tag</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a>: Use instaparse from babashka</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/borkdude/rewrite-edn">rewrite-edn</a>: Utility lib on top of</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and [tools.bbuild] (<a href="https://github.com/babashka/tools.bbuild):">https://github.com/babashka/tools.bbuild):</a> use tools.deps directly from babashka</li>
<li><a href="https://github.com/babashka/bbin">bbin</a>: Install any Babashka script or project with one command</li>
<li><a href="https://github.com/borkdude/qualify-methods">qualify-methods</a>
<ul>
<li>Initial release of experimental tool to rewrite instance calls to use fully
qualified methods (Clojure 1.12 only)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects.<br></li>
<li><a href="https://github.com/borkdude/tools">tools</a>: a set of <a href="https://github.com/babashka/bbin/">bbin</a> installable scripts</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter</li>
<li><a href="https://github.com/borkdude/speculative">speculative</a></li>
<li><a href="https://github.com/squint-cljs/squint-macros">squint-macros</a>: a couple of
macros that stand-in for<br>
<a href="https://github.com/applied-science/js-interop">applied-science/js-interop</a>
and <a href="https://github.com/funcool/promesa">promesa</a> to make CLJS projects
compatible with squint and/or cherry.</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a>: a leiningen plugin for clj-kondo</li>
<li><a href="https://github.com/http-kit/http-kit">http-kit</a>: Simple, high-performance event-driven HTTP client+server for Clojure.</li>
<li><a href="https://github.com/babashka/babashka.nrepl">babashka.nrepl</a>: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI</li>
<li><a href="https://github.com/babashka/book">babashka.book</a>: Babashka manual</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li>[pod-babashka-lanterna](https://git hub.com/babashka/pod-babashka-lanterna): Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://borkdude.github.io/clj2el/">clj2el</a>: transpile Clojure to elisp</li>
<li><a href="https://github.com/borkdude/deflet">deflet</a>: make let-expressions REPL-friendly!</li>
<li><a href="https://github.com/borkdude/deps.add-lib">deps.add-lib</a>: Clojure 1.12&rsquo;s add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI</li>
</ul>
</details>  
<br>
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p>2025 Annual Funding Report 5. Published November 5 , 2025.</p>
<p>Hello friends! Here&rsquo;s my update on September-October 2025 Clojurists Together work. I was mostly focused on CIDER-related work during these months.</p>
<h3 id="nrepl">nREPL</h3>
<p>nREPL has received <a href="https://github.com/nrepl/nrepl/blob/master/CHANGELOG.md#150-2025-10-15">1.5.0</a> and <a href="https://github.com/nrepl/nrepl/blob/master/CHANGELOG.md#151-2025-10-18">1.5.1</a> updates which improve the reliability of <code>load-file</code> middleware and enable further improvements to CIDER debugger (mentioned below).</p>
<ul>
<li><a href="https://github.com/nrepl/nrepl/pull/393">#393</a>: Add <code>forward-system-output</code> op for forwarding System/out and System/err output to the client.</li>
<li><a href="https://github.com/nrepl/nrepl/pull/386">#386</a>: Add support for <code>XDG_CONFIG_HOME</code>.</li>
<li><a href="https://github.com/nrepl/nrepl/pull/385">#385</a>: Preserve filename in functions compiled during regular eval.</li>
</ul>
<h3 id="cider">CIDER</h3>
<p>We shipped <a href="https://clojurians.slack.com/archives/C06MAR553/p1762335579153309">CIDER 1.20</a> which includes several highly-requested features and fixes.</p>
<ul>
<li>Debugger tags like <code>#dbg</code> are correctly processed when the whole buffer is compiled with <code>C-c C-k</code> (<a href="https://github.com/clojure-emacs/cider-nrepl/pull/951">cider-nrepl#951</a>)</li>
<li>Tidy namespaced keywords in the inspector (<a href="https://github.com/clojure-emacs/orchard/pull/354">orchard#354</a>)</li>
<li>Miscellaneous fixes and improvements to inspector and source file resolution.</li>
</ul>
<h3 id="cider-adjacent-libraries">CIDER-adjacent libraries</h3>
<ul>
<li>Released orchard 0.37.0 and <a href="https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0371-2025-10-14">0.37.1</a>.</li>
<li>Released <a href="https://github.com/clojure-emacs/cider-nrepl/blob/master/CHANGELOG.md#0580-2025-10-16">cider-nrepl 0.58.0</a>.</li>
<li>Released <a href="https://github.com/alexander-yakushev/compliment/blob/master/CHANGELOG.md#071-2025-09-19">compliment 0.7.1</a> (improved handling of namespace aliases)</li>
</ul>
<h3 id="jdk25-release-support">JDK25 release support</h3>
<p>As it happens semi-anually, the release of new JDK prompts ensuring that the libraries and tools are compatible with the newest version.</p>
<ul>
<li>Added JDK25 image to <a href="https://github.com/Quantisan/docker-clojure/pull/266">docker-clojure</a>.</li>
<li>Added JDK25 support to <a href="https://github.com/clj-commons/virgil/blob/master/CHANGELOG.md#050-2025-09-29">virgil 0.5.0</a>.</li>
<li>Updated CI pipelines to test against JDK25 in all CIDER libraries and all <a href="http://clojure-goes-fast.com/">clojure-goes-fast.com</a> tools.  <br></li>
</ul>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>2025 Annual Funding Report 5. Published November 7, 2025.</p>
<h3 id="open-source-update">Open source update</h3>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of <a href="https://www.taoensso.com/my-work#open-source">my open source work</a>! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏<br>
- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<p>Hi everyone, hope you&rsquo;ve all been well! 👋 Almost the end of another year, unbelievable 🫣 Note that some releases ran a bit late this period so were actually published in November, but I&rsquo;m including them here since they&rsquo;re part of my Sep-Oct tasks.</p>
<h3 id="recent-work">Recent work</h3>
<blockquote>
<p>(See <a href="https://www.taoensso.com/news#open-source">here</a> for all releases)</p>
</blockquote>
<h3 id="sente">Sente</h3>
<blockquote>
<p><a href="https://www.taoensso.com/sente">Sente</a> provides an easy-to-use abstraction over WebSockets and AJAX to help write realtime web apps with Clj and Cljs.<br>
Sente v1.21 is <a href="https://github.com/taoensso/sente/releases/tag/v1.21.0">now out</a>!</p>
</blockquote>
<p>This is a <strong>major release</strong> with plenty of new features, performance improvements, reliability improvements, and a number of bug fixes. Big thanks to all contributors and testers! As usual please see the <a href="https://github.com/taoensso/sente/releases/tag/v1.21.0">release notes</a> for details. Some highlights include:</p>
<ul>
<li><a href="https://github.com/taoensso/sente/issues/470">Support</a> for <strong>binary serialization</strong>, and a new high-speed <strong>MessagePack</strong> <a href="https://github.com/taoensso/sente/commit/757ebd26e96762d25ab1153ab1ffbe0063027b16">implementation</a> (<a href="https://github.com/taoensso/sente/wiki/5-Packers#which-to-use">benchmarks</a>)</li>
<li><a href="https://github.com/taoensso/sente/commit/f8a3fad4856a78f341679e5e80ce3bdad7498952">Support</a> for <strong>binary compression</strong>, and a new gzip <a href="https://cljdoc.org/d/com.taoensso/sente/CURRENT/api/taoensso.sente.packers.gzip">implementation</a></li>
<li>A new <strong>lightweight timer</strong> <a href="https://github.com/taoensso/sente/commit/173652df2874b4e6bfc2edb9d884743f8b2d7b2e">implementation</a> based on work from http-kit</li>
<li>Decreased dependency size</li>
<li>Pluggable un+structured logging via <a href="https://www.taoensso.com/trove">Trove</a></li>
</ul>
<h3 id="tempel">Tempel</h3>
<blockquote>
<p><a href="https://www.taoensso.com/tempel">Tempel</a> is a new high-level data security framework for Clojure<br>
After an extended release candidate period, Tempel <a href="https://github.com/taoensso/tempel/releases/tag/v1.0.0">v1 is finally out</a>!</p>
</blockquote>
<p>Tempel provides high-level crypto utils to help <strong>protect user data</strong>. It offers a coherent and opinionated API focused on helping with the toughest parts of actually <strong>using encryption in practice</strong>:</p>
<ul>
<li>Understanding <strong>what keys you&rsquo;ll need</strong> (algorithms, parameters, etc.).</li>
<li>Understanding how <strong>the various algorithms/schemes fit together</strong> (when and how to use hybrid schemes, etc.).</li>
<li><strong>Maintaining best-practices over time</strong> (e.g. auto migrating from compromised algorithms, auto incrementing work factors, etc.).</li>
<li><strong>Key management</strong> (key rotation, password resets, admin backups, etc.).</li>
</ul>
<p>It includes extensive <strong>beginner-oriented</strong> <a href="https://github.com/taoensso/tempel/wiki/1-Getting-started">documentation</a>, docstrings, and error messages.</p>
<p>I&rsquo;m proud of how Tempel came out, and my hope is that it might be a practical and approachable tool that goes beyond the usual &ldquo;here are all these complicated low-level crypto utils, good luck!&rdquo;.</p>
<p>There&rsquo;s a 36 min <a href="https://www.youtube.com/watch?v=sULZVFhR848">demo video</a> (36m) that showcases some if the main functionality.</p>
<h3 id="carmine">Carmine</h3>
<blockquote>
<p><a href="https://www.taoensso.com/carmine">Carmine</a> is a mature, idiomatic <a href="https://www.redis.io">Redis</a> for Clojure</p>
</blockquote>
<p>Carmine <a href="https://github.com/taoensso/carmine/releases/tag/v3.5.0">v3.5.0 is out now</a>, the first major release in &gt;1 year.</p>
<p><strong>This release includes:</strong></p>
<ul>
<li>Structured logging support via <a href="https://www.taoensso.com/trove">Trove</a></li>
<li>Support for the latest Redis commands</li>
<li><a href="https://github.com/taoensso/truss#contextual-exceptions">Truss contextual exceptions</a></li>
<li>Many other small improvements</li>
</ul>
<p>It also includes the first publicly released (though experimental and undocumented!) next-gen Carmine v4 core. This is basically a complete rewrite of Carmine, using the latest Redis protocol - and incorporating tons of performance and flexibility improvements. This has been a very large and ongoing job, and there’s still plenty of work to do. But I now have the new core happily running in a couple production environments, so there’s definite forward progress.</p>
<p>BTW for folks that might not have been following- Redis itself has had a lot of really cool developments recently. The new dev team seems to be doing a great job and has been <a href="https://github.com/redis/redis/releases">very productive</a> re: new features and performance improvements. Salvatore (the original Redis author) is also actively <a href="https://redis.io/blog/welcome-back-to-redis-antirez/">involved again</a>, and introduced a very useful new <a href="https://redis.io/blog/announcing-vector-sets-a-new-redis-data-type-for-vector-similarity/">vector set type</a> that’s a great fit for similarity searching against vectors produced by LLMs, etc.</p>
<h3 id="talk-effective-open-source-maintenance-maintenance">Talk: Effective Open Source Maintenance Maintenance</h3>
<p>So I&rsquo;ve been actively doing Clojure open source now for almost 14 years (cue clichés about time flying). I&rsquo;ve made some observations in that time that I think might be useful, so I recorded a <a href="https://www.youtube.com/watch?v=IlV8R6k8XvY">talk on the subject</a>.</p>
<p>The focus is on better understanding some of the <strong>emotional dynamics</strong> of doing (esp. prolonged) open source work. The talk&rsquo;s directed at <strong>OSS users</strong> and includes actionable tips on how users can help <strong>reduce creator burnout</strong> in some small/simple ways.</p>
<h3 id="other-stuff">Other stuff</h3>
<p>Lots of other small stuff, including minor releases for <a href="https://www.taoensso.com/trove">Trove</a> (modern structured logging facade for Clj/s), and <a href="https://www.taoensso.com/http-kit">http-kit</a> (lightweight HTTP server+client).</p>
<p>And of course the usual support on GitHub and Slack, etc. 👍</p>
<h3 id="upcoming-work">Upcoming work</h3>
<ul>
<li>
<p>Want to focus on ensuring that all pre-existing work is in good shape as the year comes to a close. This&rsquo;ll include updating libraries to sync dependencies, reviewing outstanding issues, updating docs and examples, etc.</p>
</li>
<li>
<p>Have some efficiency improvements planned for <a href="https://www.taoensso.com/nippy">Nippy</a> based on similar optimizations I made while implementing Sente&rsquo;s new MessagePack implementation. Likewise, want to consider adding cross-platform support to Nippy for efficient binary Clj&lt;-&gt;Cljs serialization. That&rsquo;d be something for 2026, though I may start sketching out a prototype soon.</p>
</li>
<li>
<p>First steps toward a big cleanup of <a href="https://www.taoensso.com/encore">Encore</a> to make it smaller and/or more modular. This&rsquo;ll be the first step toward trying to improve Babashka support across more of my libs (esp. Telemere).  <br></p>
</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojars Maintenance and Support: August-October 2025 Update</title>
      <link>https://www.clojuriststogether.org/news/clojars-maintenance-and-support-august-october-2025-update/</link>
      <pubDate>Fri, 28 Nov 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojars-maintenance-and-support-august-october-2025-update/</guid>
      <description>Toby Crawley Reports on Clojars logs, fixes, and updates</description>
      <content:encoded><![CDATA[<h2 id="2025-critical-infrastructure-clojars-maintentance-and-support-update-by-toby-crawley">2025 Critical Infrastructure: Clojars Maintentance and Support Update by Toby Crawley</h2>
<p>August-October, 2025. Published November 22, 2025</p>
<p>This is an update on the work I&rsquo;ve done maintaining <a href="https://clojars.org">Clojars</a> with the support of  Clojurists Together in August through October of 2025. Most of my work on Clojars is reactive, based on issues reported through the community or noticed through monitoring.<br>
If you have any issues or questions about Clojars, you can find me in the <a href="https://clojurians.slack.com/archives/C0H28NMAS"><code>#clojars</code> channel on the Clojurians Slack</a>, or you can file an issue on the <a href="https://github.com/clojars/clojars-web/issues/new/choose">main Clojars GitHub repository</a>.</p>
<p>You can see the <a href="https://github.com/clojars/clojars-web/blob/main/CHANGELOG.org">CHANGELOG</a> for notable changes, and see all commits in the <a href="https://github.com/clojars/clojars-web/compare/759866053761e9f685f52520c61fa2bad10ee4b9...d46668f0e1f535f803ae2b8e110ffcef5ab9f124"><code>clojars-web</code></a> and <a href="https://github.com/clojars/infrastructure/compare/b2e0e61850d9480a7ef16d3dea3075174dd5d862...a89ec7a62f446edb3d095929beb864995e494121"><code>infrastructure</code></a> repositories for this period. I also <a href="https://tcrawley.org/clojars-worklog/">track my work</a> over the years for Clojurists Together (and, before that, the <a href="https://sfconservancy.org/">Software Freedom Conservancy</a>.</p>
<p>Below are some highlights for work done in August through October:</p>
<ul>
<li>I <a href="https://github.com/clojars/infrastructure/commit/a89ec7a62f446edb3d095929beb864995e494121">enabled backups of the artifact repository S3 bucket</a>. I thought I had done this years ago, but had not, so fixed this oversight.</li>
<li>I upgraded Clojars to Clojure 1.12.3 (from 1.12.1) and Java 25 (from 21)</li>
<li>We had a couple of places where invalid input would trigger 500s, which resulted in noise from Sentry. One was <a href="https://github.com/clojars/clojars-web/commit/6524e1f0cfbf086840db8c5334f8530b528438c8">invalid emails on password reset</a>, and the other was <a href="https://github.com/clojars/clojars-web/commit/a72af40bb3427fc1f7e8ec83b330943ce7abac45">null bytes on in project browsing url</a> The latter one was pretty common, as I believe some fuzzing tools do this to try and find vulnerabilities. There are a couple of other places where I need to address them as well.</li>
</ul>
<p>Though after October, I enjoyed the opportunity to chat with Clojars users at Clojure/Conj in Charlotte, NC! It was great to see old friends and make some new ones!</p>
<p><strong>You can find earlier updates re Clojar fixes and updates here:</strong>
<a href="https://www.clojuriststogether.org/news/august-2025-clojars-support-and-q2-project-updates/">March - July 2025</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>November 2025 Short-Term Q3 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/november-2025-short-term-q3-project-updates/</link>
      <pubDate>Fri, 14 Nov 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/november-2025-short-term-q3-project-updates/</guid>
      <description>News from Ambrose Bonnaire-Sergeant, Dragan Duric, Jeaye Wilkerson</description>
      <content:encoded><![CDATA[<p>This is the second project update for three of our Q3 2025 Funded Projects. (Reports for the others are on a different schedule). A brief summary of each project is included to provide overall context. Thanks everyone for your awesome work!</p>
<p><a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
This quarter, I&rsquo;ll be building packages for Ubuntu, Arch, Homebrew, and Nix. I&rsquo;ll be minimizing jank&rsquo;s dependencies, automating builds, filling in test suites for module loading, AOT building, and the Clojure runtime. I&rsquo;ll be working to get the final Clang and LLVM changes I have upstreamed into LLVM 22, adding a health check to jank to diagnose installation issues, and filling in some C++ interop functionality I couldn&rsquo;t get to last quarter.  Altogether, this quarter is going to be a hodgepodge of all of the various tasks needed to get jank shipped.</p>
<p><a href="#malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</a><br>
Malli&rsquo;s core algorithms for transforming schemas into things like validators and generators are quite sensitive to the the input schema. Even seemingly equivalent schemas can have different performance characteristics and different generators.<br>
I would like to create a schema analyzer that can simplify complex schemas,
such that two different but equivalent schemas could have the same representation. Using this analyzer, we can build more efficient validators, more reliable generators, more helpful error messages, more succinct translations to other specification tools, and beyond.</p>
<p><a href="#uncomplicate-clojure-ml-dragan-duric">Uncomplicate Clojure ML: Dragan Duric</a><br>
My goal with this funding in Q3 2005 is to develop a new Uncomplicate library, ClojureML.</p>
<ul>
<li>a Clojure developer-friendly API for AI/DL/ML models (in the first iteration based on ONNX Runtime, but later refined to be even more general).</li>
<li>Implement its first backend engine (based on ONNX Runtime).</li>
<li>support relevant operations as Clojure functions.</li>
<li>an extension infrastructure for various future backend implementations.</li>
<li>a clean low-level integration with Uncomplicate, Neanderthal, Deep Diamond and Clojure abstractions.</li>
<li>assorted improvements to Uncomplicate, Neanderthal, Deep Diamond, to support these additions.</li>
<li>develop examples for helping people getting started.</li>
<li>related bugfixes.</li>
<li>TESTS (of course!).</li>
</ul>
<h3 id="and-now-for-the-reports">AND NOW FOR THE REPORTS!</h3>
<h3 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h3>
<p>Q3 2025 $9K, Report No. 2, Published October 31, 2025</p>
<p>Thank you so much for the sponsorship this quarter! This past month of jank development has been focused on stability of all existing features in preparation for the alpha release in December. Of note, I done the following:</p>
<ul>
<li>Stabilized binary builds for macOS, Ubuntu, Arch, and Nix</li>
<li>Improved <code>loop</code> IR to support native values without boxing</li>
<li>Merged all pending LLVM changes upstream, so jank can build with LLVM 22 (releasing in January 2026)</li>
<li>The lein-jank plugin and template have been improved so that starting a new jank project is now just a couple of commands</li>
<li>libzip has been removed as a dependency, which enables Ubuntu 25.04 support</li>
<li>AOT building on all supported platforms has been stabilized</li>
<li>Added a daily scheduled CI binary package check for macOS, Ubuntu, and Arch</li>
<li>Added runtime type validation for <code>cpp/unbox</code> usages</li>
<li>Added C preprocessor value support, so <code>cpp/FOO</code> can refer to any <code>#define</code></li>
<li>Improved IR gen and static type checking for <code>if</code> so that both branches must provide the same type</li>
</ul>
<p>Normally I have an associated blog post, but as I&rsquo;ll be leaving for Clojure Conj 2025 next week, I&rsquo;m taking the time to polish my talk.  <br></p>
<hr>
<h3 id="malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</h3>
<p>Q3 2025 $0K, Report No. 2, Published November 11, 2025</p>
<p>This month I <a href="https://github.com/metosin/malli/pull/1234">fixed a bug</a> in the work I merged last month: <a href="https://github.com/metosin/malli/pull/1182">Robust :and parser, add :andn</a></p>
<p>The bugfix got me thinking about recursive refs again (following on from my work on recursive generators in malli.generator from a few years ago), which is a major part of the performance work
I proposed for this Clojurists Together project (compiling efficient validators for recursive schemas).</p>
<p>I realized that we can use the cycle detection logic from malli.generator to detect cycles
in validators! A major performance difference between Plumatic Schema/Spec and Malli is in
recursive validators: Malli never &ldquo;ties the knot&rdquo; and will lazily compile and cache
<em>every</em> layer of recursion. This means Malli uses linear space for recursive validators, while
Schema/Spec use constant space, <em>and</em> Malli can never fully compile a recursive validator and
must pay a time cost for compiling schemas at &ldquo;runtime&rdquo; (e.g., when your webserver is accepting requests).</p>
<p>I submitted a Malli &ldquo;discussion&rdquo; PR <a href="https://github.com/metosin/malli/pull/1235">Sketch: tying the knot for ref validator</a> proposing an approach to fixing this performance issue for recursive validators. See the PR if you&rsquo;re interested in the exact details, as it contains a full explanation of the problem and (mostly) the solution, as well as a reference implementation that passes all the tests.</p>
<p>A neat part of this approach is that it is a completely transparent optimization from a user&rsquo;s perspective, with no extra configuration or changes needed. Similar optimizations may be possible for other operations like <code>m/explain</code> and <code>m/parse</code>, but that&rsquo;s future work.</p>
<p>For now, the maintainers showed interest in accepting this optimization and my next step will be to further test and validate the approach, and propose a final PR.  <br></p>
<hr>
<h3 id="uncomplicate-clojure-ml-dragan-duric">Uncomplicate Clojure ML: Dragan Duric</h3>
<p>Q3 2025 $9K, Report No. 2, Published October 31, 2025</p>
<p>My goal with this funding in Q3 2005 is to develop a new Uncomplicate library, ClojureML (see above).</p>
<h3 id="progress-during-the-second-month">Progress during the second month:</h3>
<p>In the first month, I have already implemented the first version, which I released to Clojars
as <code>org.uncomplicate/diamond-onnxrt</code> version 0.5.0.</p>
<p>So, what has been done since then, in the second month?</p>
<p>We are at version 0.17.0 now!</p>
<p>As I already established solid foundations in the first month, in the second month, I focused
on expanding the coverage of ONNX Runtime&rsquo;s C api in Clojure, writing tests to get a feel how
it works, working on hiding the difficult parts under a nicer Clojure API, fixing bugs.
It wasn&rsquo;t always a smooth sail, but with every storm I got a better understanding
of the ways things work in ONNX Runtime, and I also covered most of the API available
by ONNX Runtime version 1.22.2, at least the relevant part that can be used by Deep Diamond right
now (which excludes sparse tensors and string tensors). The majority is covered and well tested.</p>
<p>The second area was using the newly added core API in higher-level integration with Deep Diamond.
The result is that the public onnx function can now be integrated with the rest of DD Tensor machinery!
And the public API that the user has to see is only one function, while everything related to
ONNX is automatically wired under the hood! I am quite pleased with what I achieved on that
front. Of course, I also implemented custom configurations that the user can provide as a
Clojure map, and the underlying machinery will call the right onnx runtime function to set everything up.</p>
<p>The third big area is CUDA support. Since the whole setup up to this point was quite elegant
(I&rsquo;m sorry for having to praise my own work :), especially having lots of supporting functionality
in Deep Diamond and Neanderthal, the Clojure code for this in diamond-onnx was not too demanding.
However, the upstream library for this, namely ONNX Runtime&rsquo;s backend for CUDA, and the build
provided by javacpp-presets, was quite difficult to tame. I had to run many multi-hour C++ compilations,
thaw through C++ compilation errors, dig to unearth causes, finding ways to fix, helping upstream,
and this took lots and lots of time. But, that&rsquo;s what it had to be done. That&rsquo;s why I&rsquo;ll have to wait
for upgrade to the newest ONNX Runtime 1.23.2, but I managed to tame version 1.22.2.</p>
<p>During all this, I did numerous refinements to the codebase, so future library improvements
will be easier. This is not a one-shot, I hope that this library will be a staple in the Clojure AI/ML
community for the years to come, and that I&rsquo;ll be able to further expand it and improve it
as the requirements expand.</p>
<p>I probably forgot to mentioned some stuff that I worked on, too, but I hope I&rsquo;ve mentioned the most important things.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for Applications: 2026 Annual Funding</title>
      <link>https://www.clojuriststogether.org/news/call-for-applications-2026-annual-funding/</link>
      <pubDate>Wed, 12 Nov 2025 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-applications-2026-annual-funding/</guid>
      <description>We will award $1.5K monthly stipends to 5 developers.</description>
      <content:encoded><![CDATA[<p>Greetings folks!</p>
<p>Thanks to our members' generous support, this is the 5th year we we will be awarding annual funding to 5 developers - paid in twelve $1,500 monthly stipends (for a total of $90,000 USD). In the past 4 years, we have seen that giving developers flexible, long-term funding gives them the space to do high-impact work. This might be continuing maintenance on existing projects, new feature development, or perhaps a brand-new project.</p>
<p>We’ve been excited with what they came up with in the last few years and are looking forward to seeing more great work in 2026! Thanks all and good luck!</p>
<h3 id="process">PROCESS</h3>
<p><strong>Apply:</strong> Anyone interested in receiving annual funding submits the <a href="https://forms.gle/tGGTSteAbwENCHgq6">application</a> outlining what they intend to work on and how that work will benefit the Clojure community.  <strong>The deadline for applications is Nov. 25th, 2025 midnight Pacific Time. Please note that past grantees must re-apply each year.</strong></p>
<p><strong>Board Review:</strong> The Clojurists Together board will review the applications and select finalists to present to the members by <strong>Dec. 3rd</strong>.</p>
<p><strong>Members Vote:</strong> The final ballot will go out to members using a <a href="https://www.rankedvote.co/guides/understanding-ranked-choice-voting/how-does-ranked-choice-voting-work">Ranked Vote</a> election to determine the final recipients. As always, your input and participation is important and helps make Clojurists Together effective by ensuring members’ voices inform the work undertaken. <strong>Deadline Dec. 12, 2025 midnight Pacific time</strong>.</p>
<p><strong>Awards will be announced no later than Dec. 18, 2025</strong>.</p>
<p><strong>Project Updates:</strong> Recipients are required to submit a report bi-monthly to the membership.</p>
<p>A special call-out to Latacora, Roam Research, Whimsical, Nubank, Cisco, JUXT, Metosin, Solita, Adgoji, Grammarly, Nextjournal, ClojureStream, Shortcut, Flexiana, Toyokumo,  doctronic, 180° Seguros, bevuta IT GmbH, Jepsen, Xcoo, Sharetribe, Basil, Cognician, Biotz SL, Matrix Operations, Strategic Blue. Eric Normand, Nubizzi, Oiiku, and Singlewire Software. They have all contributed significant amounts to Clojurists Together which lets us award approximately $90,000 in long-term funding to Clojure developers.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2025 Board Election Results. Annual Meeting October 29. </title>
      <link>https://www.clojuriststogether.org/news/2025-board-election-results.-annual-meeting-october-29./</link>
      <pubDate>Thu, 23 Oct 2025 14:09:25 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2025-board-election-results.-annual-meeting-october-29./</guid>
      <description>Reminder Annual Meeting 29 October 10 am PT.</description>
      <content:encoded><![CDATA[<h2 id="2025-board-election-results">2025 Board Election Results</h2>
<p>The Clojurists Together board is happy to announce the results of our <a href="https://www.clojuriststogether.org/news/2025-board-nominations-time-to-vote/">elections</a>. We have two new board members and two returning board members filling our open 2-year slots (Nov. 2025 through Oct. 2027).</p>
<p>-Daniel Compton (returning)<br>
-Heather Moore-Farley (returning)<br>
-Christoph Neumann<br>
-Daniel Slutsky</p>
<p>Thanks to everyone who stood for election, it was an incredibly strong slate of candidates. Board members continuing for the remainder of their 2-year term are  lvh (Board President), Lorelai Lyons, and Maria Geller.</p>
<p>A HUGE SHOUT-OUT AND THANKS to the outgoing board members Felix Barbalet and Max Penet for their years of service to the board and the Clojure community.</p>
<h2 id="annual-meeting-29th-october-10-am-pt">Annual Meeting: 29th October (10 am PT)</h2>
<p>Members, please join us on October 29th (10 am Pacific Time) for our 2025 Annual Board Meeting. You&rsquo;ll find the call in information for Zoom in your email. For anyone that has been thinking about becoming a member (<a href="https://www.clojuriststogether.org/developers/">developers</a> or <a href="https://www.clojuriststogether.org/companies/">company</a>), <strong>now is your time!!</strong></p>
<p>Please contact me if you have any questions at <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a></p>
<p>Kathy Davis, Program Manager, Clojurists Together Foundation</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>October 2025 Short-Term Q3 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/october-2025-short-term-q3-project-updates/</link>
      <pubDate>Tue, 21 Oct 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2025-short-term-q3-project-updates/</guid>
      <description>News from Ambrose Bonnaire-Sergeant, Dragan Duric, Jeaye Wilkerson, Jeremiah Coyle, Roman Liutikov</description>
      <content:encoded><![CDATA[<p>This is the first project update for five of our Q3 2025 Funded Projects. (Reports for the other one are on a different schedule). A brief summary of each project is included to provide overall context. Thanks everyone for your awesome work!</p>
<p><a href="#fireworks-jeremiah-coyle">Fireworks: Jeremiah Coyle</a></p>
<ul>
<li>Publish Fireworks editor plugins/extensions/integrations for Emacs, VS Code, and IntelliJ. These are fairly simple extensions that involve some basic form rewriting for wrapping/unwrapping forms.</li>
<li>Add support for automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">Chalk</a>. <a href="https://github.com/paintparty/fireworks/issues/42">#42</a></li>
<li>Documentation of interactive workflow.</li>
<li>Enhanced documentation for theme creation.</li>
<li>Call-site options for quick formatting changes. For hifi printing, support call-site option to disable all truncation and ellipsis <a href="https://github.com/paintparty/fireworks/issues/14">#14</a></li>
</ul>
<p><a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
This quarter, I&rsquo;ll be building packages for Ubuntu, Arch, Homebrew, and Nix. I&rsquo;ll be minimizing jank&rsquo;s dependencies, automating builds, filling in test suites for module loading, AOT building, and the Clojure runtime. I&rsquo;ll be working to get the final Clang and LLVM changes I have upstreamed into LLVM 22, adding a health check to jank to diagnose installation issues, and filling in some C++ interop functionality I couldn&rsquo;t get to last quarter.  Altogether, this quarter is going to be a hodgepodge of all of the various tasks needed to get jank shipped.</p>
<p><a href="#malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</a><br>
Malli&rsquo;s core algorithms for transforming schemas into things like validators and generators are quite sensitive to the the input schema. Even seemingly equivalent schemas can have different performance characteristics and different generators.<br>
I would like to create a schema analyzer that can simplify complex schemas,
such that two different but equivalent schemas could have the same representation. Using this analyzer, we can build more efficient validators, more reliable generators, more helpful error messages, more succinct translations to other specification tools, and beyond.</p>
<p><a href="#uix-roman-liutikov">UIx: Roman Liutikov</a><br>
I&rsquo;m currently experimenting with auto memoizing compiler for UIx, an optimization similar to React&rsquo;s Compiler <a href="https://react.dev/learn/react-compiler">https://react.dev/learn/react-compiler</a>. This blog post describes the feature in detail <a href="https://romanliutikov.com/blog/bringing-granular-updates-to-react-the-clojure-way">https://romanliutikov.com/blog/bringing-granular-updates-to-react-the-clojure-way</a>. As a result of this work UIx apps should get better baseline performance out of the box, with fewer work needed from developers.</p>
<p><a href="#uncomplicate-clojure-ml-dragan-duric">Uncomplicate Clojure ML: Dragan Duric</a><br>
My goal with this funding in Q3 2005 is to develop a new Uncomplicate library, ClojureML.</p>
<ul>
<li>a Clojure developer-friendly API for AI/DL/ML models (in the first iteration based on ONNX Runtime, but later refined to be even more general).</li>
<li>Implement its first backend engine (based on ONNX Runtime).</li>
<li>support relevant operations as Clojure functions.</li>
<li>an extension infrastructure for various future backend implementations.</li>
<li>a clean low-level integration with Uncomplicate, Neanderthal, Deep Diamond and Clojure abstractions.</li>
<li>assorted improvements to Uncomplicate, Neanderthal, Deep Diamond, to support these additions.</li>
<li>develop examples for helping people getting started.</li>
<li>related bugfixes.</li>
<li>TESTS (of course!).</li>
</ul>
<h3 id="and-now-for-the-reports">AND NOW FOR THE REPORTS!</h3>
<h2 id="fireworks-jeremiah-coyle">Fireworks: Jeremiah Coyle</h2>
<p>Q3 2025 $2K, Report No. 1, Published October 15, 2025</p>
<p>I&rsquo;m happy to report that 2 of the primary goals and 2 of the secondary goals were achieved in the first half of Q3. The remainder of the primary goals will be prioritized for the second half of Q3, and hopefully there will be time to knockout the rest of the secondary goals. Many thanks to Clojurists Together for supporting this work!</p>
<p>Summary of goals achieved in the first half of Q3:<br>
<strong>Primary goals</strong></p>
<ul>
<li>Add support for automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">Chalk</a>.<a href="https://github.com/paintparty/fireworks/issues/42">#42</a> <a href="https://github.com/paintparty/fireworks/pull/76">Completed</a></li>
<li>Support call-site option to disable all truncation and ellipsis  <a href="https://github.com/paintparty/fireworks/issues/14">#14</a> <a href="https://github.com/paintparty/fireworks/commit/d1232b7fe3d522f751009c2cccc8aeca87966d34">Completed</a></li>
</ul>
<br>
<p><strong>Secondary goals</strong></p>
<ul>
<li>Allow for call-site changes to the label color for Fireworks output.  <a href="https://github.com/paintparty/fireworks/issues/53">#53</a> <a href="https://github.com/paintparty/fireworks/pull/76">Completed</a></li>
<li>Add option to the produce bold Fireworks output.  <a href="https://github.com/paintparty/fireworks/issues/70">#70</a> <a href="https://github.com/paintparty/fireworks/pull/76">Completed</a></li>
</ul>
<br>
<p>The latest release is <a href="https://clojars.org/io.github.paintparty/fireworks/versions/0.13.0"><code>v0.13.0</code></a>, which features the enhancements listed above.  <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q3 2025 $9K,  Report No. 1, Published October 1, 2025</p>
<p>Hi folks! Thanks so much for the sponsorship this quarter. To kick it off, I have been focusing on stabilizing jank&rsquo;s seamless C++ interop, which includes more robust handling for C++ enums, pointers to arrays, pointers to functions, implicit conversions, non-type template parameters, lambda captures, initial array support via <code>cpp/aget</code>, and better syntax error detection in the special <code>cpp/value</code> and <code>cpp/type</code> forms. Furthermore, jank&rsquo;s interop support is now robust enough to handle all of jank&rsquo;s <code>clojure.core</code> functions which need interop. This has allowed us to rip out some of the old code which set up those functions from C++ instead.</p>
<p>Aside from robust C++ interop, my focus these past several weeks has been on making jank easy to build and install on major Linux distros and macOS. The main announcement here is that jank now has an Ubuntu PPA which is hosting jank binaries compatible with Ubuntu 24.04 and 24.10. These binaries are built continuously. If you&rsquo;d like to try out the latest version of jank on Ubuntu, you can look at the installation docs <a href="https://github.com/jank-lang/jank/blob/main/compiler+runtime/doc/install.md#ubuntu-linux-2404-2410">here</a>.</p>
<p>Additionally, we now continuously build jank using macOS, as well as the previous Linux setup. While jank already has a build-from-source Homebrew formula, in the coming weeks, we&rsquo;ll also have a binary Homebrew formula so folks on macOS (aarch64) can easily and quickly try out jank.</p>
<p>I have much more detail, if you&rsquo;re interested, in my latest blog post <a href="https://jank-lang.org/blog/2025-10-03-community">here</a>.  <br></p>
<hr>
<h2 id="malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</h2>
<p>Q3 2025 $9K, Report No. 1, Published October 16, 2025</p>
<p>This month I finished some lingering work from earlier in the year, and it is
now merged into Malli&rsquo;s main branch:<br>
<a href="https://github.com/metosin/malli/pull/1182">Robust :and parser, add :andn</a><br>
This work solves a tricky problem inherited from spec&rsquo;s original design.
spec2-alpha provided a solution with its &ldquo;non-flowing and&rdquo; spec, but
in <a href="https://github.com/metosin/malli/pull/1167">prototying a port to Malli</a>
we realized a &ldquo;flowing and&rdquo; schema was difficult to justify, where the parsing
results are passed to the next conjunct&rsquo;s parser. On the other hand, parsing
<code>:and</code> has many use cases.  I proposed instead we:</p>
<ol>
<li>improve <code>:and</code> parsing to be more predictable and</li>
<li>introduce a new schema <code>:andn</code> which parses all its branches, but returns them all independently.</li>
</ol>
<p>The solution to the first problem relies on a new extension point for schemas <code>m/-parser-info</code>which describes the parsing behavior of the schema. Simple schemas like <code>:int</code> and <code>:string</code> have <em>simple</em> or <em>non-transforming</em> parsers, and should return <code>{:simple-parser true}</code>. Compound schemas like <code>:orn</code> return tagged values from parsing that are different from their input, which we designate as <em>transforming</em> parsers (and return <code>nil</code> or don&rsquo;t implement <code>m/-parser-info</code>).
Other parsers are not as clear cut: <code>:or</code> is sometimes one or the other
depending on its children, and most compound schemas inherit parsers from their children.
This is why <code>m/-parser-info</code> is a function, not a static configuration.</p>
<p>We use <code>m/-parser-info</code> to improve <code>:and</code>&rsquo;s parsing behavior by identifying up
to one transforming parser from its children, and designating that as the parser for the
entire schema. The other conjuncts are used only to validate the input value. This
works for unparsing too, but in reverse: the transforming schema is used to unparse the
value, and then the other conjuncts validate the unparsed output value.</p>
<p>An error is thrown if more than one transforming parser is detected when creating
<code>:and</code> [un]parsers. There is a property to override which conjunct to use
for transforming, if any.</p>
<p>Our hope is that the parser analysis is precise enough that it only throws an error
in genuinely problematic cases. So far there have been no reports of real-world problems,
most notably against Metosin&rsquo;s codebase, though it is pre-release at the moment.</p>
<p>Follow-up work on <a href="https://github.com/metosin/malli/issues/1230">improving the parser analysis for regex schemas</a> was identified after a fruitful discussion on the #malli Slack channel. I also successfully used the new abstraction to build a <a href="https://github.com/frenchy64/malli/pull/38">new schema classifier/linter</a> for identifying schemas that &ldquo;roundtrip&rdquo; with respect to <code>(comp (m/unparser s) (m/parser s))</code>.</p>
<p><a href="https://clojurians.slack.com/archives/CLDK6MFMK/p1760417952597889">Malli&rsquo;s new maintainer Matti</a> reached out to me to coordinate my next steps. We hope to merge some of my open PR&rsquo;s and then I will coordinate with community members on the details of the proposed project: an optimizer for Malli schemas.  <br></p>
<hr>
<h2 id="uix-roman-liutikov">UIx: Roman Liutikov</h2>
<p>Q3 2025 $2K, Report No. 1, Published October 15, 2025</p>
<p>Last month I focused on benchmarking and testing auto-memoizing compiler to measure potential gains in real world projects and ensure correctness of the output.</p>
<p>While <a href="https://romanliutikov.com/blog/bringing-granular-updates-to-react-the-clojure-way">synthetic testing</a> showed ~60% improvement in re-render times, in real projects the gain is more conservative, up to 30% in most cases. The numbers will obviously differ between codebases. As the compiler will be evolving, it will be able to optimize more constructs, as long as your UIx/React code is clean and idiomatic ofcourse :)</p>
<p>In the meantime, while the compiler is able to optimize only basic constructs, I added a few compiler warnings in UIx to guide users and let them know what code locations should be fixed in their code. A positive side effect of those small refactorings is, well, more idiomatic React code.</p>
<p>However, all optimizations have their downsides. While your UIx apps will automatically reduce amount of updates during runtime, at startup time (when your app renders for the first time) UIx will need slightly more time than the version of UIx without auto-memoizing compiler. Fear not, this delta is negligible.</p>
<h3 id="next-steps">Next steps</h3>
<p>The plan is to keep working on edge cases and improve how deep the compiler can reach into user&rsquo;s code and optimize it.  <br></p>
<hr>
<h2 id="uncomplicate-clojure-ml-dragan-duric">Uncomplicate Clojure ML: Dragan Duric</h2>
<p>Q3 2025 $9K, Report No. 1, Published Sept. 30, 2025</p>
<h3 id="the-proposal-was">The proposal was:</h3>
<p>My goal with this funding in Q3 2005 is to develop a new Uncomplicate library, ClojureML.</p>
<ul>
<li>a Clojure developer-friendly API for AI/DL/ML models (in the first iteration based on ONNX Runtime, but later refined to be even more general).</li>
<li>Implement its first backend engine (based on ONNX Runtime).</li>
<li>support relevant operations as Clojure functions.</li>
<li>an extension infrastructure for various future backend implementations.</li>
<li>a clean low-level integration with Uncomplicate, Neanderthal, Deep Diamond and Clojure abstractions.</li>
<li>assorted improvements to Uncomplicate, Neanderthal, Deep Diamond, to support these additions.</li>
<li>develop examples for helping people getting started.</li>
<li>related bugfixes.</li>
<li>TESTS (of course!).</li>
</ul>
<h2 id="progress-so-far">Progress so far:</h2>
<p>In the first month, I have already implemented the first version, which I released to Clojars
as <code>org.uncomplicate/diamond-onnxrt</code>.</p>
<p>So, what has been done in this first version?</p>
<p>I have investigated various available ways to run ONNX runtime (ORT). There&rsquo;s a Java binding that Oracle donated to the (Microsoft-led) ONNX Runtime project. It&rsquo;s decent, but does not support all ORT functionality, and, more importantly, is not the best choice for Clojure, since it comes with their own Java-ness.
Also, the public distribution only comes with vanilla execution engine, and does not include the real stuff, namely CUDA and DNNL engines, which require each user to build their own jars. So, this one was to avoid if possible.</p>
<p>That left me with the trusty JavaCPP, which was my first choice anyway, since Clojure CPP is based on it,
and I use it for native bindings throughout Uncomplicate libraries. JavaCPP comes with two bindings
for ORT: C++ based, and C-based API. I started with C++ based API, but it turns out the native generator
is at odds with the way ORT does resource cleaning, so the default destructors are irreparably crashing the JVM.</p>
<p>I then ported whatever I implemented with the C++ API to the C API, and it turned out to be the right match
for Clojure and Uncomplicate way of doing stuff. I then proceeded to discover the ORT API, write Clojure
bindings, and create tests that help me shape things to fit into Clojure ergonomics.</p>
<p>Along the way, I discovered a few things that need to improved in JavaCPP&rsquo;s ORT bingings themselves,
and helped the upstream developers fixing/improving these.</p>
<p>I created a few higher-level example tests with common modeling problems and used these
to guide improvements of the internals. The goal is to have an implementation that is,
at the same time fast, easy to use, low on resources (as possible), fits into Clojure
ergonomics, and capable of meeting the real world usage needs. It&rsquo;s not perfect yet,
but it looks to me that I&rsquo;m getting there even more than I expected.</p>
<p>The thing that (pleasantly!) surprised me that I didn&rsquo;t even need to introduce new API:
the Deep Diamond API already conceptually supports what we want here! A few small adaptations were needed,
but no breaking changes. I even managed to create example where an ONNX model is a part of Deep Diamond
network! (in the ubiquitous MNIST example).</p>
<p>That, I think, gave a huge justification for Deep Diamond&rsquo;s Tensor machinery. Normally,
each new framework that we want to integrate comes with its own abstraction for data structures,
needing ways to get data in and out, convert formats and data types, etc. Deep Diamond just
handled these without sweat! It is already so featureful and flexible that I managed to
blend ONNX runtime structures without much hitches.</p>
<p>So, I guess the remainder of the project will focus on just doing more of the same to
broaden the ONNX feature coverage, making whatever can be configured automatically invisible,
and making whatever must be configured by the user simple and approachable, making more examples,
and generally polishing everything in several cycles of improvements.</p>
<p>The library is now renamed from Clojure ML to Diamond ML (and umbrella for diamond-onnxrt and a few possible
future libraries such as diamond-tensorrt, diamond-torch, etc.)
and can be found here: <a href="https://github.com/uncomplicate/diamond-ml">https://github.com/uncomplicate/diamond-ml</a>.
The idea now is that we don&rsquo;t actually need a separate library and api for this,
and that these integrations, as Diamond ML, are add-ons that seamlessly blend into Deep Diamond, the core library.</p>
<p>I&rsquo;m quite pleased with the results in the first quarter, I hope the users would be, too!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2025 Board Nominations: Time to Vote</title>
      <link>https://www.clojuriststogether.org/news/2025-board-nominations-time-to-vote/</link>
      <pubDate>Mon, 06 Oct 2025 14:09:25 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2025-board-nominations-time-to-vote/</guid>
      <description>Clojurists Together Members Can Now Vote for the Next Board Members.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is in the process of <a href="https://www.clojuriststogether.org/news/2025-board-nominations-and-our-annual-meeting/">electing new board members</a> to fill the four volunteer positions that are expiring this year. These positions are for two-year terms (approximately Nov. 2025 - Oct. 2027).</p>
<p>The board is responsible for governing the organization,  selecting and administering the projects that are sponsored,  and interacting with sponsors. It also facilitates decision-making and implementation for the future plans of Clojurists Together.</p>
<p>We received 10 applications from the Clojure Community. 4 are from current board members who would like to continue to serve. All of the candidates are talented Clojurists that we would love (and be honored) to have on our board.</p>
<p>The board has nominated all 10 candidates for the current board election (in alphabetical order of last names):</p>
<ul>
<li><a href="#felix-barbalet">Felix Barbalet</a> (current board member)</li>
<li><a href="#daniel-compton">Daniel Compton</a> (current Treasurer/Secretary)</li>
<li><a href="#rafal-dittwald">Rafal Dittwald</a></li>
<li><a href="#arthur-f%C3%BCcher">Arthur Fücher</a></li>
<li><a href="#heather-moore-farley">Heather Moore-Farley</a> (current board member)</li>
<li><a href="#felippe-da-motta-raposo">Felippe da Motta Raposo</a></li>
<li><a href="#christoph-neumann">Christoph Neumann</a></li>
<li><a href="#max-penet">Max Penet</a> (current board member)</li>
<li><a href="#howard-m-lewis-ship">Howard M. Lewis Ship</a></li>
<li><a href="#daniel-slutsky">Daniel Slutsky</a></li>
</ul>
<h3 id="next-steps">Next Steps</h3>
<p>All current Clojurists Together Members should have received a link to their ballot to vote via email. If you haven&rsquo;t received a ballot by 9th October (and you&rsquo;ve checked your spam folder to see if it&rsquo;s hiding there), please contact <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a>.</p>
<p><strong>Voting will close on 16th October at midnight Pacific Time</strong>. The top four candidates, as voted on by members will fill our open slots. Please note that our bylaws stipulate that &ldquo;there may not be more than two members under the control or close influence of the same entity. If this threshold is crossed then members must stand down until there are no more than two members from the same entity&rdquo;. This year, there are 3 candidates from the same organization. So depending on the election results, we may need to make an adjustment after the votes are in.</p>
<p>We will announce the winners shortly afterward and you&rsquo;ll be able to meet them at the Annual members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=2025+Clojurists+Together+Annual+Meeting&amp;iso=20251029T10&amp;p1=224&amp;ah=1">10 am Pacific time, October 29, 2025</a></p>
<p><strong>Your Vote is Important!! Please Vote!</strong></p>
<h2 id="meet-the-candidates">Meet the Candidates</h2>
<h3 id="felix-barbalet">Felix Barbalet</h3>
<p><a href="https://github.com/xlfe/">https://github.com/xlfe/</a></p>
<p><strong>Company:</strong> Psithur<br>
I&rsquo;ve really enjoyed contributing to the Clojurists Together board over the past two years, and I hope I&rsquo;ve brought a helpful view and been able to make a difference to help grow the Clojure ecosystem.</p>
<p>I’ve been using Clojure professionally for 5+ years and I&rsquo;m now running a small software/data company which uses full stack Clojure. Clojure has been the continuation of a life-long learning journey for me, and I don’t see that slowing down. The kind of things I’m interested in are figuring out how to raise the profile of Clojure as a smart choice for large enterprises all the way down to startups, and to help reduce the barriers to entry to Clojure as a profession. I want to see Clojure continue to grow and I’d love to see more corporate support to bring Clojure to more people.</p>
<p><strong>Bio:</strong> I’ve spent &gt;15 years working as a technologist in a range of roles including analytics, data science, data engineering, software architecture and software engineering. I have experience across highly-regulated industries (Government), consulting and startups. I have a B Economics (Honours) with specialisation in advanced econometrics, statistics, game-theory and behavioral economics and a graduate certificate in Cyber Security. <br></p>
<hr>
<h3 id="daniel-compton">Daniel Compton</h3>
<p><a href="https://github.com/danielcompton">https://github.com/danielcompton</a><br>
x.com/danielwithmusic</p>
<p><strong>Company:</strong> Whimsical<br>
I&rsquo;ve been a board member of Clojurists Together since the beginning, as well as the secretary/treasurer. I have been the main board member running day-to-day operations of Clojurists Together since we began.</p>
<p><strong>Bio:</strong> I&rsquo;m Daniel Compton. I live in New Zealand and have been a board member of Clojurists Together since it began, as well as the secretary/treasurer. I have been the primary board member running day-to-day operations of Clojurists Together since we began. I&rsquo;d like to continue to serve the community through running Clojurists Together.  <br></p>
<hr>
<h3 id="rafal-dittwald">Rafal Dittwald</h3>
<p><a href="https://github.com/rafd">https://github.com/rafd</a></p>
<p><strong>Company:</strong> Bloom Ventures<br>
I see this as an opportunity to serve and give back to our great community. Clojurists Together is a critical part of the Clojure ecosystem, and I want to see it and the community grow. I believe CT could serve as the foundation, for, well, a Clojure Foundation, supporting the Clojure commons in various new ways - such as financial host on Open Collective, an intellectual property host, and maybe experiment with community participation in selecting projects (via, say, quadratic funding). &hellip;if other members are supportive, of course.</p>
<p><strong>Bio:</strong> Rafal has been working with Clojure for over 10 years, primarily building web applications (many of which are open-source). He organizes Clojure Camp and has given a few talks (such as Solving Problems the Clojure Way). He has been a Clojurists Together member since its inception. He has served on the board of 3 for-profit corporations and 2 non-profit corporations.  <br></p>
<hr>
<h3 id="arthur-fücher">Arthur Fücher</h3>
<p><a href="https://www.linkedin.com/in/arthur-fucher/">https://www.linkedin.com/in/arthur-fucher/</a><br>
<a href="https://github.com/afucher">https://github.com/afucher</a> ; <a href="https://www.youtube.com/@clojure-br">https://www.youtube.com/@clojure-br</a><br>
I am also member of InnerSource Commons (<a href="https://innersourcecommons.org/about/members/">https://innersourcecommons.org/about/members/</a>)</p>
<p><strong>Company:</strong> Nubank<br>
I’ve been working with Clojure for over five years, including three years on platform engineering and developer experience, building tools and infrastructure for developers. I also contribute to open-source Clojure projects and organize ClojureBR, the Brazilian Clojure community, which promotes meetups and content in Portuguese.</p>
<p>Clojure and its community have given me a lot, and I’d like to give back by helping Clojurists Together strengthen the Clojure ecosystem globally and bring the perspective of Brazil, where many companies and developers are producing high-quality open-source. My experience in tooling, open source, and community organizing equips me to evaluate projects, contribute ideas, and help make the organization more inclusive and impactful.</p>
<p><strong>Bio:</strong> Arthur Fücher is a Clojure developer who in recent years has focused on improving developer experience and platform tooling. He contributes to open-source Clojure projects and organizes ClojureBR, the Brazilian Clojure community. Arthur is passionate about Clojure and dedicated to growing its community, sharing knowledge, and supporting initiatives that help more people discover and use the language.  <br></p>
<hr>
<h3 id="heather-moore-farley">Heather Moore-Farley</h3>
<p><a href="https://github.com/tophat8855">https://github.com/tophat8855</a></p>
<p>**Company:**Peerspace<br>
I&rsquo;ve been on the board for the past 4 years and have a good idea of the time commitment and work involved. I love working with Clojure and like learning about and funding projects that are important for the Clojure ecosystem.</p>
<p><strong>Bio:</strong> Heather has been a software engineer for over 10 years and has been using Clojure and Clojurescript for almost 8 years. When she&rsquo;s not coding, she&rsquo;s biking and drumming.  <br></p>
<hr>
<h3 id="felippe-da-motta-raposo">Felippe da Motta Raposo</h3>
<p><a href="https://github.com/felippemr/">https://github.com/felippemr/</a><br>
<a href="https://www.reanard.com/">https://www.reanard.com/</a><br>
<a href="https://www.linkedin.com/in/felippe-raposo/">https://www.linkedin.com/in/felippe-raposo/</a></p>
<p><strong>Company:</strong> VitableHealth<br>
I am inexperienced with Clojure and could provide a beginner&rsquo;s perspective on projects and community initiatives that help people accelerate their learning experience. I could also help with creating targeted industry guides for fintech and healthtech &ndash; helping people clearly understand Clojure&rsquo;s value proposition outlined to their specific needs.</p>
<p><strong>Bio:</strong> Felippe has over a decade of experience building software, from a database-as-a-service platform managing thousands of resources to large-scale systems that power automated money movement in the venture ecosystem — and more recently, in healthcare. He’s contributed to open source projects and spoken at Python community events in Brazil. Outside of work, Felippe enjoys reading with his kids and has recently introduced his six-year-old son to the Captain Tsubasa manga.</p>
<p>I currently live in Sandy, UT. USA.  <br></p>
<hr>
<h3 id="christoph-neumann">Christoph Neumann</h3>
<p><a href="https://christophneumann.dev/">https://christophneumann.dev/</a></p>
<p><strong>Company:</strong> Nubank<br>
I believe that it&rsquo;s vital to fund open source development for Clojure to grow and remain viable for years to come. I&rsquo;d like to join the board because I love the work Clojurists Together is doing, and I would like to help. I think I&rsquo;m a good fit because I&rsquo;ve been active in the Clojure community for a decade, and I&rsquo;m the developer advocate on the Clojure core team.</p>
<p><strong>Bio:</strong> Christoph is a Clojure fanatic, entrepreneur, and the Clojure team’s developer advocate. After earning a MS in Computer Science and most of a PhD, Christoph left academia to take functional programming and user-centric design back into industry. He went on to make exceptionally-reliable, high-performance Clojure systems for live sports and esports production. He’s worked with some of the biggest names in the industry, including the NFL, Wimbledon, Call of Duty, and The Overwatch League.</p>
<p>With his friend, Nate Jones, he hosts the “Functional Design in Clojure” podcast. For more than 100 episodes, they have helped object-oriented developers escape the perils of side effects through immutable, functional programming.   Visit christophneumann.dev for links to everything.  <br></p>
<hr>
<h3 id="max-penet">Max Penet</h3>
<p><a href="https://github.com/mpenet">https://github.com/mpenet</a></p>
<p><strong>Company:</strong> Exoscale<br>
I’m committed to continuing to make a positive impact on the community through CT’s work. I genuinely enjoy helping out whenever possible, especially through the various discussion channels. Having benefited greatly from this community myself, it feels only fair to give back by contributing my time and effort. Given my long-standing involvement and reliance on a healthy, thriving Clojure community for both personal and professional projects, I believe I could be a good fit for this role.</p>
<p><strong>Bio:</strong> I currently work as a software engineer at Exoscale, a European cloud provider that depends heavily on Clojure. I’ve been an active member of the Clojure community and have used Clojure professionally for over a decade across various fields. Over the years, I have authored, contributed to, and maintain several open-source libraries. I also stay closely engaged with the community on a near-daily basis, always aiming to offer help whenever possible. Most importantly, I deeply appreciate what CT is doing and would love to be able to help sustain that effort for two more years.  <br></p>
<hr>
<h3 id="howard-m-lewis-ship">Howard M. Lewis Ship</h3>
<p><a href="https://lewisship.net/">https://lewisship.net/</a><br>
<a href="https://github.com/hlship">https://github.com/hlship</a></p>
<p><strong>Company:</strong> Nubank<br>
I have long experience contributing to the open source community as an individual and as a representative of my employers (such as Walmart and Nubank), and have a new role at Nubank leading our open source enablement team, where part of my mandate is to engage with existing open source organizations and communities.  I&rsquo;ve been interested in Clojure since approximately 2010 and actively using it professionally since 2013.</p>
<p><strong>Bio:</strong> I&rsquo;ve been involved in open source projects since at least 2003; starting with Java (and the Apache Tapestry framework, which I founded) and continuing more recently with Clojure projects, including the Lacinia GraphQL framework, the Pedestal web framework, and org.clj-commons/pretty, as well as other less prominent projects.</p>
<p>I&rsquo;m very much interested in contributing back to the Clojure open source community, as I think these efforts are critical to the long-term viability of the Clojure language.  <br></p>
<hr>
<h3 id="daniel-slutsky">Daniel Slutsky</h3>
<p><a href="https://github.com/daslu">https://github.com/daslu</a></p>
<p><strong>Company:</strong> consultant at Daniel Slutsky LTD, full-time contractor for endor.global.</p>
<p>I deeply care about the Clojure open-source communities and Clojure growth, and these topics have been my main focus during the last few years, at Scicloj and elsewhere.</p>
<p><strong>Bio:</strong> I&rsquo;m Daniel Slutsky, a mathematician and data science consultant who has been working with Clojure since 2013. I co-organize Scicloj, where our mission is &ldquo;Helping Clojure grow in new fields&rdquo; - including academia, research, education, and domains beyond traditional software engineering.</p>
<p>My approach to community building draws from years of experience in local social activist groups, emphasizing inclusive collaboration and helping newcomers find their place in action-oriented projects.</p>
<p>I help maintain several open-source projects including Clay (literate programming), Noj (data science toolkit), Tableplot (data visualization) and ClojisR (Clojure-R bridge). Through mentorship programs, conferences like SciNoj Light and Macroexapnd-2025, and ongoing study groups focused on tooling, AI, and real-world applications, I work to create accessible pathways for people to explore Clojure in their fields of interest.</p>
<p>As a recipient of Clojurists Together grants in 2024 and having collaborated with a few  other grantees, I&rsquo;ve seen firsthand how this support enables community-driven work that expands Clojure&rsquo;s reach. I would welcome the opportunity to help CT in supporting projects that both strengthen our existing open-source ecosystem and welcome new voices from diverse fields.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Annually-Funded Developers&#39; Update: July/August 2025</title>
      <link>https://www.clojuriststogether.org/news/annually-funded-developers-update-july/august-2025/</link>
      <pubDate>Wed, 17 Sep 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/annually-funded-developers-update-july/august-2025/</guid>
      <description>Dragan Djuric, Eric Dallo, Michiel Borkent, Oleksandr Yakushev, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Hello Fellow Clojurists!
This is the fourth report from the 5 developers receiving Annual Funding in 2025.</p>
<p><a href="#dragan-djuric">Dragan Djuric</a>: Apple M Engine Neanderthal, Deep Diamond CPU<br>
<a href="#eric-dallo">Eric Dallo</a>: ECA, clojure-lsp, clojure-lsp-intellij<br>
<a href="#michiel-borkent">Michiel Borkent</a>: clj-kondo, babashka, SCI, clj-kondo, scittle, and more&hellip;<br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>: CIDER, clj-async-profiler, nREPL<br>
<a href="#peter-taoussanis">Peter Taoussanis</a>: Sente, Truss, Trove, Telemere</p>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>2025 Annual Funding Report 4. Published September 4, 2025.</p>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpus) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>Having a decent Apple CPU engine for Neanderthal completed in the May-June period, I could continue building on the work on the Deep Diamond CPU engine for Apple hardware that I&rsquo;ve started.</p>
<p>I had already found out that Apple&rsquo;s low-level APIs (BNNS) are not very well thought out (as I wrote in the last report), so I expected it to be a not so pleasant march. And it wasn&rsquo;t. No wonder why large parts of it are already deprecated, in favor of Graph API (which does not replace it&rsquo;s functionality, but is a completely alternative way of dealing with tensors and Deep Learning).</p>
<p>However, there were no room for quitting, since we need at least a basic tensor functionality, regardless of DNN operations, so we can later potentially integrate the Graph API and other tensor-based libraries. Besides that, the NDArray and Tensor parts of BNNS is not deprecated, so that&rsquo;s the stuff we have to work with.</p>
<p>I will spare you the gory details, including lots of segfaults and WTFs, but in the end I managed to tame it, and even fit it into the existing deep-diamond/dnnl API, with backward compatibility (not including the convolution and rnn ops which I found not worth trying to tame at this stage).</p>
<p>Then, just at the end of the month, I even managed to tidy up a Apple silicon enabled Deep Diamond release (0.35.2, 0.35.3).</p>
<h4 id="its-in-the-clojars">It&rsquo;s in the Clojars!</h4>
<p>I didn&rsquo;t have time and resources to advertise it wildly right away, and the next day I already started working on the ONNX Runtime integration, so it&rsquo;s still an Easter egg for the dedicated folks who actually read these reports. :)</p>
<p>I&rsquo;ve already worked on Neanderthal, and made a release with assorted bugfixes and improvements.</p>
<p>It&rsquo;s not a glamurous work, working at these lower levels, but I see bright future for Clojure tensors. Cheers!  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>2025 Annual Funding Report 4. Published September 8, 2025.</p>
<p>In these last 2 months I mainly focused on my recently created project, <a href="https://eca.dev">ECA</a> and its related projects, there were so many improvements and new features, the project grown a lot with lots of people using!</p>
<h3 id="ecahttpsgithubcomeditor-code-assistanteca"><a href="https://github.com/editor-code-assistant/eca">eca</a></h3>
<p>ECA (Editor Code Assistant) is a OpenSource, free, standardized server written in Clojure to make any editor have AI features like Cursor, Continue, Claude and others.</p>
<h4 id="020---0431">0.2.0 - 0.43.1</h4>
<p>There were so many releases I can&rsquo;t just put the whole changelog here hehe, but the main highlights were:</p>
<ul>
<li><strong>Web page</strong>_: A whole new site detailing the project, docs and features: <a href="https://eca.dev">https://eca.dev</a></li>
<li><strong>New models</strong>_: Anthropic (with subscription too), OpenAI, Github Copilot, Z.AI, OpenRouter, Azure and many others</li>
<li><strong>Custom providers</strong>_: It&rsquo;s possible to configure custom providers for your models.</li>
<li><strong>Command support</strong>_: built-in commands + mcp commands + eca commands + custom prompts. Ex: <code>/login</code>, <code>/my-prompt</code></li>
<li><strong>Plan behavior</strong>_: Plan your changes before tellin LLM to act.</li>
<li><strong>AGENTS.md</strong>_: <code>/init</code> your project to update/create a AGENTS.md file so ECA will have more context.</li>
<li><strong>Editor diagnostics</strong>: New tool <code>eca_editor_diagnostics</code> which gets LSP diagnostics about your project.</li>
</ul>
<p>And many more! come to #eca Clojurians channel.</p>
<h4 id="eca-emacshttpsgithubcomeditor-code-assistanteca-emacs"><a href="https://github.com/editor-code-assistant/eca-emacs">eca-emacs</a></h4>
<p>After testing other tools, improving a lot and receiving positive feedbacks, I believe ECA emacs offers the best Emacs tool for AI development right now, which is great, there are still so many features to add!</p>
<p><img src="https://github.com/user-attachments/assets/81cdc51a-0be4-409c-81e7-db6af75b377a" alt="eca-emacs (1)"></p>
<h4 id="eca-intellijhttpsgithubcomeditor-code-assistanteca-intellij"><a href="https://github.com/editor-code-assistant/eca-intellij">eca-intellij</a></h4>
<p>New editor support! :tada:<br>
Using the same UX from eca-vscode.</p>
<p><img src="https://github.com/user-attachments/assets/d85d0a97-b918-4093-8380-44525922c2ca" alt="eca-intellij"></p>
<h4 id="eca-vscodehttpsgithubcomeditor-code-assistanteca-vscode"><a href="https://github.com/editor-code-assistant/eca-vscode">eca-vscode</a></h4>
<p>Multiple improvements, especially extracted the webview to <code>eca-webview</code> so it can be used by eca-intellij as well.</p>
<p><img src="https://github.com/user-attachments/assets/bd835c29-9668-4f14-9bfd-70bf2d1c0f26" alt="eca-vscode"></p>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>There were mainly improvements in performance regarding clj-kondo bumps and some small fixes.
Also now we have a new custom linter <code>clojure-lsp/cyclic-dependencies</code>!</p>
<h4 id="20250815-153737---20250825-142146">2025.08.15-15.37.37 - 2025.08.25-14.21.46</h4>
<ul>
<li>
<p>Docs</p>
<ul>
<li>update neovim editor configuration for clojure lsp</li>
</ul>
</li>
<li>
<p>General</p>
<ul>
<li>New feature: Add <code>clojure-lsp/cyclic-dependencies</code> linter to detect cyclic dependencies between namespaces in the project.
<ul>
<li>Change <code>clojure-lsp/cyclic-dependencies</code> custom linter default level to be <code>off</code> until corner cases are fixed.</li>
</ul>
</li>
<li>New optional <code>:kondo-config-dir</code> setting to configure clj-kondo execution.</li>
<li>Parallelize and log the time spent on built-in linters execution.</li>
<li>Fix #1851: Error when source files have non-ASCII characters in their path or name</li>
<li>Fix caching issue when :source-aliases changes. #2081</li>
<li>Fix emitting invalid messages if there&rsquo;s an internal error.</li>
<li>Bump clj-kondo to <code>2025.07.28</code> considerably improving memory usage.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Avoid lint .lsp/stubs folder when starting.  <br></li>
</ul>
<hr>
</li>
</ul>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>2025 Annual Funding Report 4. Published September 5, 2025.</p>
<p>In this post I&rsquo;ll give updates about open source I worked on during July and August 2025.</p>
<p>To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work
possible. Without you the below projects would not be as mature or wouldn&rsquo;t
exist or be maintained at all! So a sincere thank you to everyone who
contributes to the sustainability of these projects.</p>
<p>c:\Users\kathl\Documents\Documents\Clojurists Together\2025 Reports\mayJune lng term 2025\mb-switzerland-2025.jpeg</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br">Nubank</a></li>
</ul>
<p>Open the details section for more info about sponsoring.</p>
<details>
<summary>Sponsor info</summary>
<p>If you want to ensure that the projects I work on are sustainably maintained,
you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
</details>
<!--

- TODO: mention upcoming talk at Clojure Conj 2025!

- ls -lat ~/dev
- babashka sub dir checken

-->
<h3 id="updates">Updates</h3>
<p>Although summer hit Europe and I made a train trip to Switzerland for some hiking with my wife, OSS activity continued in the borkiverse. 20 projects saw updates. As usual, babashka, SCI and clj-kondo saw the most activity.
<img width="600" height="500" alt="image" src="https://github.com/user-attachments/assets/7c6e5937-7e0d-4285-a036-26fdbf1a84ff" /></p>
<p>One of the big things I’m looking forward to is speaking at <a href="https://www.2025.clojure-conj.org/schedule">Clojure Conj 2025</a>. At the risk of sounding a bit pretentious, the title of my talk is &ldquo;Making Tools Developers Actually Use&rdquo;. Babashka started as a quirky interpreter &ldquo;nobody had asked for&rdquo; but now many Clojure developers don&rsquo;t want to live without it. Clj-kondo started out as a minimal proof-of-concept linter and now is widely used tool in Clojurian&rsquo;s every day toolset and available even in Cursive today. In the talk I want to reflect on what makes a tool something developers (like myself) actually want to use. I&rsquo;m excited about this opportunity and about my first time visiting the Conj (don&rsquo;t ask me how I got the Clojure Conj cap on the photo above). Given the rest of the schedule, it&rsquo;s something I wouldn&rsquo;t want to miss.</p>
<p>For babashka, my main focus has been making it feel even more like regular Clojure. One example is the change in how non-daemon threads are handled. Previously, people had to sometimes add sometimes <code>@(promise)</code> to keep an httpkit server alive. Now babashka behaves like <code>clojure -X</code> in this regard: if you spawn non-daemon threads, the process waits for them. It’s looks like a small change, but it brings consistency with JVM Clojure, something I&rsquo;m always aiming for more with babashka. If you want the old behavior, you can still use <code>--force-exit</code>. While implementing this I hit an interesting bug with <a href="https://github.com/oracle/graal/issues/12116">GraalVM</a> and also found out that <code>clojure -X</code> sometimes stalls when using agents. Maybe more on this next time.</p>
<p>Another change that was introduced is that when code is evaluated through <code>load-string</code> or <code>Compiler/load</code> (which is the same thing in bb), vars like <code>*warn-on-reflection*</code> are bound. This fixes a problem with loading code in non-main threads. E.g. <code>@(future (load-string &quot;(set! *warn-on-reflection* true)&quot;))</code> would fail in previous versions of babashka. You might wonder why you would ever want to do this. Well, a similar thing happens when you execute babashka tasks in parallel and that&rsquo;s where I ran into this problem.</p>
<p>SCI, the interpreter under the hood of babashka and several other projects, got some critical fixes as well. I detected one somewhat embarrasing bug when loading <code>clojure+.hashp</code> in babashka. It had code that looked like:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>config {})
(<span style="color:#66d9ef">let </span>[config {}
      _ (<span style="color:#a6e22e">alter-var-root</span> <span style="color:#f92672">#</span><span style="color:#e6db74">&#39;config</span> (constantly config))
     ]
  ...)
</code></pre></div><p>In the expression <code>(alter-var-root #'config (constantly config))</code> the var <code>#'config</code> was mistaken for the local <code>config</code> since SCI&rsquo;s analyzer used a <code>resolve</code>-like function that also resolves locals. This fails horribly. In 6 years of SCI it&rsquo;s the first time I encountered this bug though. After fixing this problem, I noticed that babashka&rsquo;s CI acted up. On every commit, babashka CI tests dozens of Clojure libraries by running their test suites. I noticed that specter&rsquo;s tests were failing. It turned out that one test actually worked prior to fixing the above bug exactly because the SCI analyzer&rsquo;s <code>resolve</code> returned a node that evaluated to a local value. But there is no way I could just leave that bug in, so I had to make a pull request to specter as well to set this straight. A new specter version was released that works both with older version of babashka and the new version.</p>
<p>One other headscratcher in SCI was on the ClojureScript side of things and had to do with munging. In interop like <code>(.-foo-bar #js {:foo-bar 1})</code> ClojureScript munges the field name in the interop form to <code>foo_bar</code> but in the object it stays <code>&quot;foo-bar&quot;</code>. The munging of this name wasn&rsquo;t applied in SCI as an oversight. So in SCI (and thus in nbb, joyride, scittle, etc.) the above expression would return <code>1</code> whereas in ClojureScript it would return <code>nil</code>. In contrast, <code>(.-foo-bar #js {:foo_bar 1})</code> would return <code>nil</code> in SCI but <code>1</code> in CLJS. Although fixing this could mean a breaking change in SCI-based scripting environments I decided to align it with CLJS anyway, as switching between SCI and CLJS should not introduce these kinds of surprises.</p>
<p>Other improvements in SCI were made in the area of better using type hints on instance method interop.</p>
<p>And then there’s clj-kondo, the linter that is supposed to spark joy ✨, as far as a linter is able to do that in a developer&rsquo;s life. Two new linters were added, including one that catches suspicious uses of locking. This linter was inspired by a similar rule in splint. Lots of smaller improvements were made like sorting findings and imported files such that they are consistent across multiple runs that use the <code>--parallel</code> option and across operating systems. And as usual bugfixes and preventing false positives.</p>
<p>One happy improvement to <a href="">scittle</a> is that referencing a library that was introduced by a <code>&lt;script&gt;</code> tag now was made a lot easier. You can find the docs about that <a href="https://github.com/babashka/scittle/blob/main/doc/js-libraries.md">here</a>. The tl;dr of this is that when a library registers itself as a global, you can just use that global in <code>:require</code> now: <code>(require '[&quot;JSConfetti&quot; :as confetti])</code>.</p>
<p>Of course, none of this happens in isolation. I’m deeply grateful to the community and the sponsors who make this work sustainable: Clojurists Together, Roam Research, Nextjournal, Nubank, and many other companies and individuals. Every bit of support means I can keep refining these tools, fixing edge cases, and thinking about the long-term direction.</p>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months in detail.</p>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Bump clojure to <code>1.12.2</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1843">#1843</a>: BREAKING (potententially): non-daemon thread handling change. Similar
to JVM clojure, babashka now waits for non-daemon threads to finish. This
means you don&rsquo;t have to append <code>@(promise)</code> anymore when you spawn an
httpkit server, for example. For futures and agents, bb uses a thread pool
that spawns daemon threads, so that pool isn&rsquo;t preventing an exit. This
behavior is similar to <code>clojure -X</code>. You can get back the old behavior where
bb always forced an exit and ignored running non-daemon threads with
<code>--force-exit</code>.</li>
<li><a href="https://github.com/babashka/babashka/issues/1690">#1690</a>: bind <code>clojure.test/*test-out*</code> to same print-writer as <code>*out*</code> in nREPL server</li>
<li>Add <code>Compiler/demunge</code></li>
<li>Add <code>clojure.lang.TaggedLiteral/create</code></li>
<li>Add <code>java.util.TimeZone/setDefault</code></li>
<li>Add <code>println-str</code></li>
<li>SCI: Var literal or special form gets confused with local of same name</li>
<li><a href="https://github.com/babashka/babashka/issues/1852">#1852</a>: <code>(.getContextClassLoader (Thread/currentThread))</code> should be able to return results from babashka classpath</li>
<li>Bump <code>deps.clj</code> to <code>1.12.2.1565</code></li>
<li>Bind more vars like <code>*warn-on-reflection*</code> during <code>load{string,reader}</code> (same as JVM Clojure) so can load code in other than than the main thread</li>
<li><a href="https://github.com/babashka/babashka/issues/1845">#1845</a>: expose <code>cheshire.generate/{add-encoder,encode-str}</code></li>
<li>Bump timbre to <code>6.8.0</code></li>
<li>Bump clojure.tools.logging to <code>1.3.0</code></li>
<li>Improve interop using type hints on qualified instance methods</li>
<li>Bump Jsoup to <code>1.21.2</code></li>
<li>Bump <code>fs</code> to <code>0.5.7</code></li>
<li>Bump <code>cheshire</code> to <code>6.1.0</code></li>
<li>Pods: no exception on destroy when there&rsquo;s still calls in progress</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting</p>
<ul>
<li>Add <code>println-str</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/997">#997</a>: Var is mistaken for local when used under the same name in a <code>let</code> body</li>
<li>Fix regression introduced in <a href="https://github.com/babashka/sci/issues/987">#987</a></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/963">#963</a>: respect <code>:param-tags</code> on qualified instance method</li>
<li>Add <code>*suppress-read*</code></li>
<li>Add <code>load-reader</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/872">#872</a>: <code>*loaded-libs*</code> is now the single source of truth about loaded libs</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/981">#981</a>: respect type hint on instance method callee</li>
<li>Add core dynamic vars like <code>*warn-on-reflection*</code> and bind them during
<code>load-string</code> etc. such that <code>set!</code>-ing then in a <code>future</code> works.</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/984">#984</a>: support alternative <code>set!</code> syntax in CLJS</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/987">#987</a>: method or property name in interop should be munged</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/986">#986</a>: preserve error location for js static method</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/990">#990</a>: fix <code>merge-opts</code> with <code>:bindings</code> + deprecate <code>:bindings</code> (replaced by <code>:namespaces {'user ...}</code>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.<br></p>
<ul>
<li>Unreleased</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2588">#2588</a>: false positive type mismatch about <code>symbol</code> accepting var</li>
<li>Require clojure <code>1.10.3</code> is the minimum clojure version</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2564">#2564</a>: detect calling set with wrong number of arguments</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2257">#2257</a>: support ignore hint on invalid symbol</li>
<li>Sort findings on filename, row, column and now additionally on message too</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2602">#2602</a>: Sort auto-imported configs to avoid differences based on OS or file system</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2603">#2603</a>: warn on <code>:inline-def</code> with nested <code>deftest</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2606">#2606</a>: make it easy for users to know how inline-config files should be version controlled (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2610">#2610</a>: ignores may show up unordered due to macros</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2615">#2615</a>: emit <code>inline-configs</code> <code>config.edn</code> in a git-diff-friendly way (<a href="https://github.com/lread">@lread</a>)</li>
<li>2025.07.28</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2580">#2580</a>: false positive type mismatch with quoted value</li>
<li>Fix some <code>:locking-suspicious-lock</code> false positives</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2582">#2582</a>: <code>:condition-always-true</code> false positives</li>
<li>2025.07.26</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2560">#2560</a>: NEW linter: <code>:locking-suspicious-lock</code>: report when locking is used on a single arg, interned value or local object</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2519">#2519</a>: NEW linter: <code>:unresolved-protocol-method</code>. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a> (<a href="https://github.com/emerson-matos">@emerson-matos</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2555">#2555</a>: false positive with <code>clojure.string/replace</code> and <code>partial</code> as replacement fn</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2566">#2566</a>: Expand <code>:condition-always-true</code> check. (<a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2350">#2350</a>: support <code>schema.core/defprotocol</code> (<a href="https://github.com/emerson-matos">@emerson-matos</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2571">#2571</a>: false positive unresolved symbol when ignoring expression that goes through macroexpansion hook</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2575">#2575</a>: false positive type mismatch with nested keyword call and <code>str</code></li>
<li>Bump SCI to <code>0.10.47</code></li>
<li>Drop memoization for hook fns and configuration, solves memory issue with Cursive + big projects like metabase</li>
<li>Optimizations to compensate for dropping caching, performance should be similar (or better depending on the size of your project)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2568">#2568</a>: support <code>:deprecated-namespace</code> for <code>.cljc</code> namespaces</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>Upgrade to Reagent and fix unsafe HTML rendering</li>
<li>Add viewers for HTML markdown nodes</li>
<li>Support file watching in babashka</li>
<li>Support server side rendering of formulas using KaTeX</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li>v0.8.153 (2025-08-31)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/704">#704</a>: <code>while</code> didn&rsquo;t compile correctly</li>
<li>Add <code>clojure.string/includes?</code></li>
<li>Emit less code for varargs functions</li>
<li>Fix solidJS example</li>
<li>Documentation improvements (<a href="https://github.com/lread">@lread</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/697">#697</a>: <code>ClassCastException</code> in statement function when passed Code records</li>
<li>v0.8.152 (2025-07-18)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/680">#680</a>: support import attributes using <code>:with</code> option in require, e.g. <code>:with {:type :json}</code></li>
<li>v0.8.151 (2025-07-15)</li>
<li>Implement <code>not=</code> as function</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/684">#684</a>: JSX output</li>
<li>v0.8.150 (2025-07-09)</li>
<li><a href="https://github.com/squint-cljs/squint/issues/678">#678</a>: Implement <code>random-uuid</code> (<a href="https://github.com/rafaeldelboni">@rafaeldelboni</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/681">#681</a>: support unsafe HTML via <code>[:$ ...]</code> tag</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</p>
<ul>
<li>v0.7.27 (2025-08-21)</li>
<li><a href="https://github.com/babashka/scittle/issues/121">#95</a>: support string requires
of <code>globalThis</code> js deps (<a href="https://github.com/chr15m">@chr15m</a>). See
<a href="https://github.com/babashka/scittle/blob/main/doc/js-libraries.md">docs</a>.</li>
<li>Potentially breaking: <code>(.-foo-bar {})</code> now behaves as <code>{}.foo_bar</code>, i.e. the property or method name is munged.</li>
<li>v0.7.26 (2025-08-20)</li>
<li><a href="https://github.com/babashka/scittle/issues/121">#121</a>: add <code>cjohansen/dataspex</code> plugin (<a href="https://github.com/jeroenvandijk">@jeroenvandijk</a>)</li>
<li><a href="https://github.com/babashka/scittle/issues/118">#118</a>: add <code>goog.string/format</code> (<a href="https://github.com/jeroenvandijk">@jeroenvandijk</a>)</li>
<li>Support alternative <code>(set! #js {} -a 1)</code> CLJS syntax (by bumping SCI)</li>
<li>Add source maps to distribution</li>
<li>Add dev versions of all modules in the <code>dev</code> folder of the distribution + a <code>dev/scitte.cljs-devtools.js</code> module</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/edamame">edamame</a>: configurable EDN and Clojure parser with location metadata and more</p>
<ul>
<li>Fix <a href="https://github.com/borkdude/edamame/issues/132">#132</a>: Add counterpart to Clojure&rsquo;s <code>*suppress-read*</code>: <code>:suppress-read</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</p>
<ul>
<li>Add config for dataspex</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>nREPL improvement for vim-fireplace</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/markdown">Nextjournal Markdown</a></p>
<ul>
<li>Drop KaTeX dependency by inlining TeXMath lib</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nrepl-client">babashka.nrepl-client</a></p>
<ul>
<li>Add <code>:responses</code> key with raw responses</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li>Documentation improvements</li>
<li>Fix wrong typehint</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li><code>not=</code> is now a function</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</p>
<ul>
<li><a href="https://github.com/babashka/cli/issues/122">#122</a>: introduce new
<code>:repeated-opts</code> option to enforce repeating the option for accepting multiple
values (e.g. <code>--foo 1 --foo 2</code> rather than <code>--foo 1 2</code>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Fixed Java download program that respects <code>CLJ_JVM_OPTS</code> for downloading tools jar.</li>
<li>Released several versions catching up with the clojure CLI</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>: babashka filewatcher pod</p>
<ul>
<li>Pod protocol fix: don&rsquo;t send done with async messages</li>
<li>Robustness improvements</li>
<li>Bump fsnotify</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.nrepl">sci.nrepl</a>: nREPL server for SCI projects that run in the browser</p>
<ul>
<li>Send current working directory in describe message (for tools like clojure-mcp)</li>
<li>Add <code>&quot;session-closed&quot;</code> to close op reply</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3</p>
<ul>
<li>JSON1 support</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-server">http-server</a>: serve static assets</p>
<ul>
<li>0.1.15</li>
<li><a href="https://github.com/babashka/http-server/issues/22">#22</a>: fix off-by-one error in range requests (<a href="https://github.com/jyn514">@jyn514</a>)</li>
<li>0.1.14</li>
<li><a href="https://github.com/babashka/http-server/issues/21">#21</a>: Add <code>:not-found</code> option for handling unfound files. The option is a function of the request and should return a map with <code>:status</code> and <code>:body</code>.</li>
<li><a href="https://github.com/babashka/http-server/issues/19">#19</a>: Add text/html MIME types for asp and aspx file extensions (<a href="https://github.com/respatialized">@respatialized</a>)</li>
<li>0.1.13</li>
<li><a href="https://github.com/babashka/http-server/issues/16">#16</a>: support range requests (<a href="https://github.com/jmglov">jmglov</a>)</li>
<li><a href="https://github.com/babashka/http-server/issues/13">#13</a>: add an ending slash to the dir link, and don&rsquo;t encode the slashes (<a href="https://github.com/KDr2">@KDr2</a>)</li>
<li><a href="https://github.com/babashka/http-server/issues/12">#12</a>: Add headers to index page (rather than just file responses)</li>
</ul>
</li>
</ul>
<p>Contributions to third party projects:</p>
<ul>
<li>
<p><a href="https://github.com/redplanetlabs/specter">specter</a>: Clojure(Script)&rsquo;s missing piece</p>
<ul>
<li>Fix babashka support by removing optimizations that only worked due to SCI bug</li>
</ul>
</li>
<li>
<p><a href="https://github.com/jank-lang/clojure-test-suite">clojure-test-suite</a>: Dialect-independent tests for clojure.core, and others, focused on characterizing how Clojure JVM behaves so that other dialects to reach parity.</p>
<ul>
<li>Added babashka to the test suite</li>
</ul>
</li>
</ul>
<h2 id="other-projects">Other projects</h2>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity
happened in the past month.</p>
<details>
<summary>Click for more details</summary>
<ul>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/borkdude/unused-deps">unused-deps</a>: Find unused deps in a clojure project</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/borkdude/html">html</a>: Html generation library inspired by squint&rsquo;s html tag</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a>: Use instaparse from babashka</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/borkdude/rewrite-edn">rewrite-edn</a>: Utility lib on top of</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and <a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>: use tools.deps directly from babashka</li>
<li><a href="https://github.com/babashka/bbin">bbin</a>: Install any Babashka script or project with one comman</li>
<li><a href="https://github.com/borkdude/qualify-methods">qualify-methods</a>
<ul>
<li>Initial release of experimental tool to rewrite instance calls to use fully
qualified methods (Clojure 1.12 only0</li>
</ul>
</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects.<br></li>
<li><a href="https://github.com/borkdude/tools">tools</a>: a set of <a href="https://github.com/babashka/bbin/">bbin</a> installable scripts</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter</li>
<li><a href="https://github.com/borkdude/speculative">speculative</a></li>
<li><a href="https://github.com/squint-cljs/squint-macros">squint-macros</a>: a couple of
macros that stand-in for
<a href="https://github.com/applied-science/js-interop">applied-science/js-interop</a>
and <a href="https://github.com/funcool/promesa">promesa</a> to make CLJS projects
compatible with squint and/or cherry.</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a>: a leiningen plugin for clj-kondo</li>
<li><a href="https://github.com/http-kit/http-kit">http-kit</a>: Simple, high-performance event-driven HTTP client+server for Clojure.</li>
<li><a href="https://github.com/babashka/babashka.nrepl">babashka.nrepl</a>: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI</li>
<li><a href="https://github.com/babashka/book">babashka.book</a>: Babashka manual</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://borkdude.github.io/clj2el/">clj2el</a>: transpile Clojure to elisp</li>
<li><a href="https://github.com/borkdude/deflet">deflet</a>: make let-expressions REPL-friendly!</li>
<li><a href="https://github.com/borkdude/deps.add-lib">deps.add-lib</a>: Clojure 1.12&rsquo;s add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI</li>
</ul>
</details> <br>  
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p>2025 Annual Funding Report 4. Published September 6, 2025.</p>
<p>Hello friends! Here&rsquo;s my update on July-August 2025 Clojurists Together work. It has been a slow summer for me, but I still advanced in several projects under my wing.</p>
<h3 id="clj-async-profiler">clj-async-profiler</h3>
<p>I have been progressing towards a major 2.0.0 release for quite some time, and it will be released soon. The release will contain prominent changes, including the complete transition to JFR file format for collected profiles (compatible with Java Flight Recorder), support for continuous profiling, and a new exciting flamegraph type (secret for now!). I&rsquo;m also making sure that Flamebin will receive the same new features shortly after that.</p>
<h3 id="nrepl">nREPL</h3>
<p>We have just released <a href="https://clojurians.slack.com/archives/C06MAR553/p1756827753587169">nREPL 1.4</a> which supports configuring dynamic var values for the REPL environment and improvements to <code>load-file</code> middleware. There are already futher improvements in the pipeline, so expect a 1.5 coming soon.</p>
<h3 id="cider">CIDER</h3>
<p>Together with Bozhidar, we have released <a href="https://clojurians.slack.com/archives/C06MAR553/p1752150481484109">CIDER 1.9</a> back in July, bringing the
accumulated features and fixes to stable-version users. In the unstable version, I&rsquo;ve fixed a couple annoying bugs, namely:</p>
<ul>
<li>ClojureScript node repl switches back to cljs.user namespace (fixed in <a href="https://github.com/nrepl/piggieback/blob/master/CHANGES.md#061-2025-12-31">piggieback 0.6.1</a>).</li>
<li>Broken stacktrace response when C-c C-p throws an exception (<a href="https://github.com/clojure-emacs/cider/issues/3827">#3827</a>).</li>
</ul>
<p>CIDER users will also benefit from the recent and upcoming nREPL improvements.  <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>2025 Annual Funding Report 4. Published September 2, 2025.</p>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<p>Hi folks! 👋 Will try keep today&rsquo;s update for July and August brief.</p>
<h3 id="recent-work">Recent work</h3>
<h3 id="sente">Sente</h3>
<blockquote>
<p>(<a href="https://www.taoensso.com/sente">Sente</a> is a realtime web comms library for Clojure/Script)</p>
</blockquote>
<p>Sente <a href="https://github.com/taoensso/sente/releases/tag/v1.21.0-RC1">v1.21.0-RC1</a> is out now. v1.21 is a big release with improved performance, improved reliability, improved logging (via <a href="https://www.taoensso.com/trove">Trove</a>) and new <a href="https://github.com/taoensso/sente/blob/a8de08f26cf739512d249dc88bc98c33a9992bcf/src/taoensso/sente/packers/msgpack.cljc#L8">high-speed binary serialization</a> that supports Clojure&rsquo;s rich data types.</p>
<p>The binary serialization is still marked as experimental to be safe, though I have it running in production myself. This is a nice improvement, especially for folks with larger payloads and/or with mobile users that might be sensitive to network speed/limits.</p>
<p>To try the new serialization: just give <code>(taoensso.sente.packers.msgpack/get-packer)</code> to your <a href="https://cljdoc.org/d/com.taoensso/sente/1.21.0-RC1/api/taoensso.sente#make-channel-socket-client!">client</a> and <a href="https://cljdoc.org/d/com.taoensso/sente/1.21.0-RC1/api/taoensso.sente#make-channel-socket-server!">server</a> constructor calls. No extra deps needed.</p>
<h3 id="truss">Truss</h3>
<blockquote>
<p>(<a href="https://www.taoensso.com/truss">Truss</a> is a micro toolkit for Clojure/Script errors)</p>
</blockquote>
<p>Truss <a href="https://github.com/taoensso/truss/releases/tag/v2.2.0">v2.2.0</a> is out now with some usability improvements, and a new <a href="https://www.youtube.com/watch?v=vGewwWuzk9o&amp;feature=youtu.be">demo video</a> to show what the library can do. In short: the goal is to <strong>help improve the Clojure/Script error experience</strong>. Almost all of my Clojure/Script code uses Truss in some way.</p>
<p>The video should be a decent starting point if you&rsquo;re not familiar with Truss.</p>
<h3 id="trove-and-telemere">Trove and Telemere</h3>
<blockquote>
<p><a href="https://www.taoensso.com/trove">Trove</a> is a modern logging facade for Clojure/Script.<br>
<a href="https://www.taoensso.com/telemere">Telemere</a> is the successor to <a href="https://www.taoensso.com/timbre">Timbre</a>.</p>
</blockquote>
<p>Trove <a href="https://github.com/taoensso/trove/releases/tag/v1.0.0">v1.0 final</a> and Telemere <a href="https://github.com/taoensso/telemere/releases/tag/v1.1.0">v1.1.0</a> are out now with some usability improvements.</p>
<p>How do these libraries relate?</p>
<ul>
<li>
<p>Trove is intended for <strong>library authors</strong> that want to emit rich logging (incl. un/structured logging) <em>without</em> forcing their users to adopt any particular backend (like <a href="https://www.taoensso.com/telemere">Telemere</a>, <a href="https://www.taoensso.com/timbre">Timbre</a>, <a href="https://github.com/BrunoBonacci/mulog">μ/log</a>, <a href="https://github.com/clojure/tools.logging">tools.logging</a>, <a href="https://www.slf4j.org/">SLF4J</a>, etc.).</p>
</li>
<li>
<p>Telemere is intended for <strong>general users</strong> that want to emit rich logging (incl. un/structured logging) from their own applications.</p>
</li>
</ul>
<p>The two share the same map-oriented logging API:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">trove/log!</span>    {<span style="color:#e6db74">:level</span> <span style="color:#e6db74">:info</span>, <span style="color:#e6db74">:id</span> <span style="color:#e6db74">:auth/login</span>, <span style="color:#e6db74">:data</span> {<span style="color:#e6db74">:user-id</span> <span style="color:#ae81ff">1234</span>}, <span style="color:#e6db74">:msg</span> <span style="color:#e6db74">&#34;User logged in!&#34;</span>})
(<span style="color:#a6e22e">telemere/log!</span> {<span style="color:#e6db74">:level</span> <span style="color:#e6db74">:info</span>, <span style="color:#e6db74">:id</span> <span style="color:#e6db74">:auth/login</span>, <span style="color:#e6db74">:data</span> {<span style="color:#e6db74">:user-id</span> <span style="color:#ae81ff">1234</span>}, <span style="color:#e6db74">:msg</span> <span style="color:#e6db74">&#34;User logged in!&#34;</span>})
</code></pre></div><p>Both support traditional and <strong>structured</strong> logging:</p>
<ul>
<li>Traditional logging outputs <strong>strings</strong> (messages).</li>
<li>Structured logging in contrast outputs <strong>data</strong>. It retains <strong>rich data types and (nested) structures</strong> throughout the logging pipeline from logging callsite → filters → middleware → handlers.</li>
</ul>
<p>A data-oriented pipeline can make a huge difference - supporting <strong>easier filtering</strong>, <strong>transformation</strong>, and <strong>analysis</strong>. It’s also usually <strong>faster</strong>, since you only pay for serialization if/when you need it. In a lot of cases you can avoid serialization altogether if your final target (DB, etc.) supports the relevant types.</p>
<p>So the structured (data-oriented) approach is inherently more flexible, faster, and well suited to the tools and idioms offered by Clojure and ClojureScript.</p>
<h3 id="other-stuff">Other stuff</h3>
<p>Other misc releases included:</p>
<ul>
<li><a href="https://www.taoensso.com/http-kit">http-kit</a> <a href="https://github.com/http-kit/http-kit/releases/tag/v2.8.1">v2.8.1</a> and <a href="https://github.com/http-kit/http-kit/releases/tag/v2.9.0-beta2">v2.9.0-beta2</a></li>
<li><a href="https://www.taoensso.com/timbre">Timbre</a> <a href="https://github.com/taoensso/timbre/releases/tag/v6.8.0">v6.8.0</a></li>
</ul>
<p>As usual please see the linked release notes for details.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>Next couple months I expect my focus to include <a href="https://www.taoensso.com/tempel">Tempel</a> and likely <a href="https://www.taoensso.com/carmine">Carmine</a>, both of which are long overdue for some love :-)</p>
<p>Cheers everyone!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>August 2025 Clojars Support and Q2 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/august-2025-clojars-support-and-q2-project-updates/</link>
      <pubDate>Fri, 12 Sep 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/august-2025-clojars-support-and-q2-project-updates/</guid>
      <description>Clojars Support, Code Combat, SciCloj Building Bridges</description>
      <content:encoded><![CDATA[<p>Greetings all!
We have updates from two Q2 projects and a new report from Toby Crawley who provides ongoing support and maintenance for Clojars. You&rsquo;ll find a brief description of the all these projects below.</p>
<p><a href="#clojars-support-and-maintenance-toby-crawley">Toby Crawley: Clojars Support and Maintenance</a> <br>
Toby&rsquo;s report includes links to Clojars Changelogs for March through July 2025 as well as an overview of fixes and updates. He monitors community channels on a regular basis.
If you have any issues or questions about Clojars, you can find him in the <a href="https://clojurians.slack.com/archives/C0H28NMAS"><code>#clojars</code> channel on the Clojurians Slack</a>, or you can file an issue on the <a href="https://github.com/clojars/clojars-web/issues/new/choose">main Clojars GitHub repository</a>.</p>
<p><a href="#code-combat-karl-pietzrak">Karl Pietzrak: Code Combat</a><br>
This project will focus on adding Clojure(Script) to CodeCombat.
See Wiki page at <a href="https://github.com/codecombat/codecombat/wiki/Aether">https://github.com/codecombat/codecombat/wiki/Aether</a></p>
<p><a href="#scicloj-building-bridges-to-new-clojure-users-siyoung-byun">Siyoung Byun: SciCloj Building Bridges to New Clojure Users</a><br>
Scicloj aims to improve the accessibility of Clojure for individuals working with data, regardless of their programming backgrounds. The project aims to develop standardized templates to encourage greater consistency across the documentation of existing Scicloj ecosystem libraries, making those libraries more robust and user-friendly.  <br></p>
<h2 id="clojars-support-and-maintenance-toby-crawley">Clojars Support and Maintenance: Toby Crawley</h2>
<p>This is an update on the work I&rsquo;ve done maintaining <a href="https://clojars.org">Clojars</a> in March through July 2025 with the ongoing support of Clojurists Together.</p>
<p>Most of my work on Clojars is reactive, based on issues reported through the community or noticed through monitoring. If you have any issues or questions about Clojars, you can find me in the <a href="https://clojurians.slack.com/archives/C0H28NMAS"><code>#clojars</code> channel on the Clojurians Slack</a>, or you can file an issue on the <a href="https://github.com/clojars/clojars-web/issues/new/choose">main Clojars GitHub repository</a>.</p>
<p>You can see the <a href="https://github.com/clojars/clojars-web/blob/main/CHANGELOG.org">CHANGELOG</a> for notable changes, and see all commits in the <a href="https://github.com/clojars/clojars-web/compare/0aaeb277fa4ff7ce75533d6a915ff226b5f10c1d...759866053761e9f685f52520c61fa2bad10ee4b9"><code>clojars-web</code></a> and <a href="https://github.com/clojars/infrastructure/compare/42610d719338aba1b44a84d8c437f82a39fd5591...b2e0e61850d9480a7ef16d3dea3075174dd5d862"><code>infrastructure</code></a> repositories for this period. I also <a href="https://tcrawley.org/clojars-worklog/">track my work</a> over the years for Clojurists Together (and, before that, the <a href="https://sfconservancy.org/">Software Freedom Conservancy</a>.</p>
<p><strong>Below are some highlights for work done in March through July:</strong></p>
<ul>
<li>I finally addressed issues with running out of memory on occasion. It turned out to be the in-memory session store; we were using <a href="https://github.com/kirasystems/aging-session">aging
sessions</a>, but we were generating enough sessions in 48 hours (the session ttl) to exhaust the heap. <a href="https://github.com/clojars/clojars-web/commit/5d50868decdf95b8014a957f4f88635695dcc3ee">Adjusting the ttl to 1 hour</a> solved the problem, but a better long-term solution would be to not create a session until a user logs in, as that is all we need a session for. Clojars currently creates a session for each visit to the site.</li>
<li>Clojars was storing uploads in <code>/tmp</code> during deploys, and there is no signal to when a deploy is complete, so we can&rsquo;t delete them at the end of the deploy. This was causing the server to run out of disk space, so I <a href="https://github.com/clojars/clojars-web/commit/318fff4a23feaf6931e326e50d735c6c4363629a">moved upload storage to a larger partition</a>, and made <a href="https://github.com/clojars/infrastructure/commit/164091a948bb8b67cd9edd6cc5ff68bd7860b494">tmp file cleanup happen more often</a>.</li>
<li>We had some client that was repeatedly connecting to Clojars, then failing TLS negotiation, then trying again. This caused our AWS load balancer expense to increase by several hundred dollars, so I <a href="https://github.com/clojars/infrastructure/commit/ed2e08cb17d835409deec91ac4b52b0308b9a983">blocked that IP address from accessing Clojars</a>.</li>
<li>I upgraded a few dependencies to address some CVEs.</li>
<li>I worked on spiking out how to implement using <a href="https://www.rfc-editor.org/rfc/rfc9457">Problem Details (rfc9457)</a> to return deploy validation failures to the client. See <a href="https://github.com/clojars/clojars-web/issues/911">this issue</a> for more details.</li>
</ul>
<p>I worked with <a href="https://github.com/frenchy64">Ambrose Bonnaire-Sergeant</a> on some security (&amp; other) fixes:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/baade8967c7be8abd9a9b27499c511efd41f6164">Fixing</a>, then <a href="https://github.com/clojars/clojars-web/commit/d3623de947dcba56392c3e2bc3041ed3c1bf89a5">inlining</a> a <code>deps.edn</code> alias we used to override versions to resolve CVEs. We weren&rsquo;t actually using the alias when building the uberjar, and then realized we didn&rsquo;t need the alias at all, as those dependencies could be top-level.</li>
<li><a href="https://github.com/clojars/clojars-web/pull/907">Adding a <code>pom.xml</code></a> to the repository to allow Dependabot to detect vulnerable dependencies.</li>
<li><a href="https://github.com/clojars/clojars-web/pull/905">Importing/adding clj-kondo configurations</a> for dependencies to give better linting.  <br></li>
</ul>
<hr>
<h2 id="code-combat-karl-pietzrak">Code Combat: Karl Pietzrak</h2>
<p>Q2 2025 $2k. Report No. 1, Published 9 September 2025</p>
<ul>
<li>Successfully deployed CodeCombat on our own private cloud (GCP)</li>
<li>Some of CodeCombat&rsquo;s dependencies are very old:
<ul>
<li>for sandboxing user code, Aether, hasn&rsquo;t been updated since 2017</li>
<li>closer.js, which contains some Clojure support, hasn&rsquo;t been touched since 2014.<br>
We are in the process of updating these so build in a modern context, as many of their dependencies are dead.</li>
</ul>
</li>
</ul>
<p>Progress update to follow in our next report.  <br></p>
<hr>
<h2 id="scicloj-building-bridges-to-new-clojure-users-siyoung-byun">SciCloj Building Bridges to New Clojure Users: Siyoung Byun</h2>
<p>Q2 2025 $2k. Report No. 2, Published 14 August 2025</p>
<p>In the time since my previous update I have continued to focus on the community expansion side of the Scicloj initiative. The work and effort continues as a long-term goal alongside other dedicated contributors in the Scicloj community.</p>
<h3 id="macroexpand-2-connecting-clojure-data-practitioners">Macroexpand 2: Connecting Clojure Data Practitioners</h3>
<p>I co-hosted and prepared a three-hour-long online discussion session called <a href="https://clojureverse.org/t/macroexpand-2-connecting-clojure-data-practitioners/11485">Macroexpand 2: Connecting Clojure Data Practitioners</a> as part of <a href="https://scicloj.github.io/docs/community/groups/macroexpand/">Macroexpand gatherings</a> on August 9th. Working with co-host Daniel Slutsky, I planned the event agenda and reached out to Clojurians from diverse backgrounds and positions to invite them to join and share their insights at this gathering.</p>
<p>This initiative represents a step forward in positioning Scicloj not only as a data science community, but as a platform for community expansion, networking, and outreach in the Clojure ecosystem by providing dedicated space and time for discussing and sharing knowledge between individuals and organizations.</p>
<h3 id="purpose-of-the-gathering">Purpose of the Gathering</h3>
<p>The gathering aimed to share real-world experiences and challenges, provide networking opportunities for fellow Clojurians while identifying and developing concrete solutions to common problems, and shape clearer direction for follow-up sessions.</p>
<h3 id="key-outcomes">Key Outcomes</h3>
<p>The gathering brought together participants from different organizations with varied backgrounds, giving us an opportunity to collect valuable insights as individuals, groups, and as a community. The event included participant introductions, lightning rounds where some attendees presented ongoing projects, community expansion efforts, educational outreach initiatives, and discussions about potential tools or platforms for facilitating hiring and job opportunities within the Clojure ecosystem.</p>
<p>Through discussions about success stories of using Clojure in data work, current challenges, and hiring market impressions, we identified several key insights: including the critical importance of integration libraries and tools for other languages (particularly with an example with Python integration).</p>
<p>Other insights included the value of staying connected within the community not only for technological updates but also for accessing new job and collaboration opportunities, and the importance of using streamlined communication channels to maintain community connections. We also explored actionable strategies the community could implement to support and sustain a healthy, thriving Clojure ecosystem.</p>
<p>We partially recorded the gathering, and will publish an edited version soon.</p>
<h3 id="further-vision">Further Vision</h3>
<p>This gathering represents an ongoing initiative rather than a one-time event. Following this successful first session, we are confident that such community discussions are both important and needed. I will continue organizing future gatherings, with formats evolving based on participants inputs and feedbacks along the way. I am excited about the potential impact of this initiative, and look forward to contributing and sharing its outcome in the future.</p>
<h3 id="macroexpand-2025-two-upcoming-online-conferences">Macroexpand 2025: Two Upcoming Online Conferences</h3>
<p><a href="https://scicloj.github.io/macroexpand-2025/">Macroexpand 2025</a>(two online conferences) will be held in October 2025 hosted by Scicloj. I have been working as a co-organizer to prepare for the conferences, and this initiative will continue.</p>
<h3 id="about-the-conferences">About the Conferences</h3>
<p><strong>Macroexpand-Noj</strong> (October 17-18, 2025) focuses on practical applications of the Noj toolkit in real-world data science, featuring talks on any data analysis related projects and methology, updates on the tool, documentation efforts. And <strong>Macroexpand-Deep</strong> (October 24-25, 2025) is dedicated to AI system research and applications in Clojure, exploring deep learning networks, large language models, vector embeddings, and supporting infrastructure.</p>
<h3 id="current-work">Current Work</h3>
<p>As one of the organizers, I am actively preparing and organizing both conferences. I published <a href="https://clojurecivitas.github.io/scicloj/macroexpand/macroexpand_2025.html">a post</a> about the upcoming conferences on Clojure Civitas, including a call for speakers.</p>
<p>I will continue to assist potential speakers in preparing talks, brainstorm talk ideas with interested participants, reach out to community members, help others conceptualize their projects for presentation, contribute to Scicloj organizing team discussions, and plan the upcoming conferences. This remains an ongoing initiative with significant potential for community impact.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2025 Board Nominations and Our Annual Meeting</title>
      <link>https://www.clojuriststogether.org/news/2025-board-nominations-and-our-annual-meeting/</link>
      <pubDate>Fri, 05 Sep 2025 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2025-board-nominations-and-our-annual-meeting/</guid>
      <description>Stand for our 2025 elections and attend the Annual Meeting</description>
      <content:encoded><![CDATA[<p>Clojurists Together is having our fifth board elections, and our fifth annual members meeting.</p>
<h3 id="key-dates">Key dates</h3>
<p>(All dates are EOD, in Pacific Time)</p>
<p><strong>Board nominations close:</strong> Sept. 25, 2025<br>
<strong>Voting opens:</strong> a few days after submissions close and after the board has nominated candidates<br>
<strong>Voting closes:</strong> October 16, 2025<br>
<strong>Annual members meeting:</strong> <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=2025+Clojurists+Together+Annual+Meeting&amp;iso=20251029T10&amp;p1=224&amp;ah=1">Oct. 29, 2025 - 10 am Pacific time</a></p>
<h3 id="board-elections">Board Elections</h3>
<p>As part of our commitment to <a href="https://www.clojuriststogether.org/transparency/">transparency</a> and community governance, Clojurists Together holds elections for board members. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors.</p>
<p>Committee members are elected for a two-year term. Each election cycle, half of our board seats come up for re-election. This year there are <strong>four</strong> seats available.</p>
<p>If you are interested in standing for election, please fill out this <a href="https://forms.gle/gEFxSmUUXjXk7hrF7">form</a> by Sept. 25th, 2025 -  5 pm Pacific Time. If you can’t access the form, <a href="https://www.clojuriststogether.org/contact">contact us</a>, and we can accept your nomination by email. Nominations are open to anyone, you don’t have to be a Clojurists Together member to stand for election. Our bylaws do require you to be a member if elected to the board, though we provide a stipend that offsets the cost of your membership.</p>
<p>You don’t have to have lots of experience with Clojure to apply. We want a committee made up of a cross-section of the Clojure community so that we have a wide range of perspectives when making decisions on which projects to fund.</p>
<p>As part of the nomination, if we get more than 12 candidates for board membership, the board will nominate no more than 12 candidates. Our bylaws state:</p>
<blockquote>
<p>The Board shall nominate no more than 12 candidates seeking board membership in any given election. In nominating candidates for Director positions and in choosing the number of candidates to nominate overall, the Board shall use reasonable efforts to maintain a Board composition consisting of at least: (1) 25% female Directors, (2) 25% non-Caucasian Directors, and (3) 35% from any category(ies) of persons (e.g., race, gender, ability) commonly considered to have suffered from discrimination at some time and then-currently under-represented in the technology industry, in each case as determined by the Board in its reasonable discretion.</p>
</blockquote>
<p><strong>The main responsibilities of a committee member are:</strong></p>
<ul>
<li>Participate in the general discussions of the month-to-month running of the program</li>
<li>Evaluate and vote on which open source projects to fund</li>
<li>Help in decision-making for the future plans of Clojurists Together</li>
<li>These responsibilities take roughly one hour/month, though there are peaks and troughs of activity as we go through our quarterly funding cycle. If you have more time to offer, there are lots more things that need developing, automating, designing, e.t.c. It would be great to have you help out with those things, but we don’t want to exclude people from standing because they don’t have a lot of spare time.</li>
</ul>
<p>Our bylaws requires that we do not have more than two committee members from any one company. More than two people from a company can stand for election, but if more than two of these people were to be elected, only the top two ranked candidates would be elected and the other seats would go to the next most highly ranked candidates from other companies. If you have any questions about this, please get in touch.</p>
<p>Elections will be held once the candidates are announced, and all Clojurists Together members will be eligible to vote.</p>
<h3 id="annual-members-meeting">Annual Members Meeting</h3>
<p>We are also holding our fifth members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=2025+Clojurists+Together+Annual+Meeting&amp;iso=20251029T10&amp;p1=224&amp;ah=1">10 am Pacific time, October 29, 2025</a>. This will be an opportunity for Clojurists Together to share information about 2025 to date and discuss future plans, present the new board members, and most importantly take questions from and engage with members.</p>
<p><strong>More details on this will follow including a videoconferencing link.</strong></p>
<p>Please share this with anyone you think would be able to represent the interests of the Clojure community and Clojurists Together members. Thanks for your support of Clojurists Together, we appreciate it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2025 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2025-funding-announcement/</link>
      <pubDate>Sat, 23 Aug 2025 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2025-funding-announcement/</guid>
      <description>We are funding 6 projects for a total of $33K USD in Q3 2025.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce that we will be funding 6 projects in Q3 2025 for a total of $33K USD (3 for $9K and 3 shorter or more experimental projects for $2K).  Thanks to all our members for making this happen! Congratulations to the 6 developers below - we&rsquo;re looking forward to your project updates.</p>
<p><strong>$9K USD Projects</strong><br>
<a href="#ambrose-bonnaire-sergeant-malli">Ambrose Bonnaire-Seargent: Malli</a><br>
<a href="#dragan-duric-uncomplicate-clojure-ml">Dragan Duric: Uncomplicate Clojure ML</a><br>
<a href="#jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</a></p>
<p><strong>$2K USD Projects</strong><br>
<a href="#jeremiah-coyle-fireworks">Jeremiah Coyle: Fireworks</a><br>
<a href="#roman-liutikov-uix">Roman Liutikov: Uix</a><br>
<a href="#thomas-clark-fastmath">Thomas Clark: FastMath</a></p>
<p>And here&rsquo;s a project description from each developer:</p>
<h2 id="ambrose-bonnaire-sergeant-malli">Ambrose Bonnaire-Sergeant: Malli</h2>
<h3 id="automatic-schema-optimizer-and-simplifier">Automatic Schema Optimizer and Simplifier</h3>
<p>There are many different ways to organize schemas in malli based on your needs.
You might write them manually, deciding between registries or top-level defs,
and :multi vs :or. You can even generate them automatically from external data sources,
with much less control over the final nested structure of your schemas.</p>
<p>Unfortunately, malli&rsquo;s core algorithms for transforming schemas into things like validators and generators are quite sensitive to the the input schema. Even seemingly equivalent schemas can have different performance characteristics and different generators.</p>
<p>I would like to create a schema analyzer that can simplify complex schemas,
such that two different but equivalent schemas could have the same representation. Using this analyzer, we can build more efficient validators, more reliable generators, more helpful error messages, more succinct translations to other specification tools, and beyond.</p>
<p>This work directly follows my previous Clojurists Together project on
map constraints: <a href="https://www.clojuriststogether.org/news/nov.-2024-short-term-project-updates/">https://www.clojuriststogether.org/news/nov.-2024-short-term-project-updates/</a>  <br></p>
<hr>
<h2 id="dragan-duric-uncomplicate-clojure-ml">Dragan Duric: Uncomplicate Clojure ML</h2>
<p>I propose to implement:</p>
<ul>
<li>a Clojure developer-friendly API for AI/DL/ML models (in the first iteration based on ONNX Runtime, but later refined to be even more general).</li>
<li>Implement its first backend engine (based on ONNX Runtime).</li>
<li>support relevant operations as Clojure functions.</li>
<li>an extension infrastructure for various future backend implementations.</li>
<li>a clean low-level integration with Uncomplicate, Neanderthal, Deep Diamond and Clojure abstractions.</li>
<li>assorted improvements to Uncomplicate, Neanderthal, Deep Diamond, to support these additions.</li>
<li>develop examples for helping people getting started.</li>
<li>related bugfixes.</li>
<li>TESTS (of course!).  <br></li>
</ul>
<hr>
<h2 id="jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</h2>
<p>This next quarter of jank development is what ties everything together. We have a Clojure compiler and runtime. We have gorgeous error reporting. We have seamless C++ interop. Now we need jank to be easy to build and install on both macOS and Linux. We need stable and robust tooling, including leiningen and deps.edn support. We need to fill in all of the cracks, squash the bugs, document features, and get jank into a state which our adventurous alpha testers can use.</p>
<p>This quarter, I&rsquo;ll be building packages for Ubuntu, Arch, Homebrew, and Nix. I&rsquo;ll be minimizing jank&rsquo;s dependencies, automating builds, filling in test suites for module loading, AOT building, and the Clojure runtime. I&rsquo;ll be working to get the final Clang and LLVM changes I have upstreamed into LLVM 22, adding a health check to jank to diagnose installation issues, and filling in some C++ interop functionality I couldn&rsquo;t get to last quarter.</p>
<p>Altogether, this quarter is going to be a hodgepodge of all of the various tasks needed to get jank shipped.   <br></p>
<hr>
<h2 id="jeremiah-coyle-fireworks">Jeremiah Coyle: Fireworks</h2>
<h3 id="primary-goals-for-fireworks-q3-2025">Primary goals for Fireworks, Q3 2025</h3>
<p><strong>Editor integration</strong><br>
Publish Fireworks editor plugins/extensions/integrations for Emacs, VS Code, and IntelliJ. These are fairly simple extensions that involve some basic form rewriting for wrapping/unwrapping forms.</p>
<p><strong>Automatic color support detection</strong><br>
Add support for automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">Chalk</a>. <a href="https://github.com/paintparty/fireworks/issues/42">#42</a></p>
<p><strong>Documentation of interactive workflow.</strong><br>
Produce written and/or video documentation a live hot-reloading dev environment for JVM Clojure, powered by Fireworks and Bling.</p>
<p><strong>Enhanced documentation for theme creation.</strong><br>
Produce written and/or video documentation that makes it easier for people to create their own themes to suite their tastes.</p>
<p><strong>Call-site options for quick formatting changes.</strong><br>
For hifi printing, support call-site option to disable all truncation and ellipsis<br>
<a href="https://github.com/paintparty/fireworks/issues/14">#14</a></p>
<h3 id="secondary-goals-for-fireworks-q3-2025">Secondary goals for Fireworks, Q3 2025</h3>
<p><strong>Pipeline for cljs browser console printing</strong><br>
Hifi output with Fireworks works just fine for printing to a browser dev console. Post-processing ansi-tagged output for browser console printing, would, however, be a big improvement vs the current implementation.</p>
<p><strong>Option for changing label color at callsite</strong><br>
Allow for quick call-site changes to the label color for Fireworks output. <a href="https://github.com/paintparty/fireworks/issues/53">#53</a></p>
<p><strong>Support bold output</strong> <br>
Allow for quick call-site changes to the produce bold Fireworks output. <a href="https://github.com/paintparty/fireworks/issues/70">#70</a></p>
<p><strong>Support for native JS sets and maps in CLJS</strong> <br>
When hifi printing, properly display contents of JS Sets and Maps, when they are within a native cljs data structure. <a href="https://github.com/paintparty/fireworks/issues/46">#46</a></p>
<p><strong>Map layout flexibility</strong><br>
For hifi printing, support call-site option to force single-column map layout a la carte. This is sometimes preferable when map contains keys or values that are long strings. <a href="https://github.com/paintparty/fireworks/issues/45">#45</a>   <br></p>
<hr>
<h2 id="roman-liutikov-uix">Roman Liutikov: Uix</h2>
<p>I&rsquo;m currently experimenting with auto memoizing compiler for UIx, an optimization similar to React&rsquo;s Compiler <a href="https://react.dev/learn/react-compiler">https://react.dev/learn/react-compiler</a>. This blog post describes the feature in detail <a href="https://romanliutikov.com/blog/bringing-granular-updates-to-react-the-clojure-way">https://romanliutikov.com/blog/bringing-granular-updates-to-react-the-clojure-way</a>. As a result of this work UIx apps should get better baseline performance out of the box, with fewer work needed from developers.  <br></p>
<hr>
<h2 id="thomas-clark-fastmath">Thomas Clark: FastMath</h2>
<p>Inasmuch as Lewis Carrol may have creatively objected, complex numbers are now an essential part of modern life: from quantum computing upwards and whether we are aware of it or not. Clojure&rsquo;s support for these numbers however, remains sporadic while it&rsquo;s biggest competitor, the well-known comedy snake - and scripting language <a href="https://www.geeksforgeeks.org/python/history-of-python/">https://www.geeksforgeeks.org/python/history-of-python/</a> treats complex numbers as first-class citizens.</p>
<p>With this funding, I would like to address the issue somewhat, particularly with regard to the implementation of complex matrices, but concerning a consistent complex API more generally.</p>
<p>Surveying the current field, the &lsquo;emmy&rsquo; library seems to be the most developed option in this area, but it is focussed on symbolic manipulation. When dealing with large memory simulations, it is unlikely to be competitive. &lsquo;core.matrix.complex&rsquo; seems to be the numerical choice, but its last commit was 5 years ago, it is a thin wrapper over apache commons and not all matrix protocols seem to have been extended to complex numbers. More confusingly, when dealing with numerical matrices more generally, the go-to choices are fastmath and neanderthal - neither of which have implemented complex matrices.</p>
<p>As the ecosystem is clearly fragmented, this project would seek to extend fastmath, which is the current high-level go-to for numerical matrices, to deal with complex numbers in an API-consistent way.</p>
<p>I would proceed as follows:</p>
<ul>
<li>
<p>extended survey of the status and limitations of the present options (including performance tests for the current implementations)</p>
</li>
<li>
<p>decision on the best architecture for a competitive solution</p>
</li>
<li>
<p>Implementation/API creation for:
** complex vectors, arrays and fundamental matrix ops (including scaling/trace determinant etc.)<br>
** LU decomposition and solver</p>
</li>
<li>
<p>Integration with:<br>
**existing fastmath functions, e.g. including fourier analysis and polynomials<br>
** Wolframite<br>
** Clay / kind</p>
</li>
<li>
<p>Performance comparisons with (at least):<br>
** Python<br>
** Emmy<br>
** Wolframite</p>
</li>
<li>
<p>Publication of a full blog report, outlining an introduction to working with complex numbers in Clojure, complete with the results and analysis of the above.</p>
</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>July 2025 Short-Term Q2 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/july-2025-short-term-q2-project-updates/</link>
      <pubDate>Mon, 04 Aug 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-2025-short-term-q2-project-updates/</guid>
      <description>News from Bling, CALVA, CIDER, and Jank</description>
      <content:encoded><![CDATA[<p>This is the July and final project update for four of our Q2 2025 Funded Projects. (Reports for the other two are on a different schedule). A brief summary of each project is included to provide overall context. Thanks everyone for your awesome work!</p>
<p><a href="#bling-jeremiah-coyle">Jeremiah Coyle: Bling</a><br>
Add support for using hiccup to style and format messages, a template string syntax to style and format messages, and 1-3 additional formatting templates for callouts, headers, and points-of-interest.</p>
<p><a href="#calva-brandon-ringe">Brandon Ringe: CALVA</a> <br>
A new REPL output view for Calva, which is a webview in VS Code. The webview will allow us to add more rich features to the output webview, while also providing better performance.</p>
<p><a href="#cider-bozhidar-batsov">Bozhidar Batsov: CIDER</a><br>
Provide continued support for CIDER, nREPL and the related libraries (e.g. Orchard, cidernrepl, etc) and improve them in various ways.</p>
<p><a href="#jank-jeaye-wilkerson">Jeaye Wilkerson: Jank</a>  <br>
Build jank&rsquo;s seamless C++ interop system.<br>
<br></p>
<h2 id="bling-jeremiah-coyle">Bling: Jeremiah Coyle</h2>
<p>Q2 2025 $2k. Report No. 2, Published 14 July 2025</p>
<br>
<p>I&rsquo;m happy to report that all of the Q2 primary and secondary goals were completed. In addition, some tertiary goals and user requests that popped up along the way were addressed. Many thanks to Clojurists Together for supporting this work!
<br></p>
<h3 id="summary-of-goals-achieved-in-q2">Summary of goals achieved in Q2:</h3>
<ul>
<li>
<p><strong>Primary goals</strong></p>
<ul>
<li>Enable Hi-Fidelity, theme-able, colorized, structural printing of values via Fireworks.
<a href="https://github.com/paintparty/bling/issues/29">#29</a>. <a href="https://github.com/paintparty/bling?tab=readme-ov-file#high-fidelity-printing">Docs</a></li>
<li>Utilize <code>callout</code> to create a specialized template for Malli validation errors.
<a href="https://github.com/paintparty/bling/issues/28">#28</a>.  <a href="https://github.com/paintparty/bling?tab=readme-ov-file#usage-with-malli">Docs </a></li>
<li>Figlet banners with lolcat-style gradient coloring. <a href="https://github.com/paintparty/bling?tab=readme-ov-file#figlet-banners">Docs</a></li>
<li>Opt-in optimization for enhanced contrast in light or dark terminals. <a href="https://github.com/paintparty/bling/issues/30">#30</a>. <a href="https://github.com/paintparty/bling?tab=readme-ov-file#enhanced-contrast">Docs</a></li>
<li>Respect <code>NO_COLOR</code> env var <a href="https://github.com/paintparty/bling/issues/27">#27</a>. <a href="https://github.com/paintparty/bling?tab=readme-ov-file#respecting-the-users-preference-for-no-color">Docs</a></li>
</ul>
</li>
</ul>
<br>
<ul>
<li>
<p><strong>Secondary goals</strong></p>
<ul>
<li>Add enhanced support for using hiccup to style and format messages. <a href="https://github.com/paintparty/bling/issues/15">#15</a></li>
<li>Create 1-3 additional formatting templates for <a href="https://github.com/paintparty/bling?tab=readme-ov-file#with-theme-minimal">callouts</a>, <a href="https://github.com/paintparty/bling?tab=readme-ov-file#side-label">headers</a>, and points-of-interest.</li>
<li>Add/update <a href="https://github.com/paintparty/bling?tab=readme-ov-file#templates-for-errors-and-warnings">documentation</a> about how to leverage Bling to create great-looking warnings and errors.</li>
</ul>
</li>
</ul>
<br>
<ul>
<li><strong>Tertiary goals that arose in the course of solving the above</strong>
<ul>
<li>Enhanced test suite for JVM Clojure and Node (JS)</li>
<li>Enhanced test suite for Babashka</li>
<li>Hifi printing support for custom datatypes whose size cannot be determined <a href="https://github.com/paintparty/fireworks/issues/69">#69</a></li>
</ul>
</li>
</ul>
<br>
<p>The latest release is <a href="https://clojars.org/io.github.paintparty/bling/versions/0.8.7"><code>v0.8.7</code></a>, which features most of the enhancements listed above.<br>
<br>
<br></p>
<p>Detailed descriptions and screenshots of the above features:</p>
<h3>Specialized template for Malli validation errors</h3>
<p><a href="https://github.com/paintparty/bling/issues/28">#28</a></p>
<p>This is experimental, with more work to be done on optimizing for disjunctions and cases with multiple errors on same value. <a href="https://github.com/paintparty/bling?tab=readme-ov-file#usage-with-malli">Docs here</a></p>
<p>Bling offers <code>bling.explain/explain-malli</code> to present <a href="https://github.com/metosin/malli">Malli</a> validation errors:</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/malli-explain-missing-key_dark_source-code-0.8.0.png" width="700px"/></div>
<br>
The above code would print the following:  
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/malli-explain-missing-key_dark-0.7.0.png" width="700px"/></div>
<p>You can also pass an option trailing options map to customize the appearance of the printed output. In the example below, we are leaving out the display of the schema within the callout block:</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/malli-explain-bad-set-value-with-no-schema_dark_source-code-0.7.0.png" width="700px"/></div>
<br>
The above code would print the following:  
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/malli-explain-bad-set-value-with-no-schema_dark-0.7.0.png" width="700px"/></div>
<h3>High Fidelity Printing</h3>  
<p><a href="https://github.com/paintparty/bling/issues/29">#29</a></p>
<p><a href="https://github.com/paintparty/bling?tab=readme-ov-file#high-fidelity-printing">Docs here</a></p>
<p>Bling offers <code>bling.hifi</code> for colorized pretty-printing of values. <code>bling.hifi/hifi</code> will return an ansi-sgr decorated string, while <code>bling.hifi/print-hifi</code> will print such a string.</p>
<p>Under the hood, the formatting/colorizing is achieved with <a href="https://github.com/paintparty/fireworks" target="_blank">Fireworks</a>.</p>
<p>By default, the theme of this output will be <code>Universal Neutral</code>.</p>
<p>If you <a href="https://github.com/paintparty/bling?tab=readme-ov-file#enhanced-contrast">set a valid <code>BLING_MOOD</code> env var</a>, the theme of the <code>hifi</code> output will be <code>Alabaster Light</code> or <code>Alabaster Dark</code>.</p>
<p>You can choose <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#theming" target="_blank">one of the other available themes</a> by following the instructions in the Fireworks readme and <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#step-3" target="_blank">setting up a <code>config.edn</code> on your system</a>, with a corresponding <code>BLING_CONFIG</code> env var. This config will also let you control many other aspects of the formatting with the <code>hifi</code> output.</p>
<p>Check out <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#theming" target="_blank">the other available themes here</a></p>
<br>
<div align="center"><sub><b><i>Alabaster Dark&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</i></b></sub></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/themes/dark/Alabaster-Dark.png" width="534px"/></div>  
<div align="center"><sub><b><i>Alabaster Light&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</i></b></sub></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/themes/light/Alabaster-Light.png" width="534px"/></div>
<br>
<h3>Figlet banners:</h3>
<a href="https://github.com/paintparty/bling?tab=readme-ov-file#figlet-banners">Docs here</a>
<br>
<br>
<p>Bling now features basic support for composing <a href="https://en.wikipedia.org/wiki/FIGlet" target="_blank">Figlet</a> ascii-art
banners with <a href="https://github.com/busyloop/lolcat" target="_blank">lolcat-like gradient overlays</a>. Bling ships with a
small handful of ported Figlet fonts. The glyph layout implementation is bare-bones and there is currently no support for standard figlet
smushing. Figlet banners only work in terminal context (JVM Clojure or Node.js ClojureScript).</p>
<p align="center">
  <img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/bling-banner-fonts_dark-0.7.0.png"
       width="700px" />
</p>
<br>
<h3>Enhanced contrast</h3>  
<p><a href="https://github.com/paintparty/bling/issues/30">#30</a></p>
<p>Docs <a href="https://github.com/paintparty/bling?tab=readme-ov-file#enhanced-contrast">here</a>.</p>
<p>You can set a <code>BLING_MOOD</code> env var to enhance the contrast of Bling-formatted output. Only takes effect on your system, for your eyes only.</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/colors-contrast-scale_dark-0.8.7.png" width="700px"/></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/colors-contrast-scale-0.8.7.png" width="700px"/></div>
<br>
<h3 id="respect-no_color-env-var">Respect <code>NO_COLOR</code> env var</h3>
<p><a href="https://github.com/paintparty/bling/issues/27">#27</a></p>
<p>You can set a <code>NO_COLOR=&quot;true&quot;</code>env var, which will disable any colorization on from any output generated by Bling. The de-colorization only applies locally, for your eyes only. More info on the <a href="https://no-color.org/">informal standard</a>.</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/no-color-callout_dark-0.8.7.png" width="700px"/></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/no-color-callout-0.8.7.png" width="700px"/></div>
<br>
<h3 id="enhanced-support-for-hiccup">Enhanced support for hiccup</h3>
<p><a href="https://github.com/paintparty/bling/issues/15">#15</a></p>
<p>Deeper hiccup support for a cleaner template syntax</p>
<ul>
<li>Utilize <code>[:br]</code>tags for line breaks</li>
<li>Introduce a <code>[:p]</code>tag, to enclose logical paragraphs and automatically add trailing newlines.</li>
<li>Properly support nesting of styles ala <code>[:bold &quot;Bold, &quot; [:italic &quot;bold italic, &quot;] [:red &quot;bold red, &quot;] &quot;bold.&quot;]</code></li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure"><span style="color:#f92672">&#39;</span>(<span style="color:#a6e22e">require</span> bling.core <span style="color:#e6db74">:refer</span> [print-bling])

(println <span style="color:#e6db74">&#34;\n\n&#34;</span>)
(<span style="color:#a6e22e">print-bling</span> [<span style="color:#e6db74">:p</span> <span style="color:#e6db74">&#34;First paragraph&#34;</span>]
             [<span style="color:#e6db74">:p</span> [<span style="color:#e6db74">:bold</span>
                  <span style="color:#e6db74">&#34;Bold, &#34;</span>
                  [<span style="color:#e6db74">:italic</span> <span style="color:#e6db74">&#34;bold italic, &#34;</span>
                   [<span style="color:#e6db74">:red</span> <span style="color:#e6db74">&#34;bold italic red, &#34;</span>]]
                  <span style="color:#e6db74">&#34;bold.&#34;</span>]]
             <span style="color:#e6db74">&#34;Last line&#34;</span>)
</code></pre></div><p>The above code renders the following:</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/nested-styles-example-0.9.0.png" width="700px"/></div>
<p>An initial working implementation of the above is complete on branch <code>0.9.0</code>. Next step will be to consider alternate implementations (perf), test, refine, then merge into main branch.</p>
<br>
<h3 id="new-callout-templates">New callout templates</h3>
<p>Callout docs <a href="https://github.com/paintparty/bling?tab=readme-ov-file#callout-blocks">here</a></p>
<p>New callout template with <code>{:theme :minimal}</code>:</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/callouts_minimal_dark.png" width="700px"/></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/callouts_minimal_light.png" width="700px"/></div>
<p><br><br>
New option <code>:side-label</code> which may be useful for file info etc.</p>
<p>With <code>{:theme :sideline :label-theme :marquee :side-label &quot;foo.core:11:24&quot;}</code>:</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/callouts_sideline_marquee_side-label_dark.png" width="700px"/></div>
<br>
<br>
<h3 id="enhanced-support--improved-docs-for-creating-custom-and-warning-callouts">Enhanced support &amp; improved docs for creating custom and warning callouts</h3>
<p><code>bling.core/callout</code> now accepts any number of arguments, which makes the templatization a little more flexible:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#66d9ef">defn </span>my-error-callout [{<span style="color:#e6db74">:keys</span> [header body source]}]
  (<span style="color:#a6e22e">callout</span> {<span style="color:#e6db74">:type</span>        <span style="color:#e6db74">:error</span>
            <span style="color:#e6db74">:padding-top</span> <span style="color:#ae81ff">1</span>}
           header
           source
           body))

(<span style="color:#a6e22e">my-error-callout</span>
 {<span style="color:#e6db74">:header</span> <span style="color:#e6db74">&#34;Your header message goes here\n&#34;</span>
  <span style="color:#e6db74">:source</span> (<span style="color:#a6e22e">point-of-interest</span> 
           {<span style="color:#e6db74">:type</span>                  <span style="color:#e6db74">:error</span>
            <span style="color:#e6db74">:file</span>                  <span style="color:#e6db74">&#34;example.ns.core&#34;</span>
            <span style="color:#e6db74">:line</span>                  <span style="color:#ae81ff">11</span>
            <span style="color:#e6db74">:column</span>                <span style="color:#ae81ff">1</span>
            <span style="color:#e6db74">:form</span>                  <span style="color:#f92672">&#39;</span>(+ foo baz)
            <span style="color:#e6db74">:text-decoration-index</span> <span style="color:#ae81ff">2</span>})
  <span style="color:#e6db74">:body</span>   (str <span style="color:#e6db74">&#34;The body of your template goes here.\n&#34;</span>
               <span style="color:#e6db74">&#34;Second line of copy.\n&#34;</span>
               <span style="color:#e6db74">&#34;Another line.&#34;</span>)})
</code></pre></div><p>The above callout would render like this your terminal emulator:</p>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/callout-with-poi_sideline_minimal_dark.png" width="700px"/></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/callout-with-poi_sideline_minimal_light.png" width="700px"/></div>
<br>
<br>
<h3 id="hifi-printing-support-for-custom-datatypes">Hifi printing support for custom datatypes</h3>
<p>This was a bug fix + enhancement <a href="https://github.com/paintparty/fireworks/issues/69">#69</a> in the upstream Fireworks lib, which enables the representation of custom datatypes when printing with <code>bling.hifi/hifi</code></p>
<br>
<h3 id="enhanced-test-suites">Enhanced test suites</h3>
<p>A new suite of tests for both JVM Clojure and <a href="https://github.com/paintparty/bling/commit/baf2f9685ea1d2b9ffb7fc55f86d59c0247ae5fc">Babashka was added</a>. Docs <a href="https://github.com/paintparty/bling?tab=readme-ov-file#testing">here</a>.  <br></p>
<hr>
<h2 id="calva-brandon-ringe">CALVA: Brandon Ringe</h2>
<p>Q2 2025 $9k. Report No. 3, Published 13 July 2025</p>
<p>Since the last report, I spent some time adding content reloading support to the output view. By that I mean that when the output view is closed and reopened, and when the VS Code window is reloaded, the output view would reload its contents. However, this became problematic in multiple ways, so I decided to remove the feature in favor of reducing maintenance burden. The benefit of the feature did not outweight the cost of maintaining it, in my opinion. <a href="https://github.com/BetterThanTomorrow/calva/pull/2896">The PR for removing it</a> can serve as a reference for anyone who might want to try implementing the feature in the future.</p>
<p>Here&rsquo;s the list of changes to the output view that have happened since the last report:</p>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2827">Reload contents of output view when VS Code window is reloaded</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2867">Reload contents of output view when it&rsquo;s closed and reopened (without closing VS Code)</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2883">After VS Code reload a new separate output view is opened on connect when one is already open</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2870">Output view sometimes opens with broken code highlighting</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2894">Remove content reloading from output view</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2895">Output view syntax highlighting breaks when it&rsquo;s dragged into or out of main VS Code window</a></li>
</ul>
<p>Thank you to Clojurists Together and its members for supporting this work! I hope Calva users will enjoy using this output view.  <br></p>
<hr>
<h2 id="cider-bozhidar-batsov">CIDER: Bozhidar Batsov</h2>
<p>Q2 2025 $9k. Report No. 3, Published 16 July 2025</p>
<p>This month wasn&rsquo;t as productive as the last two (mostly due to a bit of vacation time and my seasonal allergies draining my energy), but we still made some good progress:</p>
<ul>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.19.0">CIDER 1.19 (&ldquo;Skiathos&rdquo;)</a>
<ul>
<li>The highlight of this release is that Java source downloading is now enabled by default, as we&rsquo;re feeling quite confident about its stability</li>
<li>There are also plenty of small improvements here and there (mostly in the inspector)</li>
<li>You can now also specify default connection params, which will save you a bit of typing in certain cases</li>
</ul>
</li>
<li>clojure-ts-mode
<ul>
<li>Small improvements to the built-in completion source</li>
<li>Added the clojure-mode functionality for browsing the Clojure guides and reporting issues</li>
</ul>
</li>
</ul>
<p>There are a lot more things in progress that I didn&rsquo;t have manage to get to the finish line (or remained only the realm of research for the time being):</p>
<ul>
<li>A new starter configuration for CIDER users (to be released soon)</li>
<li>I looked into replacing Antora (the docs engine CIDER and friends are using) with mdBook (made popular by Rust)
<ul>
<li>I&rsquo;m on the fence about this and I probably will stick with Antora</li>
</ul>
</li>
<li>I&rsquo;ve started work on a couple of blog posts (e.g. the long overdue analysis of the CIDER survey results), but I didn&rsquo;t manage to finish them. Coming soon, though!</li>
<li>I&rsquo;ve encountered a few small blockers while working on removing the hard dependency on clojure-mode in CIDER, but we&rsquo;ll get there</li>
<li>I&rsquo;ve played with some screencast apps to record some new CIDER tutorials and I think I have a winner with which to proceed</li>
</ul>
<p>Anyways, I plan to drive those over the finish line and once again I&rsquo;m I&rsquo;d like to thank the members of &ldquo;Clojurists Together&rdquo; for their support of my work on Clojure development tooling. You rock!  <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q2 2025 $9k. Report No. 3, Published 11 July 2025</p>
<p>Hi folks! Thank you so much for the sponsorship this quarter. jank has grown
from not being able to reach into C++ at all, in April, to now working with some of
the most popular C++ libraries. This past month, the highlights are:</p>
<ol>
<li>Added support for manual memory management via <code>cpp/new</code> and <code>cpp/delete</code></li>
<li>Added support for explicit C++ bools via <code>cpp/true</code> and <code>cpp/false</code></li>
<li>Added complex type literals via <code>(cpp/type &quot;std::map&lt;std::string, int&gt;&quot;)</code></li>
<li>Added opaque boxing of native values via <code>cpp/box</code> and <code>cpp/unbox</code></li>
<li>Greatly improved stability and portability</li>
</ol>
<p>Now, at the end of the quarter, jank&rsquo;s seamless C++ support is incredible. For
all of the details, you can check out the related blog post here:<br>
<a href="https://jank-lang.org/blog/2025-07-11-jank-is-cpp/">https://jank-lang.org/blog/2025-07-11-jank-is-cpp/</a></p>
<p>There&rsquo;s still so much work to do, so I hope to write to you again next quarter!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Annually-Funded Developers&#39; Update: May/June 2025</title>
      <link>https://www.clojuriststogether.org/news/annually-funded-developers-update-may/june-2025/</link>
      <pubDate>Sat, 19 Jul 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/annually-funded-developers-update-may/june-2025/</guid>
      <description>Dragan Duric, Eric Dallo, Michiel Borkent, Oleksandr Yakushev, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Hello Fellow Clojurists!
This is the third report from the 5 developers receiving Annual Funding in 2025.</p>
<p><a href="#dragan-duric">Dragan Duric</a>: Apple M Engine Neanderthal, MKL, OpenBlas<br>
<a href="#eric-dallo">Eric Dallo</a>: ECA, metrepl, clojure-lsp, clojure-lsp-intellij<br>
<a href="#michiel-borkent">Michiel Borkent</a>: clj-kondo, babashka, SCI, quickblog, edamame, and more&hellip;<br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>: CIDER<br>
<a href="#peter-taoussanis">Peter Taoussanis</a>: Trove, Sente, Tufte</p>
<h2 id="dragan-duric">Dragan Duric</h2>
<p>2025 Annual Funding Report 3. Published July 4, 2025.</p>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpus) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>In May and June, I completed Neanderthal&rsquo;s Apple Silicon engine, updated MKL and OpenBLAS engines to be compatible with the introduced improvements to the overall code, fixed and polished many incompatibilities between the engines, and bugs that were introduced or discovered during the process, and updated all technologies newer versions. One huge improvement that the users will notice is AOT version of Neanderthal that is loading engines quickly.</p>
<p>I also reorganized Deep Diamond as separate technology-specific projects (so the users can configure their own combination appropriate to their systems) and an AOT project. I started working on the CPU engine for tensors and neural networks. It&rsquo;s an uphill battle, since
Apple&rsquo;s API are:</p>
<ul>
<li>not very nice compared to Intel and Nvidia (which are atrocities themselves compared to Clojurians' standards :))</li>
<li>poorly documented</li>
<li>very inconsistent -</li>
<li>contain several generations of deprecations and new ways of doing things</li>
<li>buggy</li>
<li>(most annoyingly) there are literally no code examples anywhere on the internet, so I have to discover everything by poking inside the REPL (I can&rsquo;t imagine how people do that without Clojure/REPL :) So, I made lots of progress, but not nearly enough for a stable engine. It will take time.</li>
</ul>
<p>As I also made some contributions to JavaCPP, I had to wait for it to release new version for the proper release of Neanderthal. They finally did it on 1st July, so I released Neanderthal as soon as I could (not in June, but day or two later :)</p>
<p>I also made assorted improvements and bugfixes to related Uncomplicate projects, all of them under the hood, but some of them very useful!</p>
<p>Here&rsquo;s what I&rsquo;ve proposed when applying for the CT grant.</p>
<p>I proposed to <em>Implement an Apple M engine for Neanderthal.</em> This involves:</p>
<ul>
<li>buying an Apple M2/3 Mac (the cheapest M3 in Serbia is almost 3000 USD (with VAT).</li>
<li>learning enough macOS tools (Xcode was terrible back in the days) to be able to do anything.</li>
<li>exploring JavaCPP support for ARM and macOS.</li>
<li>exploring relevant libraries (OpenBLAS may even work through JavaCPP).</li>
<li>exploring Apple Accelerate.</li>
<li>learning enough JavaCPP tooling to be able to see whether it is realistic that I build Accelerate wrapper (and if I can&rsquo;t, at least to know how much I don&rsquo;t know).</li>
<li>I forgot even little C/C++ that I did know back in the day. This may also give me some headaches, as I&rsquo;ll have to quickly pick up whatever is needed.</li>
<li>writing articles about relevant topics so Clojurians can pick this functionality as it arrives.</li>
</ul>
<p>Projects directly involved:
<a href="https://github.com/uncomplicate/neanderthal">https://github.com/uncomplicate/neanderthal</a><br>
<a href="https://github.com/uncomplicate/deep-diamond">https://github.com/uncomplicate/deep-diamond</a><br>
<a href="https://github.com/uncomplicate/clojure-cpp">https://github.com/uncomplicate/clojure-cpp</a><br>
<a href="https://github.com/uncomplicate/clojurecuda">https://github.com/uncomplicate/clojurecuda</a></p>
<p>Looking at the funding proposal, I can say that I&rsquo;m very satisfied that all the features that I promised to build are nicely progressing.</p>
<p>As the Deep Diamond Tensor stuff is brewing, I might start looking into Apple Metal and low-level GPU computing, so I can hope to also provide GPU computing on Apple silicon at least for Neanderthal, if not for Deep Diamond.</p>
<p>All in all, I feel optimistic about how this project progresses!  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>2025 Annual Funding Report 3. Published June 30, 2025.</p>
<p>In these last 2 months I could work on 2 main things, multiple improvements for clojure-lsp with fixes and new features and a exciting new project called <a href="https://github.com/editor-code-assistant/eca">ECA</a>.</p>
<h3 id="ecahttpsgithubcomeditor-code-assistanteca"><a href="https://github.com/editor-code-assistant/eca">eca</a></h3>
<p>ECA (Editor Code Assistant) is a OpenSource, free, standardized server written in Clojure to make any editor have AI features like Cursor, Continue, Claude and others.
The idea is simple, it has a protocol heavily inspired by LSP, and editors can communicate with the eca server which will have the logic to communicate with multiple LLMs and provide AI features like chat, edit, MCPs, completion etc.</p>
<p>The project is in alpha state and there are so many things to do, but I hope community will help make this project a success!</p>
<p><a href="https://github.com/editor-code-assistant/eca">Give a star to the project</a> 🌟 and for more details check the <a href="https://github.com/orgs/editor-code-assistant/projects/1">roadmap</a></p>
<p><img src="https://github.com/user-attachments/assets/66e61f06-733e-4208-80a2-f7c75a74552e" alt="eca-emacs"></p>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>There were so many improvements for clojure-lsp regarding performance, fixes, and new features.
The most notable new feature is the <a href="https://clojure-lsp.io/features/#custom-linters">support for custom linters</a> defined by the user, it follows a similar logic of clj-kondo hooks, but with improved support for clojure-lsp in-memory data access, giving power for linters know about the project and not only a single file, with test support for linters.
Check the missing-unit-test custom linter:<br>
<img width="1023" height="140" alt="custom-linters" src="https://github.com/user-attachments/assets/8ac55c51-6ce0-4959-9ddc-e89d8f304ed4" /></p>
<h4 id="20250527-135657---20250613-204544">2025.05.27-13.56.57 - 2025.06.13-20.45.44</h4>
<ul>
<li>
<p>General</p>
<ul>
<li>
<p>Consider <code>.lsp/config.edn</code> as part of project code, removing false positives of unused-public-var linter.</p>
</li>
<li>
<p>Consider full qualified symbols in edn files when checking for var references.</p>
</li>
<li>
<p>Improve clojure-lsp linter capabilities, migrating <code>unused-public-var</code> and <code>different-aliases</code> linters to be built-in linters. #2050</p>
<ul>
<li>Migrate from clj-kondo <code>custom-lint-fn</code> but considering kondo settings to avoid breaking changes.</li>
<li>Considerably improve performance of <code>unused-public-var</code> and <code>different-aliases</code> linters.</li>
</ul>
</li>
<li>
<p>Bump rewrite-clj to 1.2.50.</p>
</li>
<li>
<p>New feature: Add support for custom project linters. #2043 #2058</p>
</li>
<li>
<p>Publish to clojars <code>com.github.clojure-lsp/clojure-lsp-test-helper</code> to be able to test created custom linters.</p>
</li>
<li>
<p>Bump clj-kondo to <code>2025.04.08-20250526.195207-12</code>.</p>
</li>
<li>
<p>Small performance improvements across clojure-lsp, especially on places with comparassions inside big loops.</p>
</li>
<li>
<p>Bump clj-depend to <code>0.11.1</code>.</p>
</li>
<li>
<p>Provide analysis of unresolved namespaces, making features like definition, hover, references work.</p>
</li>
<li>
<p>Fix .lsp/config.edn file not found diagnostic when it doesn&rsquo;t exist on project.</p>
</li>
<li>
<p>Fix custom linters source-paths analysis to consider all files in a source-path.</p>
</li>
<li>
<p>Fix crash on files with empty ignore comments.</p>
</li>
<li>
<p>Bump clj-kondo to <code>2025.06.05</code>.</p>
</li>
<li>
<p>Fix analysis consistency for internal files.</p>
</li>
<li>
<p>Fix custom-linters not working for cases using <code>clojure-lsp.custom-linters-api/find-nodes</code>.</p>
</li>
<li>
<p>Improve <code>clojure-lsp.custom-linters-api/dir-uris-&gt;file-uris</code> to consider file-uris as well on input.</p>
</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Add support for LSP feature <code>textDocument/selectionRange</code>. #1961</li>
<li>Fix outdated analysis for watched created/deleted files (git branch switchs for example). #2046</li>
</ul>
</li>
<li>
<p>API/CLI</p>
<ul>
<li>Replace <code>tools.cli</code> with <code>babashka.cli</code>. #2036</li>
</ul>
</li>
</ul>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h4 id="350">3.5.0</h4>
<ul>
<li>Add support for creating Clojure namespaces. #78</li>
</ul>
<h3 id="metreplhttpsgithubcomericdallometrepl"><a href="https://github.com/ericdallo/metrepl">metrepl</a></h3>
<h4 id="031---041">0.3.1 - 0.4.1</h4>
<ul>
<li>Add compatibility with older opentelemetry versions.</li>
<li>Fix read config from classpath</li>
<li>Fix OpenTelemetry integration race condition corner case.</li>
<li>Replace <code>event/first-op-requested</code> with <code>info/repl-ready</code> adding more info about the project.</li>
<li>Add <code>:first-time</code> to <code>:event/op-completed</code> and <code>:event/op-requested</code> when op is <code>load-file</code> and first time processing it.</li>
<li>Bump opentelemetry to 1.51.0.  <br></li>
</ul>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>2025 Annual Funding Report 3. Published July 1, 2025.</p>
<p>In this post I&rsquo;ll give updates about open source I worked on during May and June 2025.
To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work
possible. Without you the below projects would not be as mature or wouldn&rsquo;t
exist or be maintained at all! So a sincere thank you to everyone who
contributes to the sustainability of these projects.</p>
<img alt="gratitude" src="https://emoji.slack-edge.com/T03RZGPFR/gratitude/f8716bb6fb7e5249.png" width="50px" text-align="center">
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br">Nubank</a></li>
</ul>
<p>Open the details section for more info about sponsoring.</p>
<details>
<summary>Sponsor info</summary>
<p>If you want to ensure that the projects I work on are sustainably maintained,
you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
</details>
<!--

- ls -lat ~/dev
- babashka sub dir checken

-->
<h3 id="updates">Updates</h3>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months, 19 in total!</p>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Bump edamame (support old-style <code>#^</code> metadata)</li>
<li>Bump SCI: fix <code>satisfies?</code> for protocol extended to <code>nil</code></li>
<li>Bump rewrite-clj to <code>1.2.50</code></li>
<li><strong>1.12.204 (2025-06-24)</strong></li>
<li>Compatibility with <a href="https://github.com/nextjournal/clerk">clerk</a>&rsquo;s main branch</li>
<li><a href="https://github.com/babashka/babashka/issues/1834">#1834</a>: make <code>taoensso/trove</code> work in bb by exposing another <code>timbre</code> var</li>
<li>Bump <code>timbre</code> to <code>6.7.1</code></li>
<li>Protocol method should have <code>:protocol</code> meta</li>
<li>Add <code>print-simple</code></li>
<li>Make bash install script work on Windows for GHA</li>
<li>Upgrade Jsoup to <code>1.21.1</code></li>
<li><strong>1.12.203 (2025-06-18)</strong></li>
<li>Support <code>with-redefs</code> + <code>intern</code> (see SCI issue <a href="https://github.com/babashka/sci/issues/973">#973</a></li>
<li><a href="https://github.com/babashka/babashka/issues/1832">#1832</a>: support <code>clojure.lang.Var/intern</code></li>
<li>Re-allow <code>init</code> as task name</li>
<li><strong>1.12.202 (2025-06-15)</strong></li>
<li>Support <code>clojure.lang.Var/{get,clone,reset}ThreadBindingFrame</code> for JVM Clojure compatibility</li>
<li><a href="https://github.com/babashka/babashka/issues/1741">#1741</a>: fix <code>taoensso.timbre/spy</code> and include test</li>
<li>Add <code>taoensso.timbre/set-ns-min-level!</code> and <code>taoensso.timbre/set-ns-min-level</code></li>
<li><strong>1.12.201 (2025-06-12)</strong></li>
<li><a href="https://github.com/babashka/babashka/issues/1825">#1825</a>: Add <a href="https://github.com/nextjournal/markdown">Nextjournal Markdown</a> as built-in Markdown library</li>
<li>Promesa compatibility (pending PR <a href="https://github.com/funcool/promesa/pull/160">here</a>)</li>
<li>Upgrade clojure to <code>1.12.1</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1818">#1818</a>: wrong argument order in <code>clojure.java.io/resource</code> implementation</li>
<li>Add <code>java.text.BreakIterator</code></li>
<li>Add classes for compatibility with <a href="https://github.com/funcool/promesa">promesa</a>:
<ul>
<li><code>java.lang.Thread$Builder$OfPlatform</code></li>
<li><code>java.util.concurrent.ForkJoinPool</code></li>
<li><code>java.util.concurrent.ForkJoinPool$ForkJoinWorkerThreadFactory</code></li>
<li><code>java.util.concurrent.ForkJoinWorkerThread</code></li>
<li><code>java.util.concurrent.SynchronousQueue</code></li>
</ul>
</li>
<li>Add <code>taoensso.timbre/set-min-level!</code></li>
<li>Add <code>taoensso.timbre/set-config!</code></li>
<li>Bump <code>fs</code> to <code>0.5.26</code></li>
<li>Bump <code>jsoup</code> to <code>1.20.1</code></li>
<li>Bump <code>edamame</code> to <code>1.4.30</code></li>
<li>Bump <code>taoensso.timbre</code> to <code>6.7.0</code></li>
<li>Bump <code>pods</code>: more graceful error handling when pod quits unexpectedly</li>
<li><a href="https://github.com/babashka/babashka/issues/1815">#1815</a>: Make install-script wget-compatible (<a href="https://github.com/eval">@eval</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1822">#1822</a>: <code>type</code> should prioritize <code>:type</code> metadata</li>
<li><code>ns-name</code> should work on symbols</li>
<li><code>:clojure.core/eval-file</code> should affect <code>*file*</code> during eval</li>
<li><a href="https://github.com/babashka/babashka/issues/1179">#1179</a>: run <code>:init</code> in tasks only once</li>
<li><a href="https://github.com/babashka/babashka/issues/1823">#1823</a>: run <code>:init</code> in tasks before task specific requires</li>
<li>Fix <code>resolve</code> when <code>*ns*</code> is bound to symbol</li>
<li>Bump <code>deps.clj</code> to <code>1.12.1.1550</code></li>
<li>Bump <code>http-client</code> to <code>0.4.23</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting</p>
<ul>
<li><strong>0.10.47 (2025-06-27)</strong></li>
<li>Security issue: function recursion can be forced by returning internal keyword as return value</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/975">#975</a>: Protocol method should have :protocol var on metadata</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/971">#971</a>: fix <code>satisfies?</code> for protocol that is extended to <code>nil</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/977">#977</a>: Can&rsquo;t analyze sci.impl.analyzer with splint</li>
<li><strong>0.10.46 (2025-06-18)</strong></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/957">#957</a>: <code>sci.async/eval-string+</code> should return promise with <code>:val nil</code> for ns form rather than <code>:val &lt;Promise&gt;</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/959">#959</a>: Java interop improvement: instance method invocation now leverages type hints</li>
<li>Bump edamame to <code>1.4.30</code></li>
<li>Give metadata <code>:type</code> key priority in <code>type</code> implementation</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/967">#967</a>: <code>ns-name</code> should work on symbols</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/969">#969</a>: <code>^:clojure.core/eval-file</code> metadata should affect binding of <code>*file*</code> during evaluation</li>
<li>Sync <code>sci.impl.Reflector</code> with changes in <code>clojure.lang.Reflector</code> in clojure 1.12.1</li>
<li>Fix <code>:static-methods</code> option for class with different name in host</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/973">#973</a>: support <code>with-redefs</code> on core vars, e.g. <code>intern</code>. The fix for this
issue entailed quite a big refactor of internals which removes &ldquo;magic&rdquo;
injection of ctx in core vars that need it.</li>
<li>Add <code>unchecked-set</code> and <code>unchecked-get</code> for CLJS compatibility</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>Make clerk compatible with babashka</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickblog">quickblog</a>: light-weight static blog engine for Clojure and babashka</p>
<ul>
<li><strong>0.4.7 (2025-06-12)</strong></li>
<li>Switch to <a href="https://github.com/nextjournal/markdown">Nextjournal Markdown</a> for markdown rendering
The minimum babashka version to be used with quickblog is now v1.12.201 since it comes with Nextjournal Markdown built-in.</li>
<li>Link to previous and next posts; see &ldquo;Linking to previous and next posts&rdquo; in
the README (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li>Fix flaky caching tests (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li>Fix argument passing in test runner (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li>Add <code>--date</code> to api/new. (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li>Support Selmer template for new posts in api/new</li>
<li>Add &lsquo;language-xxx&rsquo; to pre/code blocks</li>
<li>Fix README.md with working version in quickstart example</li>
<li>Fix <a href="https://github.com/borkdude/quickblog/issues/104">#104</a>: fix caching with respect to previews</li>
<li>Fix <a href="https://github.com/borkdude/quickblog/issues/104">#104</a>: document <code>:preview</code> option</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/edamame">edamame</a>: configurable EDN and Clojure parser with location metadata and more</p>
<ul>
<li><strong>1.4.31 (2025-06-25)</strong></li>
<li>Fix <a href="https://github.com/borkdude/edamame/issues/124">#124</a>: add <code>:imports</code> to <code>parse-ns-form</code></li>
<li>Fix <a href="https://github.com/borkdude/edamame/issues/125">#125</a>: Support <code>#^:foo</code> deprecated metadata reader macro (<a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li>Fix <a href="https://github.com/borkdude/edamame/issues/127">#127</a>: expose <code>continue</code> value that indicates continue-ing parsing (<a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li>Fix <a href="https://github.com/borkdude/edamame/issues/122">#122</a>: let <code>:auto-resolve-ns</code> affect syntax-quote</li>
<li><strong>1.4.30</strong></li>
<li><a href="https://github.com/borkdude/edamame/issues/120">#120</a>: fix <code>:auto-resolve-ns</code> failing case</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/678">#678</a>: Implement <code>random-uuid</code> (<a href="https://github.com/rafaeldelboni">@rafaeldelboni</a>)</li>
<li><strong>v0.8.149 (2025-06-19)</strong></li>
<li><a href="https://github.com/squint-cljs/squint/issues/671">#671</a>: Implement <code>trampoline</code> (<a href="https://github.com/rafaeldelboni">@rafaeldelboni</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/673">#673</a>: remove experimental atom as promise option since it causes unexpected behavior</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/672">#672</a>: alias may contain dots</li>
<li><strong>v0.8.148 (2025-05-25)</strong></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/669">#669</a>: munge refer-ed + renamed var</li>
<li><strong>v0.8.147 (2025-05-09)</strong></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/661">#661</a>: support <code>throw</code> in expression position</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/662">#662</a>: Fix extending protocol from other namespace to <code>nil</code></li>
<li>Better solution for multiple expressions in return context in combination with pragmas</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.<br></p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2560">#2560</a>: NEW linter: <code>:locking-suspicious-lock</code>: report when locking is used on a single arg, interned value or local object</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2555">#2555</a>: false positive with <code>clojure.string/replace</code> and <code>partial</code> as replacement fn</li>
<li><strong>2025.06.05</strong></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2541">#2541</a>: NEW linter: <code>:discouraged-java-method</code>. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2522">#2522</a>: support <code>:config-in-ns</code> on <code>:missing-protocol-method</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2524">#2524</a>: support <code>:redundant-ignore</code> on <code>:missing-protocol-method</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2536">#2536</a>: false positive with <code>format</code> and whitespace flag after percent</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2535">#2535</a>: false positive <code>:missing-protocol-method</code> when using alias in method</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2534">#2534</a>: make <code>:redundant-ignore</code> aware of <code>.cljc</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2527">#2527</a>: add test for using ns-group + config-in-ns for <code>:missing-protocol-method</code> linter</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2218">#2218</a>: use <code>ReentrantLock</code> to coordinate writes to cache directory within same process</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2533">#2533</a>: report inline def under fn and defmethod</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2521">#2521</a>: support <code>:langs</code> option in <code>:discouraged-var</code> to narrow to specific language</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2529">#2529</a>: add <code>:ns</code> to <code>&amp;env</code> in <code>:macroexpand-hook</code> macros when executing in CLJS</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2547">#2547</a>: make redundant-fn-wrapper report only for all cljc branches</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2531">#2531</a>: add <code>:name</code> data to <code>:unresolved-namespace</code> finding for clojure-lsp</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</p>
<ul>
<li>A configuration for <a href="https://github.com/cjohansen/replicant/">replicant</a> was added</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</p>
<ul>
<li><strong>v0.7.23 (2025-06-18)</strong></li>
<li><a href="https://github.com/babashka/scittle/issues/107">#107</a>: add <code>replicant</code> plugin (<a href="https://github.com/jeroenvandijk">@jeroenvandijk</a>)</li>
<li><a href="https://github.com/babashka/scittle/issues/102">#102</a>: add <code>applied-science/js-interop</code> plugin (<a href="https://github.com/chr15m">@chr15m</a>)</li>
<li><a href="https://github.com/babashka/scittle/issues/105">#105</a>: add <code>goog.string/htmlEscape</code> (<a href="https://github.com/ikappaki">@ikappaki</a> )</li>
<li><a href="https://github.com/babashka/scittle/issues/113">#113</a>: add <code>unchecked-set</code> and <code>unchecked-get</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li><strong>1.3.204 (2025-05-15)</strong></li>
<li><a href="https://github.com/babashka/nbb/issues/389">#389</a>: fix regression caused by <a href="https://github.com/babashka/nbb/issues/387">#387</a></li>
<li><strong>1.3.203 (2025-05-13)</strong></li>
<li><a href="https://github.com/babashka/nbb/issues/387">#387</a>: bump <code>import-meta-resolve</code> to fix deprecation warnings on Node 22+</li>
<li><strong>1.3.202 (2025-05-12)</strong></li>
<li>Fix nbb nrepl server for Deno</li>
<li><strong>1.3.201 (2025-05-08)</strong></li>
<li>Deno improvements for loading <code>jsr:</code> and <code>npm:</code> deps, including react in combination with reagent</li>
<li><a href="https://github.com/babashka/nbb/issues/382">#382</a>: prefix all node imports with <code>node:</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</p>
<ul>
<li><strong>v0.2.5 (2025-05-01)</strong></li>
<li>Fix <a href="https://github.com/borkdude/quickdoc/issues/32">#32</a>: fix anchor links to take into account var names that differ only by case</li>
<li><strong>v0.2.4 (2025-05-01)</strong></li>
<li>Revert source link in var title and move back to <code>&lt;sub&gt;</code></li>
<li>Specify clojure 1.11 as the minimal Clojure version in <code>deps.edn</code></li>
<li>Fix macro information</li>
<li>Fix <a href="https://github.com/borkdude/quickdoc/issues/39">#39</a>: fix link when var is named multiple times in docstring</li>
<li>Upgrade clj-kondo to <code>2025.04.07</code></li>
<li>Add explicit <code>org.babashka/cli</code> dependency</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/markdown">Nextjournal Markdown</a></p>
<ul>
<li><strong>0.7.186</strong></li>
<li>Make library more GraalVM <code>native-image</code> friendly</li>
<li><strong>0.7.184</strong></li>
<li>Consolidate utils in <code>nextjournal.markdown.utils</code></li>
<li><strong>0.7.181</strong></li>
<li>Hiccup JVM compatibility for fragments (see <a href="https://github.com/nextjournal/markdown/issues/34">#34</a>)</li>
<li>Support HTML blocks (<code>:html-block</code>) and inline HTML (<code>:html-inline</code>) (see <a href="https://github.com/nextjournal/markdown/issues/7">#7</a>)</li>
<li>Bump commonmark to 0.24.0</li>
<li>Bump markdown-it to 14.1.0</li>
<li>Render <code>:code</code> according to spec into <code>&lt;pre&gt;</code> and <code>&lt;code&gt;</code> block with language class (see <a href="https://github.com/nextjournal/markdown/issues/39">#39</a>)</li>
<li>No longer depend on <code>applied-science/js-interop</code></li>
<li>Accept parsed result in <code>-&gt;hiccup</code> function</li>
<li>Expose <code>nextjournal.markdown.transform</code> through main <code>nextjournal.markdown</code> namespace</li>
<li>Stabilize API and no longer mark library alpha</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nrepl-client">babashka.nrepl-client</a></p>
<ul>
<li>Add <code>:responses</code> key with raw responses</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/speculative">speculative</a></p>
<ul>
<li>Add spec for <code>even?</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client</p>
<ul>
<li><strong>0.4.23 (2025-06-06)</strong></li>
<li><a href="https://github.com/babashka/http-client/issues/75">#75</a>: override existing content type header in multipart request</li>
<li>Accept <code>:request-method</code> in addition to <code>:request</code> to align more with other clients</li>
<li>Accept <code>:url</code> in addition to <code>:uri</code> to align more with other clients</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/unused-deps">unused-deps</a>: Find unused deps in a clojure project</p>
<ul>
<li>This is a brand new project!</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li><a href="https://github.com/babashka/fs/issues/147">#147</a>: <code>fs/unzip</code> should allow selective extraction of files (<a href="https://github.com/sogaiu">@sogaiu</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/145">#145</a>: <code>fs/modified-since</code> works only with ms precision but should support the precision of the filesystem</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Fix <code>cherry.embed</code> which is used by malli</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Released several versions catching up with the clojure CLI</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity
happened in the past month.</p>
<details>
<summary>Click for more details</summary>  
- [CLI](https://github.com/babashka/cli): Turn Clojure functions into CLIs!  <br>  
- [process](https://github.com/babashka/process): Clojure library for shelling out / spawning sub-processes  <br>  
- [html](https://github.com/borkdude/html): Html generation library inspired by squint's html tag  <br> 
- [instaparse-bb](https://github.com/babashka/instaparse-bb): Use instaparse from babashka  <br> 
- [sql pods](https://github.com/babashka/babashka-sql-pods): babashka pods for SQL databases  <br> 
- [rewrite-edn](https://github.com/borkdude/rewrite-edn): Utility lib on top of  <br> 
- [rewrite-clj](https://github.com/clj-commons/rewrite-clj): Rewrite Clojure code and edn  <br> 
- [pod-babashka-go-sqlite3](https://github.com/babashka/pod-babashka-go-sqlite3): A babashka pod for interacting with sqlite3  <br> 
- [tools-deps-native](https://github.com/babashka/tools-deps-native) and [tools.bbuild](https://github.com/babashka/tools.bbuild): use tools.deps directly from babashka  <br> 
- [http-server](https://github.com/babashka/http-server): serve static assets  <br> 
- [bbin](https://github.com/babashka/bbin): Install any Babashka script or project with one comman  <br> 
- [qualify-methods](https://github.com/borkdude/qualify-methods)  <br> 
  - Initial release of experimental tool to rewrite instance calls to use fully
    qualified methods (Clojure 1.12 only0  <br> 
- [neil](https://github.com/babashka/neil): A CLI to add common aliases and features to deps.edn-based projects.  <br> 
- [tools](https://github.com/borkdude/tools): a set of [bbin](https://github.com/babashka/bbin/) installable scripts  <br> 
- [sci.nrepl](https://github.com/babashka/sci.nrepl): nREPL server for SCI projects that run in the browser  <br> 
- [babashka.json](https://github.com/babashka/json): babashka JSON library/adapter  <br> 
- [squint-macros](https://github.com/squint-cljs/squint-macros): a couple of
  macros that stand-in for 
  [applied-science/js-interop](https://github.com/applied-science/js-interop)
  and [promesa](https://github.com/funcool/promesa) to make CLJS projects
  compatible with squint and/or cherry.  <br> 
- [grasp](https://github.com/borkdude/grasp): Grep Clojure code using clojure.spec regexes  <br> 
- [lein-clj-kondo](https://github.com/clj-kondo/lein-clj-kondo): a leiningen plugin for clj-kondo  <br> 
- [http-kit](https://github.com/http-kit/http-kit): Simple, high-performance event-driven HTTP client+server for Clojure.  <br> 
- [babashka.nrepl](https://github.com/babashka/babashka.nrepl): The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs  <br> 
- [jet](https://github.com/borkdude/jet): CLI to transform between JSON, EDN, YAML and Transit using Clojure  <br> 
- [pod-babashka-fswatcher](https://github.com/babashka/pod-babashka-fswatcher): babashka filewatcher pod  <br> 
- [lein2deps](https://github.com/borkdude/lein2deps): leiningen to deps.edn converter  <br> 
- [cljs-showcase](https://github.com/borkdude/cljs-showcase): Showcase CLJS libs using SCI  <br> 
- [babashka.book](https://github.com/babashka/book): Babashka manual  <br> 
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure).  <br> 
- [gh-release-artifact](https://github.com/borkdude/gh-release-artifact): Upload artifacts to Github releases idempotently  <br> 
- [carve](https://github.com/borkdude/carve) - Remove unused Clojure vars  <br> 
- [4ever-clojure](https://github.com/oxalorg/4ever-clojure) - Pure CLJS version of 4clojure, meant to run forever!  <br> 
- [pod-babashka-lanterna](https://github.com/babashka/pod-babashka-lanterna): Interact with clojure-lanterna from babashka  <br> 
- [joyride](https://github.com/BetterThanTomorrow/joyride): VSCode CLJS scripting and REPL (via [SCI](https://github.com/babashka/sci))  <br> 
- [clj2el](https://borkdude.github.io/clj2el/): transpile Clojure to elisp  <br> 
- [deflet](https://github.com/borkdude/deflet): make let-expressions REPL-friendly! <br>  
- [deps.add-lib](https://github.com/borkdude/deps.add-lib): Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI  <br> 
</details>  <br>  
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p>2025 Annual Funding Report 3. Published July 5, 2025.</p>
<p>Hello friends! Here&rsquo;s the May-June 2025 for my Clojurists Together work!. I&rsquo;ve been focusing on CIDER during these two months, so all updates are related to it:</p>
<ul>
<li>New <a href="https://github.com/clojure-emacs/orchard/pull/342">hexdump inspector view</a> for displaying byte arrays.</li>
<li>New <a href="https://github.com/clojure-emacs/orchard/pull/350">diff inspector view</a> for inspecting differences in nested data structures.</li>
<li>Small inspector improvements (<a href="https://github.com/clojure-emacs/orchard/pull/349">map sorting</a>, <a href="https://github.com/clojure-emacs/orchard/pull/348">display class flags</a>)</li>
<li><a href="https://github.com/clojure-emacs/cider-nrepl/pull/943">Reduced the instrumentation footprint</a> of CIDER debugger, which allows debugging larger functions.</li>
<li>Reworked approach to enabling <a href="https://github.com/clojure-emacs/cider-nrepl/pull/941">3rd-party pretty-printers</a>.</li>
<li>Completed the <a href="https://github.com/clojure-emacs/cider/pull/3816">transition</a> from <code>enrich-classpath</code> to <code>cider-download-java-sources</code> for accessing 3rd-party Java sources.</li>
<li>All changes are already in the rolling CIDER version, the stable version will be released shortly.</li>
<li>Auxiliary releases: cider-nrepl 0.55.7 -&gt; <a href="https://github.com/clojure-emacs/cider-nrepl/blob/master/CHANGELOG.md#0570-2025-06-29">0.57.0</a>, Orchard 0.34.3 -&gt; <a href="https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0360-2025-06-29">0.36.0</a>.  <br></li>
</ul>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>2025 Annual Funding Report 3. Published July 1, 2025.</p>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<p>Hello from sunny Berlin! 👋 🐝 🫶</p>
<h3 id="recent-work">Recent work</h3>
<h3 id="introducing-trove">Introducing Trove</h3>
<p>First up, a new micro library! It&rsquo;s called <a href="https://www.taoensso.com/trove">Trove</a>, and it&rsquo;s basically a modern minimal (~100 loc) <a href="https://github.com/clojure/tools.logging">tools.logging</a> that adds support for ClojureScript, structured logging and filtering.</p>
<h4 id="whos-this-for">Who&rsquo;s this for?</h4>
<p>Mostly <strong>library authors</strong> that want to do library-level logging without forcing a particular logging library on their users.</p>
<p>Authors <em>could</em> use tools.logging, but that doesn&rsquo;t support ClojureScript, structured logging, or the kind of data-oriented filtering possible with structured logging.</p>
<h4 id="motivation">Motivation</h4>
<p>With <a href="https://www.taoensso.com/telemere">Telemere</a> now stable, I wanted to start updating libraries like <a href="https://www.taoensso.com/sente">Sente</a> and <a href="https://www.taoensso.com/carmine">Carmine</a> to support structured logging.</p>
<p>Trove basically allows me to do this without forcing anyone to update if they&rsquo;d rather stick with <a href="https://www.taoensso.com/timbre">Timbre</a> or use an alternative like <a href="https://github.com/BrunoBonacci/mulog">μ/log</a>.</p>
<h4 id="why-structured-logging">Why structured logging?</h4>
<p>Traditional logging is <strong>string oriented</strong>. Program state is captured at the logging callsite, then generally <strong>formatted into a message string</strong> or serialized into something like EDN/JSON before hitting the rest of the logging pipeline (filters → middleware → handlers).</p>
<p>Structured logging is <strong>data oriented</strong>. Program state is captured at the logging callsite, then retained <em>as-is</em> through the rest of the logging pipeline (filters → middleware → handlers).</p>
<p>The data-oriented approach means that:</p>
<ul>
<li>No expensive formatting or serialization are needed.</li>
<li>Exact data types and (nested) data structures are losslessly retained throughout the logging pipeline.</li>
</ul>
<p>The latter matters! It means that it&rsquo;s easy and cheap to build a rich pipeline that can do data-oriented filtering, analytics, aggregations, transformations, and final handling (e.g. your DB or log aggregator might itself support rich types).</p>
<p><strong>Clojure loves plain data</strong> and offers a rich set of data types, structures, and tools. Structured logging takes advantage of this. It&rsquo;s essentially the extension of the data-first principle to the way we instrument our programs.</p>
<h3 id="a-big-sente-update">A big Sente update</h3>
<p><a href="https://www.taoensso.com/sente">Sente</a> has a major new pre-release <a href="https://github.com/taoensso/sente/releases/tag/v1.21.0-beta1">out</a>.</p>
<p>There&rsquo;s a lot of significant improvements in here. Some highlights include:</p>
<ul>
<li>Added support for upcoming <strong>high-speed binary serialization</strong></li>
<li>Added support for <strong>compression</strong></li>
<li>A <strong>smaller dependency</strong></li>
<li>Improved <strong>reliability</strong> under heavy load</li>
<li>Pluggable <strong>logging</strong> (via <a href="https://www.taoensso.com/trove">Trove</a>)</li>
<li>Many other small fixes and improvements</li>
</ul>
<h3 id="tufte-v3-final">Tufte v3 final</h3>
<p><a href="https://www.taoensso.com/tufte">Tufte</a>&rsquo;s official v3 release is <a href="https://github.com/taoensso/tufte/releases/tag/v3.0.0">out</a>.</p>
<p>There&rsquo;s many big improvements, including many new features shared with <a href="https://www.taoensso.com/telemere">Telemere</a>, and new handlers for Telemere and Trove.</p>
<h3 id="other-stuff">Other stuff</h3>
<p>Other misc releases include:</p>
<ul>
<li><a href="https://github.com/taoensso/nippy/releases/tag/v3.6.0">Nippy v3.6.0</a></li>
<li><a href="https://github.com/taoensso/telemere/releases/tag/v1.0.1">Telemere v1.0.1</a></li>
<li><a href="https://github.com/taoensso/timbre/releases/tag/v6.7.1">Timbre v6.7.1</a></li>
</ul>
<h3 id="upcoming-work">Upcoming work</h3>
<p>Next couple months I expect to focus on:</p>
<ul>
<li>Getting <a href="https://www.taoensso.com/sente">Sente</a> v1.21 final released, ideally with an official binary serialization mode</li>
<li>Getting <a href="https://www.taoensso.com/tempel">Tempel</a> v1 final released (sorry about the delays!)</li>
<li>Getting <a href="https://www.taoensso.com/http-kit">http-kit</a> updated (lots of cool stuff pending there)</li>
</ul>
<p>Cheers everyone! :-)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for Proposals. June 2025 Member Survey</title>
      <link>https://www.clojuriststogether.org/news/call-for-proposals.-june-2025-member-survey/</link>
      <pubDate>Mon, 07 Jul 2025 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-proposals.-june-2025-member-survey/</guid>
      <description>We are awarding up to $35K for Q3 2025 Projects</description>
      <content:encoded><![CDATA[<p>Greetings folks!</p>
<p>Clojurists Together is pleased to announce that we are opening our Q3 2025 funding round for Clojure Open Source Projects.  Applications will be accepted through the 23rd of July 2025 (midnight Pacific Time). We are looking forward to reviewing your proposals! <a href="https://clojuriststogether.org/open-source/">More information and the application can be found here.</a></p>
<p>We will be awarding up to $35,000 USD for up to 6-7 projects. The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established. Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed. We expect projects to start between August 15 and September 1, 2025.</p>
<p>A BIG THANKS to all our members for your continued support. And we want to encourage you to reach out to your colleagues and companies to join Clojurists Together so that we can fund even more great projects throughout the year.</p>
<p>We surveyed our members again in June to find out what types of initiatives they would like us to focus on for this round of funding. Their responses are summarized below. In particular, it was great to see members' feedback relating to how often they used or referred to developers' work we have funded. Also noted that several of you plan to attend Clojure/Conj, or made your way to SciNoj Light and ReClojure.   <br></p>
<hr>
<h2 id="june-2025-member-survey">June 2025 Member Survey</h2>
<p><img src="https://github.com/user-attachments/assets/b7fbd671-c3eb-470e-a61d-ae86fef7fdb9" alt="Usage Chart 2"></p>
<p><img src="https://github.com/user-attachments/assets/b3eb624e-5dfc-4376-ba9c-7b8bd31727c7" alt="Platforms Used Chart 1"></p>
<p><img src="https://github.com/user-attachments/assets/7b82c856-fa12-47bf-a0cf-2f2b02099f8e" alt="Imprvements Clojure Chart 3"></p>
<p><img src="https://github.com/user-attachments/assets/9a59ce80-faee-4cc0-8197-7fa0c331e984" alt="Improvements ClojurScript Chart 4"></p>
<h3 id="the-biggest-challenge">The Biggest Challenge</h3>
<p>If you were only to name ONE, what is the biggest challenge facing Clojure developers today and how can Clojurists Together support you or your organization in addressing those challenges?</p>
<h4 id="acceptance-in-the-industry">Acceptance in the industry.</h4>
<ul>
<li>Clojure is still a niche language. It is difficult to justify its use.</li>
<li>It&rsquo;s still about getting people to take the language(s) seriously in a world that wants everything to be in Python, Java and TypeScript - at least that&rsquo;s how I see the situation.</li>
<li>I think the biggest challenge is helping Clojure grow and become accessible and well-known in various domains where it is still considered a niche.</li>
<li>Friction in developer experience</li>
<li>Marketing clojure, there are a lot of success stories that fly under the radar.</li>
<li>There is so much interesting stuff happening but it is siloed within the Clojure community.</li>
<li>Obscurity. Celebrating and highlighting use of Clojure in the wild.</li>
<li>Most LLMs tend to replace Clojure with languages they know better.</li>
</ul>
<h4 id="new-users">New Users.</h4>
<ul>
<li>Ease of Adoption, Easy installation and set-up for beginners.</li>
<li>Getting new people in the community. Specially younger people, and not just male people.</li>
</ul>
<h4 id="relevance-of-clojure-in-age-of-ai">Relevance of clojure in age of AI.</h4>
<ul>
<li>Perceived ability for AI to write code is creating skepticism of the value of notation optimized for humans (e.g., Clojure)</li>
<li>I personally feel behind the curve with all things AI. I&rsquo;d love to see more tools/docs/videos that demonstrate how to use/build with AI technologies.</li>
<li>Make the stack traces easier for AI agents.</li>
</ul>
<h4 id="other-feedback">Other feedback.</h4>
<ul>
<li>Stable income, Clojurists Together does great work supporting the community</li>
<li>Mobile (iOS/iPadOS) development</li>
<li>I think we really need a sane, blessed, rails-for-clojure starting point.</li>
<li>It&rsquo;s not a huge problem, but the dominance of reagent (react classes) does make for some challenges in plugging in to the hook-y broader ecosystem. I don&rsquo;t think I&rsquo;ve seen a reagent replacement that has the same refreshingly simple primitives, and I just can&rsquo;t imagine leaving re-frame, ever.</li>
<li>Fund someone who makes a minimalistic visualization library? oz has been unmaintained for years.</li>
<li>We as a company are quite conscious of the fact that many of the libraries that we use are entirely the work of one person, and we fear that this puts them at risk of falling out of maintenance.  I know this is true for a lot of open source software generally, but I think this is a particularly severe risk for the Clojure ecosystem.</li>
<li>I think it would be great if we could encourage maintainers to put in place a plan of succession, and to publish this in the project README files.  <br></li>
</ul>
<hr>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h3>
<h4 id="building-the-clojure-brand-to-drive-adoption">Building the Clojure &ldquo;Brand&rdquo; to Drive Adoption</h4>
<ul>
<li>I would like a stronger &ldquo;brand&rdquo; for Clojure that can make it easier to successfully advocate for Clojure(script) in organizations. Technical merits haven&rsquo;t seemed to matter to the leadership of orgs I&rsquo;ve worked in, and shiny marketing seems to be the deciding factor.</li>
<li>More companies adopting it.</li>
<li>Public success story on Clojure AI, ML, DataSciene</li>
<li>I would like to see Clojure making some in-roads into breaking out of it&rsquo;s mainstream perception as being an esoteric language, because it really is not at this point.</li>
<li>At the risk of sounding like broken record, we&rsquo;d love to see an outreach program that is backed by a good strategy and some measurable outcomes.</li>
<li>I&rsquo;d like the awesome happy-path for Clojure to be common knowledge and well agreed on.
A new/exciting host (jank) with a lot of fresh takes on long standing (Jvm) clojure issues
We need careful community building to initiate collaborations and support systems that will help the growth of open source projects in new domains. A lot of our recent and upcoming efforts at Scicloj have been around that.</li>
</ul>
<h4 id="building-the-community-by-engaging-new-users">Building the Community by Engaging New Users</h4>
<ul>
<li>More beginner-friendly local communities<br>
_ Work on reaching new audiences would be great</li>
<li>More newcomers, and be friendlier to more standard approaches as it is inevitable that newcomers will try to approach the language with the experience of mainstream languages</li>
<li>Education outreach</li>
</ul>
<h4 id="more-feedback">More Feedback</h4>
<ul>
<li>Tooling support for AI agents<br>
&ldquo;Portability is a large, and still growing, potential strong suit of Clojure: especially with the appearance of ClojureDart and Jank-on-the-horizon. I would like ClojureDart to reach language-feature parity, even with the features its crew disdains like multimethod hierarchies. I would like &ldquo;&ldquo;cljc&rdquo;&rdquo; &amp; clj/cljs/cljd compatibility to be encouraged in potentially-portable projects.</li>
<li>If Clojure&rsquo;s Leiningen days were like having a cohesive culture of 4 TV channels chosen by a simple knob, Clojure CLI is like 8,192 channels of cable that most people can&rsquo;t enjoy because they can&rsquo;t work the remote. In place of &ldquo;&ldquo;lein test&rdquo;&rdquo;, &ldquo;&ldquo;lein repl&rdquo;&rdquo;, &ldquo;&ldquo;lein package&rdquo;&rdquo;, there is no standardization. Even Maven provides well-known affordances (package, test, etc). I would like Lein-and-Maven&rsquo;s ease-of-use brought to Clojure CLI without compromising Clojure CLI&rsquo;s direct-from-Git library acquisition, etc., etc.</li>
<li>ClojureScript core better supported.</li>
<li>I hope we learn how to take advantage of LLM-based technologies in a way that leverages the unique aspects of the language and the REPL-driven workflow. We shouldn’t find ourselves worrying about being left behind by more popular languages and tools. Who knows, maybe we have some unique advantages that could be realised through a different approach to LLM-assisted development.  <br></li>
</ul>
<hr>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported--in-order-of-mentions">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?  (In order of mentions):</h3>
<p>3: CIDER,SciCloj<br>
2: CALVA, Cherry, Clojure-lsp, ClojureScript, Jank, Malli, Neathderthal, noj, reagent, replicant, Shadow-cljs<br>
1: Babashka, Burpless,  Clay, Clojars,  clojure-mcp, ClojureDart, Compujure,  Datelevin,  Emacs, flow storm, http-kit, humble UI, info-cojure, js-interop, KIndly, metosin, pathom, Portal, promesar, eframe, Ring, spy, Tableplot, Fastmath  <br></p>
<hr>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<p>Many comments regarding marketing, new users, and AI are reported in sections above. The comments listed below are in addition to these themes.</p>
<ul>
<li>I’d say everything that falls under the umbrella of developer experience - documentation, user-friendly tooling that minimises friction, and a comprehensive, centralised community  source of information about the ecosystem.  The last one probably needs some clarification. It would be great to have a bird’s-eye view of the ecosystem as it currently stands and where it’s heading, or ought to go. As a new user of Clojure, or as someone exploring a different area within the ecosystem, I’d like to understand which libraries or frameworks are available to meet the various needs I encounter. I want to know the current state of these libraries or frameworks - their pros and cons, key or distinguishing features, any major counterarguments against using them etc. Additionally, I’d like insight into what’s missing in the ecosystem in that particular area. Essentially, an “are we there yet?” perspective ideally with a vision and a roadmap how to get there.</li>
<li>We continue to worry about ClojureScript&rsquo;s dependence on the Google Closure Compiler, as this is reaching end-of-life.  It would be nice if there were a vision for the future of ClojureScript.</li>
<li>IDE support right now, with some people still working to get the old light table workflow restored (which is not a full notebook, but close - you see it in zed, but also in liquidz/Elin and in clojure sublimed), and other people exploring how to add AI assistants.</li>
<li>How to better leverage Java and JavaScript / TypeScript when there is no native Clojure / Clojurescript way to do the thing that you want to do and you don&rsquo;t have time/energy/knowledge to implement your own, but there is an Interop option.</li>
<li>Errors and clean common build tooling for AI agents.</li>
<li>Clojure.spec, virtual thread support for core.async</li>
<li>LSP and AI tooling ecosystem</li>
<li>The CLJS compiler is slow, cumbersome and doesn&rsquo;t play well with modern JS (ESM). Cherry is very exciting. <br></li>
</ul>
<hr>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong?</h3>
<ul>
<li>COMMUNITY</li>
<li>Initiatives like this</li>
<li>Internal culture, excellent engineering practices</li>
<li>Web stack  (Metosin libs)</li>
<li>Everything else :D REPL, structural editing, editor support, strong tooling, functional programming, data-oriented etc.</li>
<li>The language itself is awesome. REPL-driven development is great.</li>
<li>It is simply the best way to build.</li>
<li>Backwards compatibility, stability of the language, the developer community.
continuity of the libraries and base.</li>
<li>Conferences</li>
<li>Continuous commitment to backwards compatibility, keeping the core library small and well considered.</li>
<li>A big part of web development; working with data given the language and its view of the world, but also some aspects of data science are starting to get interesting; innovation and experimentation</li>
<li>Mostly various component of full-stack web development</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>June 2025 Short-Term Project Updates Q2 2025 Projects</title>
      <link>https://www.clojuriststogether.org/news/june-2025-short-term-project-updates-q2-2025-projects/</link>
      <pubDate>Sat, 28 Jun 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/june-2025-short-term-project-updates-q2-2025-projects/</guid>
      <description>News from CALVA, CIDER, Jank, SciCloj Bridge to New Users</description>
      <content:encoded><![CDATA[<p>This is the June project update for four of our Q2 2025 Funded Projects. (Reports for the other two are on a different schedule). A brief summary of each project is included to provide overall context.</p>
<p><a href="#calva-brandon-ringe">Brandon Ringe: CALVA</a><br>
A new REPL output view for Calva, which is a webview in VS Code. The webview will allow us to add more rich features to the output webview, while also providing better performance.</p>
<p><a href="#cider-bozhidar-batsov">Bozhidar Batsov: CIDER</a><br>
Provide continued support for CIDER, nREPL and the related libraries (e.g. Orchard, cidernrepl, etc) and improve them in various ways.</p>
<p><a href="#jank-jeaye-wilkerson">Jeaye Wilkerson: Jank</a>  <br>
Build jank&rsquo;s seamless C++ interop system.</p>
<p><a href="#scicloj-building-bridges-to-new-clojure-users-siyoung-byun">Siyoung Byun: SciCloj Building Bridges to New Clojure Users</a>
Scicloj aims to improve the accessibility of Clojure for individuals working with data, regardless of their programming backgrounds. The project aims to develop standardized templates to encourage greater consistency across the documentation of existing Scicloj ecosystem libraries, making those libraries more robust and user-friendly.  <br></p>
<h2 id="calva-brandon-ringe">CALVA: Brandon Ringe</h2>
<p>Q2 2025 $9K. Report 2. Published June 16, 2025.</p>
<p>Since the last project update, several improvements have been made to Calva&rsquo;s new <a href="https://calva.io/output-view/">output view</a>.</p>
<p>One of those improvements is a significant performance boost with high frequency output, such as logging to stdout hundreds or thousands of times within a minute. I realized that replicant (and rendering libraries like it), which is an awesome library, is not well-suited for this kind of use case. So I switched to using the DOM API directly, which is much faster and more efficient for this purpose.</p>
<p>Here&rsquo;s a list of the changes to the output view since the last project update:</p>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2825">Whitespace is not preserved in non-code output in output view</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2824">Add padding to bottom of output view</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2837">Strip ANSI encoding in output view</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2839">Label evaluated code in output view so it&rsquo;s easy to differentiate it from results</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2847">Some output from stderr and/or stdout is being broken up in the output view</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2846">Extra newline is printed before error output in output view</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2852">Performance of output view degrades as content grows</a> (This is the change mentioned above, which removes replicant and uses the DOM API directly for rendering.)</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2836">Add copy button to code snippets in output view</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/2858">Some output is not printed on a newline as expected in the output view</a> <br></li>
</ul>
<hr>
<h2 id="cider-bozhidar-batsov">CIDER: Bozhidar Batsov</h2>
<p>Q2 2025 $9K.  Report 2. Published June 17, 2025.<br>
The last month was another strong one for CIDER and friends, which featured many releases across the different tools and libraries. Below are some of the highlights:</p>
<ul>
<li><a href="https://github.com/clojure-emacs/inf-clojure/releases/tag/v3.3.0">inf-clojure 3.3</a>
<ul>
<li>This was the first inf-clojure release in 3 years</li>
<li>It adds support for <code>clojure-ts-mode</code> and also features some fixes and small improvements</li>
</ul>
</li>
<li><a href="https://github.com/clojure-emacs/clojure-mode/blob/master/CHANGELOG.md#5200-2025-05-27">clojure-mode 5.20</a>
<ul>
<li>Adds <code>clojuredart-mode</code> and <code>jank-mode</code> for better support of ClojureDart and Jank</li>
<li>Also features a couple of small fixes</li>
</ul>
</li>
<li><a href="https://github.com/clojure-emacs/clojure-ts-mode/releases/tag/v0.5.0">clojure-ts-mode 0.5</a> was the biggest news in the past month for several reasons
<ul>
<li>It uses an experimental version of the Clojure Tree-sitter grammar that allows us to deal better with Clojure metadata</li>
<li>It features support for font-locking embedded JavaScript code in ClojureScript (and C++ code in Jank)</li>
<li>Introduces the <code>clojure-ts-extra-def-forms</code> customization option to specify  additional <code>defn</code>-like forms that should be treated as definitions (as it&rsquo;s hard to reliably infer those)</li>
<li>It features some simple built-in completion powered by Tree-sitter
<ul>
<li>I blogged about the concept <a href="https://emacsredux.com/blog/2025/06/03/tree-sitter-powered-code-completion/">here</a></li>
</ul>
</li>
</ul>
</li>
<li>CIDER also saw some work, but no new release. You can expect in the next release:
<ul>
<li>better support for <code>clojure-ts-mode</code></li>
<li>more improvements to the Inspector</li>
<li>user manual (documentation) improvements</li>
</ul>
</li>
</ul>
<p>On top of this, I&rsquo;ve been reviewing the data from CIDER&rsquo;s survey, improving the CI setups of various projects, providing user support and working on some ideas about restructuring the documentation of CIDER and nREPL to be more approachable. The process for streamlining (slimming down) CIDER, cider-nrepl and orchard is ongoing as well. (e.g. we&rsquo;ve stopped bundling print engines with cider-nrepl and now those have to be supplied by the users)</p>
<p><code>clojure-ts-mode</code> is shaping up really nicely and has mostly matched the features of <code>clojure-mode</code>. On top of this it does a few things better than <code>clojure-mode</code>, so I&rsquo;m optimistic that we&rsquo;ll mark it as ready for general usage before the end of the year. We&rsquo;ve expanded the <a href="https://github.com/clojure-emacs/clojure-ts-mode/blob/main/doc/design.md">design docs</a> recently and I think they can be useful both to potential contributors and to other people looking to create Tree-sitter based major modes. I&rsquo;m also working in the background on a couple of article for best practices when working with Tree-sitter in Emacs.</p>
<p>Thanks to Clojurists Together for their continued support of my OSS work! You rock!  <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q2 2025 $9K. Report 2. Published June 17, 2025.</p>
<h3 id="thank-you">Thank you!</h3>
<p>Hi folks! Thanks so much for the sponsorship this quarter. Clojurists Together is my largest form of income this year, which makes this even more special.</p>
<h3 id="seamless-interop">Seamless interop</h3>
<p>In the past month, I&rsquo;ve implemented:</p>
<ul>
<li>Many, many tests for the new interop functionality</li>
<li>Calling global C++ functions</li>
<li>Calling C++ member functions</li>
<li>Accessing C++ member variables</li>
<li>C++ reference semantics, including automatic referencing and dereferencing</li>
<li>Dozens of C++ operators</li>
</ul>
<p>You can find all of the details in my latest blog post, <a href="https://jank-lang.org/blog/2025-06-06-next-phase-of-interop/">here</a>.</p>
<h3 id="next-up">Next up</h3>
<p>In the final month of this quarter, I aim to expand the test suite, fix the
remaining known bugs, add manual memory management support, better template
support, full destructor support, and finally the portability fixes necessary to
make all of this work on both macOS and Linux.  <br></p>
<hr>
<h2 id="scicloj-building-bridges-to-new-clojure-users-siyoung-byun">SciCloj Building Bridges to New Clojure Users: Siyoung Byun</h2>
<p>Q2 2025 $2K. Report 1. Published June 25, 2025.</p>
<h3 id="work-completed-in-progress-and-further-plans">Work Completed, In Progress and Further Plans</h3>
<h3 id="cfd-python-into-clojure-project">CFD Python into Clojure Project</h3>
<p>I initiated the <a href="https://github.com/scicloj/cfd-python-in-clojure">CFD Python into Clojure</a>
project, which translates computational fluid dynamics (CFD) learning steps from Python
into Clojure. The project also includes a currently evolving <a href="https://scicloj.github.io/cfd-python-in-clojure">notebook page</a> that shows the learning steps progressed so far for the project.<br>
This project showcases interactive, real-world scientific computing examples
with an initiative to diversify the set of data science use cases available in Clojure.</p>
<p>I am working toward completing and polishing the project as a featured example of Clojure&rsquo;s
capability in handling scientific computing and numerical simulation use cases. I am planning to discuss the results and experiences at a future SciCloj Light Conference.</p>
<h3 id="conference-presentation-at-scicloj-light-1">Conference Presentation at SciCloj Light #1</h3>
<p>I presented <a href="https://scicloj.github.io/scinoj-light-1/sessions.html#d-viscous-fluid-flow-data-analysis-using-burgers-equation">a talk</a> at <a href="https://scicloj.github.io/scinoj-light-1/">SciCloj Light #1</a>,
highlighting the progress (implementing one-dimensional CFD using Burgers' equation), simulations, and future directions from the CFD Python into Clojure initiative.
The talk demonstrated how Clojure can serve as a powerful tool in data science and data analysis.</p>
<h3 id="conference-reflections-and-scicloj-community-video">Conference Reflections and Scicloj Community Video</h3>
<p>I co-authored and released <a href="https://youtu.be/n6ICeRyXHsI?si=tzq_ZKzuRqux6nKQ">a video</a>
summarizing the SciCloj Light #1 conference experience, along with publishing
a written conference survey to gather feedback and reflect on future SciCloj Light conferences with <a href="https://github.com/daslu">Daniel Slutsky</a>.
The video discusses the preparation process, key takeaways, and future directions
for Scicloj as a community-driven initiative and as an individual contributor.</p>
<h3 id="community-outreach-initiative-for-broader-participation">Community Outreach Initiative for Broader Participation</h3>
<p>I initiated and participated in a community discussion on <a href="https://scicloj.github.io/docs/community/chat/">Clojurian Zulip</a>
to encourage Scicloj contributors and users to present at external data science conferences
and share their experiences using Clojure and Scicloj libraries for their data science work.
This outreach aims to amplify Clojure&rsquo;s visibility in broader scientific and data communities  to obtain more attention and bring newcomers to the community.</p>
<h3 id="documentation-improvements-for-noj">Documentation Improvements for Noj</h3>
<p>I joined as one of the maintainers of <a href="https://github.com/scicloj/noj">Noj</a>, an out-of-the-box  Clojure library designed to simplify data science workflows.
Currently, I&rsquo;ve been focusing on improving the library&rsquo;s introductory documentation, setup guides, and <a href="https://scicloj.github.io/noj/">use cases in notebooks</a> to make it more welcoming and useful to newcomers.<br>
There are already good use cases, ideas, and documentation in the library, so my main goal is to make those resources more coherent, consistent, and organized to be easily searchable.
Once we have well-tailored documentation in place for Noj, we hope to roll out
the same documentation template for the rest of the Scicloj libraries.</p>
<h4 id="library-documentation-review-and-feedback-collection">Library Documentation Review and Feedback Collection</h4>
<p>I am actively gathering feedback on gaps and pain points in the documentation of various
Scicloj libraries through the <a href="https://scicloj.github.io/docs/community/chat/">Clojurian Zulip</a> channel.</p>
<h4 id="improving-getting-started-experiences">Improving &ldquo;Getting Started&rdquo; Experiences</h4>
<p>I am continuing to improve the beginner documentation and setup processes across Scicloj libraries, with a goal of creating a smoother onboarding experience for users with diverse backgrounds.</p>
<h3 id="organizing-macroexpand-gatherings">Organizing &lsquo;macroexpand&rsquo; Gatherings</h3>
<p>I will co-organize a series of regular online community meetups called <a href="https://scicloj.github.io/docs/community/groups/macroexpand/">macroexpand gatherings</a>.
These are aimed at welcoming both new and existing Clojure users and will foster communication across communities working on professional data projects (data engineering, analysis, visualization, etc.)
and identify shared challenges and opportunities for collaboration.
By hosting a space to discuss the current status of the community/individuals and challenges together, we hope to prioritize our todos and initiatives better and create actionable items to move forward.  <br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>May 2025 Short-Term Project Updates Q2 2025 Projects</title>
      <link>https://www.clojuriststogether.org/news/may-2025-short-term-project-updates-q2-2025-projects/</link>
      <pubDate>Wed, 04 Jun 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/may-2025-short-term-project-updates-q2-2025-projects/</guid>
      <description>News from Bling, CALVA, CIDER, Jank</description>
      <content:encoded><![CDATA[<p>This is the April/May project update for four of our Q2 2025 Funded Projects. (Reports for the other two are on a different schedule). A brief summary of each project is included to provide overall context.</p>
<p><a href="#bling-jeremiah-coyle">Jeremiah Coyle: Bling</a><br>
Add support for using hiccup to style and format messages, a template string syntax to style and format messages, and 1-3 additional formatting templates for callouts, headers, and points-of-interest.</p>
<p><a href="#brandon-ringe-calva">Brandon Ringe: CALVA</a><br>
A new REPL output view for Calva, which is a webview in VS Code. The webview will allow us to add more rich features to the output webview, while also providing better performance.</p>
<p><a href="#bozhidar-batsov-cider">Bozhidar Batsov: CIDER</a><br>
Provide continued support for CIDER, nREPL and the related libraries (e.g. Orchard, cidernrepl, etc) and improve them in various ways.</p>
<p><a href="#jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</a>  <br>
Build jank&rsquo;s seamless C++ interop system.<br>
<br></p>
<h2 id="bling-jeremiah-coyle">Bling: Jeremiah Coyle</h2>
<p>Q2 2025 $2k. Report No. 1, Published 1 June 2025</p>
<br>
Upon commencing Q2 work on Bling, I reordered the list of priorities set forth in the initial project description.  
<br>
Updated TO DO list:  
<ul>
<li>
<p>Primary goals for Q2</p>
<ul>
<li>Respect <code>NO_COLOR</code> env var</li>
<li>Opt-in optimization for <a href="https://github.com/paintparty/bling?tab=readme-ov-file#enhanced-contrast">enhanced contrast</a> in light or dark terminals.</li>
<li>Enable <a href="https://github.com/paintparty/bling?tab=readme-ov-file#high-fidelity-printing">Hi-Fidelity, themeable, colorized, structural printing of values via Fireworks</a>.</li>
<li>Utilize <code>callout</code> to create a <a href="https://github.com/paintparty/bling?tab=readme-ov-file#usage-with-malli">specialized template for Malli validation errors</a>.</li>
<li><a href="https://github.com/paintparty/bling?tab=readme-ov-file#figlet-banners">Figlet banners</a>
with <a href="https://github.com/busyloop/lolcat" target="_blank">lolcat-style</a> gradient coloring.</li>
</ul>
</li>
<li>
<p>Secondary goals for Q2</p>
<ul>
<li>Add enhanced support for using hiccup to style and format messages</li>
<li>Create 1-3 additional formatting templates for callouts, headers, and points-of-interest.</li>
<li>Add documentation about how to leverage Bling to create great-looking warnings and errors in your own projects.</li>
</ul>
</li>
</ul>
<br>
All the primary goals listed above are realized in [`v0.8.0`](https://clojars.org/io.github.paintparty/bling/versions/0.8.0).
<br>
<p>Some highlights&hellip;<br>
<br></p>
<h3>Figlet banners:</h3>
<a href="https://github.com/paintparty/bling?tab=readme-ov-file#figlet-banners">Docs here</a>
<p align="center">
  <img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/bling-banner-fonts_dark-0.7.0.png"
       width="600px" />
</p>
<h3>Specialized template for Malli validation errors</h3>
<p>This is experimental, with more work to be done on optimizing for disjunctions and cases with multiple errors on same value.</p>
<p><a href="https://github.com/paintparty/bling?tab=readme-ov-file#usage-with-malli">Docs here</a></p>
<p>Bling offers <code>bling.explain/explain-malli</code> to present <a href="https://github.com/metosin/malli">Malli</a> validation errors:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[bling.explain <span style="color:#e6db74">:refer</span> [explain-malli]])

(<span style="color:#66d9ef">def </span>Address
  [<span style="color:#e6db74">:map</span>
   [<span style="color:#e6db74">:id</span> string?]
   [<span style="color:#e6db74">:tags</span> [<span style="color:#e6db74">:set</span> keyword?]]
   [<span style="color:#e6db74">:address</span>
    [<span style="color:#e6db74">:map</span>
     [<span style="color:#e6db74">:street</span> string?]
     [<span style="color:#e6db74">:city</span> string?]
     [<span style="color:#e6db74">:zip</span> int?]
     [<span style="color:#e6db74">:lonlat</span> [<span style="color:#e6db74">:tuple</span> double? double?]]]]])

(<span style="color:#a6e22e">explain-malli</span>
 Address
 {<span style="color:#e6db74">:id</span> <span style="color:#e6db74">&#34;Lillan&#34;</span>,
  <span style="color:#e6db74">:tags</span> <span style="color:#f92672">#</span>{<span style="color:#e6db74">:coffee</span> <span style="color:#e6db74">:artesan</span> <span style="color:#e6db74">:garden</span>},
  <span style="color:#e6db74">:address</span>
  {<span style="color:#e6db74">:street</span> <span style="color:#e6db74">&#34;Ahlmanintie 29&#34;</span>, <span style="color:#e6db74">:zip</span> <span style="color:#ae81ff">33100</span>, <span style="color:#e6db74">:lonlat</span> [<span style="color:#ae81ff">61.4858322</span> <span style="color:#ae81ff">87.34</span>]}})
</code></pre></div><br>
<p>The above code would print the following:</p>
<div align="center"><img src="https://github.com/paintparty/bling/blob/main/resources/docs/chromed/malli-explain-missing-key_dark-0.7.0.png" width="600px"/></div>
<p>You can also pass an option trailing options map to customize the appearance of the printed output. In the example below, we are leaving out the display of the schema within the callout block:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-Clojure" data-lang="Clojure">(<span style="color:#a6e22e">explain-malli</span>
 Address
 {<span style="color:#e6db74">:id</span> <span style="color:#e6db74">&#34;Lillan&#34;</span>,
  <span style="color:#e6db74">:tags</span> <span style="color:#f92672">#</span>{<span style="color:#e6db74">&#34;coffee&#34;</span> <span style="color:#e6db74">:artesan</span> <span style="color:#e6db74">:garden</span>},
  <span style="color:#e6db74">:address</span>
  {<span style="color:#e6db74">:city</span> <span style="color:#e6db74">&#34;Tempare&#34;</span> <span style="color:#e6db74">:street</span> <span style="color:#e6db74">&#34;Ahlmanintie 29&#34;</span>, <span style="color:#e6db74">:zip</span> <span style="color:#ae81ff">33100</span>, <span style="color:#e6db74">:lonlat</span> [<span style="color:#ae81ff">61.4858322</span> <span style="color:#ae81ff">87.34</span>]}}
 {<span style="color:#e6db74">:display-schema?</span> false})
</code></pre></div><br>
<p>The above code would print the following:</p>
<div align="center"><img src="https://github.com/paintparty/bling/blob/main/resources/docs/chromed/malli-explain-bad-set-value-with-no-schema_dark-0.7.0.png" width="600px"/></div>
<h3>High Fidelity Printing</h3>
<p><a href="https://github.com/paintparty/bling?tab=readme-ov-file#high-fidelity-printing">Docs here</a></p>
<p>Bling offers <code>bling.hifi</code> for colorized pretty-printing of Clojure, Java, and JavaScript data structures.
<code>bling.hifi/hifi</code> will return an ansi-sgr decorated string, while <code>bling.hifi/print-hifi</code> will print such a string.</p>
<p>Under the hood, the formatting/colorizing is achieved with <a href="https://github.com/paintparty/fireworks" target="_blank">Fireworks</a>.</p>
<p>By default, the theme of this output will be <code>Universal Neutral</code>.</p>
<p>If you <a href="https://github.com/paintparty/bling?tab=readme-ov-file#enhanced-contrast">set a valid <code>BLING_MOOD</code> env var</a>, the theme of the <code>hifi</code> output will be <code>Alabaster Light</code> or <code>Alabaster Dark</code>.</p>
<p>You can choose <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#theming" target="_blank">one of the other available themes</a> by following the instructions in the Fireworks readme and <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#step-3" target="_blank">setting up a <code>config.edn</code> on your system</a>, with a corresponding <code>BLING_CONFIG</code> env var. This config will also let you control many other aspects of the formatting with the <code>hifi</code> output.</p>
<br>
<div align="center"><sub><b><i>Alabaster Dark&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</i></b></sub></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/themes/dark/Alabaster-Dark.png" width="534px"/></div>
<div align="center"><sub><b><i>Alabaster Light&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</i></b></sub></div>
<div align="center"><img src="https://github.com/paintparty/bling/raw/main/resources/docs/chromed/themes/light/Alabaster-Light.png" width="534px"/></div>
<p>Check out <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#theming" target="_blank">the other available themes here</a></p>
<br>
<h3>Enhanced contrast</h3>
<p>You can set a <code>BLING_MOOD</code> env var to enhance the contrast of bling-formatted printings.</p>
<p>Docs <a href="https://github.com/paintparty/bling?tab=readme-ov-file#enhanced-contrast">here</a>.
<br></p>
<hr>
<h2 id="brandon-ringe-calva">Brandon Ringe: CALVA</h2>
<p>Q2 2025 $9K. Report 1, Published 13 May 2025.</p>
<p>The new REPL output view was released! It&rsquo;s an opt-in feature for now and is not currently the default REPL output destination. It&rsquo;s currently in a very MVP state. I&rsquo;ll be fixing bugs and adding features in the coming weeks.</p>
<p>This output view is web-based (a VS Code webview), and is implemented entirely in ClojureScript. We use <a href="https://github.com/cjohansen/replicant">replicant</a> for the UI.</p>
<p>There&rsquo;s <a href="https://github.com/orgs/BetterThanTomorrow/projects/3/views/1">project board on GitHub</a> that I&rsquo;ve been using to track my work on this. I wanted the issues to be draft issues until the first version was released. I&rsquo;ll be converting all of them to issues soon.</p>
<p>Here are a few issues I intend to tackle in the coming weeks:</p>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2825">Whitespace is not preserved in stdout in output view</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2826">Allow writing to output view even if it&rsquo;s hidden</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/2827">Persist contents of output view between closing and reopening</a></li>
</ul>
<p>Documentation:</p>
<ul>
<li><a href="http://calva.io/output-view/">The Output View</a></li>
<li><a href="https://calva.io/output/#output-destinations-feature-comparison">Output Destinations Feature Comparison</a></li>
</ul>
<p>Thanks to Thomas Heller for helping us (some time ago) explore ways of integrating ClojureScript and TypeScript in Calva. Thanks to Christian Johansen for replicant.  <br></p>
<hr>
<h2 id="bozhidar-batsov-cider">Bozhidar Batsov: CIDER</h2>
<p>Q2 2025 $9K. Report 1, Published 16 May 2025.</p>
<p>The last month extremely fruitful for CIDER and friends and resulted in many notable releases and improvements. Below are some of the highlights:</p>
<ul>
<li><a href="https://github.com/clojure-emacs/clojure-ts-mode/blob/main/CHANGELOG.md#030-2025-04-15">clojure-ts-mode 0.3</a>
<ul>
<li>lots of improvements to the font-locking and indentation logic</li>
<li>indentation rules are now consistent with cljfmt</li>
</ul>
</li>
<li><a href="https://github.com/clojure-emacs/clojure-ts-mode/blob/main/CHANGELOG.md#030-2025-05-15">clojure-ts-mode 0.4</a>
<ul>
<li>regular expressions are font-locked with a Tree-sitter grammar</li>
<li>adds support for aligning forms</li>
<li>implements many of the refactoring commands from <code>clojure-mode</code></li>
</ul>
</li>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.18.0">CIDER 1.18</a>
<ul>
<li>I also wrote a <a href="https://metaredux.com/posts/2025/04/30/cider-1-18.html">blog post</a> about it</li>
</ul>
</li>
<li><a href="https://github.com/clojure-emacs/refactor-nrepl/blob/master/CHANGELOG.md#3110">refactor-nrepl 3.11.0</a>
<ul>
<li>Before this update the project was broken on Clojure 1.12</li>
<li>clj-refactor.el was also updated to use the latest version of the middleware</li>
</ul>
</li>
</ul>
<p>The were also several releases of cider-nrepl and orchard, related to CIDER 1.18.
Work on CIDER 1.19 is already underway, and I&rsquo;m also happy to report that <code>clojure-ts-mode</code>
is now in a pretty good shape for general use.  <br></p>
<hr>
<h2 id="jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</h2>
<p>Q2 2025 $9K. Report 1, Published 7 May 2025.</p>
<h3 id="thank-you">Thank you!</h3>
<p>To start with, thank you, Clojurists Together, for the sponsorship this quarter.
This is the largest income I have this year, so far, so it really makes a
difference.</p>
<h3 id="seamless-c-interop">Seamless C++ interop</h3>
<p>This quarter, I&rsquo;m focusing on seamless interop with C++ from jank. Doing this
from a lisp is unprecedented. One month in, I have implemented the following.</p>
<ol>
<li>JIT compiling arbitrary C++ code</li>
<li>Reaching into C++ values</li>
<li>Constructing stack-allocated C++ values</li>
<li>Overload resolution</li>
<li>Implicit conversions from jank objects into native types and vice versa</li>
<li>Explicit casts</li>
</ol>
<p>You can read about all of these in detail on the jank blog
<a href="https://jank-lang.org/blog/2025-05-02-starting-seamless-interop/">here</a>.</p>
<h3 id="next-month">Next month</h3>
<p>We&rsquo;re one month into the quarter and I&rsquo;m pleased with the progress so far.
However, there&rsquo;s a lot remaining work to do. I still need to tackle free/static
function calls, member access, member function calls, operators, dynamic
allocations, complex type support, and automatic destructors for locals with the
same guarantees C++ provides. On top of that, I need to make sure we can process
C++ headers in a portable way. This will definitely keep me busy for the quarter!
Stay tuned for my next update in a month.  <br></p>
<hr>
]]></content:encoded>
    </item>
    
    <item>
      <title>Annually-Funded Developers&#39; Update: Mar./April 2025</title>
      <link>https://www.clojuriststogether.org/news/annually-funded-developers-update-mar./april-2025/</link>
      <pubDate>Mon, 12 May 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/annually-funded-developers-update-mar./april-2025/</guid>
      <description>Dragan Duric, Eric Dallo, Michiel Borkent, Oleksandr Yakushev, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Hello Fellow Clojurists!
This is the second report from the 5 developers receiving Annual Funding in 2025.</p>
<p><a href="#dragan-duric">Dragan Duric</a>: Apple M Engine Neanderthal<br>
<a href="#eric-dallo">Eric Dallo</a>: metrepl, lsp-intellij, repl-intellij. lsp, lsp4clj<br>
<a href="#michiel-borkent">Michiel Borkent</a>: clj-kondo, squint, babashka, fs, SCI, and more&hellip;<br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>: CIDER, Compliment, JDK24<br>
<a href="#peter-taoussanis">Peter Taoussanis</a>: Telemere, Tufte, Truss</p>
<h2 id="dragan-duric">Dragan Duric</h2>
<p>2025 Annual Funding Report 2. Published May 5, 2025.</p>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpus) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>In March and April, I implemented the JNI bindings for 5 Apple Accelerate libraries (blas_new, lapack_new, Sparse, BNNS, BNNS Graph, vDSP, vForce and vImage) and implemented almost all functionality of Neaanderthal&rsquo;s Apple M engine based on Accelerate. It will soon be ready for proper release (currently waiting some bugfixes, polishing, and a javacpp-presets release to be available in Maven Central).</p>
<p>In more detail:</p>
<p>Here&rsquo;s what I&rsquo;ve proposed when applying for the CT grant.<br>
I proposed to <em>Implement an Apple M engine for Neanderthal.</em> This involves:</p>
<ul>
<li>buying an Apple M2/3 Mac (the cheapest M3 in Serbia is almost 3000 USD (with VAT).</li>
<li>learning enough macOS tools (Xcode was terrible back in the days) to be able to do anything.</li>
<li>exploring JavaCPP support for ARM and macOS.</li>
<li>exploring relevant libraries (OpenBLAS may even work through JavaCPP).</li>
<li>exploring Apple Accelerate.</li>
<li>learning enough JavaCPP tooling to be able to see whether it is realistic that I build Accelerate wrapper (and if I can&rsquo;t, at least to know how much I don&rsquo;t know).</li>
<li>I forgot even little C/C++ that I did know back in the day. This may also give me some headaches, as I&rsquo;ll have to quickly pick up whatever is needed.</li>
<li>writing articles about relevant topics so Clojurians can pick this functionality as it arrives.</li>
</ul>
<p>Projects directly involved:<br>
<a href="https://github.com/uncomplicate/neanderthal">https://github.com/uncomplicate/neanderthal</a><br>
<a href="https://github.com/uncomplicate/deep-diamond">https://github.com/uncomplicate/deep-diamond</a><br>
<a href="https://github.com/uncomplicate/clojure-cpp">https://github.com/uncomplicate/clojure-cpp</a></p>
<p>As I implemented and OpenBLAS-based engine in January-February, in March-April I tackled the main objective: Apple Accelerate bindings. As Apple&rsquo;s documentation is not stellar, and there are multiple tools and languages involved, it was a slow and tedious work consisting of lots of experimentation and discovery. Even boring, I would say. But, slowly and steadily I discovered how relevant JavaCPP generators work, I unearthed Accelerate C++ intricacies, fought with them one by one, and slowly I managed to create the proper Java bindings! Along the way I even contributed some fixes and updates to JavaCPP itself! YAY! This is available as a new project under Uncomplicate umbrella at <a href="https://github.com/uncomplicate/apple-presets">https://github.com/uncomplicate/apple-presets</a></p>
<p>Next, I returned to the pleasant part of work - programming in Clojure - and almost completed the dedicated Neanderthal engine that utilizes Apple Accelerate for BLAS, LAPACK, as well as Math functions and random generators on M Macs. This covers the core and linalg namespace, that was already supported by the alternative OpenBLAS engine (implemented in Jan-Feb) AND Math and RNG engines. I didn&rsquo;t manage to iron out all the bugs so it could be ready for release, but this will certainly be ready in May-June. I also didn&rsquo;t manage to tackle Sparse matrices, but as I managed to create Accelerate bindings for all types, including Sparse, I expect this to not be a problem and be completed during this funding round.</p>
<p>Looking at the funding proposal, I can say that I&rsquo;m very satisfied that all the features that I promised to build are progressing even better than expected, so that will leave some time to try to do some of the features
that I said I hope to be able to support, namely to explore Deep Diamond Tensor support on Apple M (via BNNS and/or BNNS Graph) and GPU support via Metal.</p>
<p>I even got some ideas for additional projects based on native Apple functionality related to machine learning and audio/video, but lets not getting too much ahead.</p>
<p>All in all, I feel optimistic about how this project progresses!  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>2025 Annual Funding Report 2. Published April 30, 2025.</p>
<p>In these 2 last months I could work on multiple projects and even focus on a new exciting project called <a href="https://github.com/ericdallo/metrepl">metrepl</a>, a nREPL middleware to help extract metrics about your REPL, really helpful when you have multiple coworkers working in multiple projects and you want to collect information about performance, time spent in REPL features and others!
Besides that, I worked hard on keep improving the IntelliJ experience using the 2 OSS plugins of LSP + REPL, and of cource improving clojure-lsp the base of all major editors now.</p>
<h3 id="metreplhttpsgithubcomericdallometrepl"><a href="https://github.com/ericdallo/metrepl">metrepl</a></h3>
<h4 id="--031">- 0.3.1</h4>
<ul>
<li>Improve export exception handler</li>
<li>Remove jvm started flaky metric</li>
<li>Fix <code>event/op-completed</code> metric to measure time correctly</li>
<li>Add <code>event/test-executed</code> event.</li>
<li>Add <code>event/test-passed</code>, <code>event/test-errored</code> and <code>event/test-failed</code> events.</li>
<li>Add <code>session-time-ms</code> to <code>close</code> op.</li>
<li>Add <code>:project-path</code> to metrics.</li>
<li>Add compatibility with older Clojure versions</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<h4 id="20250307-174236---20250423-181646">2025.03.07-17.42.36 - 2025.04.23-18.16.46</h4>
<ul>
<li>General
<ul>
<li>Bump clj-kondo to <code>2025.02.20</code>.</li>
<li>Add support for OpenTelemetry(otlp) log, enabled if configured. #1963</li>
<li>Bump rewrite-clj to <code>0bb572a03c0025c01f9c36bfca2815254683fbde</code>. #1984</li>
<li>Bump clj-kondo to <code>2025.02.21-20250314.135629-7</code>.</li>
<li>Add support for ignoring tests references for the <code>clojure-lsp/unused-public-var</code> linter. #1878</li>
<li>Add <code>:test-locations-regex</code> configuration to allow customizing test file detection for the <code>unused-public-var</code> linter&rsquo;s <code>:ignore-test-references?</code> and test code lenses. #1878</li>
<li>Improve and standardize all logs for better troubleshooting and metrics collection.</li>
<li>Fix <code>unused-public-var</code> false positives when <code>:ignore-test-references? true</code>.</li>
<li>Bump clj-kondo to <code>2025.04.07</code>.</li>
</ul>
</li>
<li>Editor
<ul>
<li>Improve paredit slurp and barf corner cases. #1973 #1976</li>
<li>Add Semantic Tokens support for the Clojure Reader Dispatch macro <code>#_</code> (ignore next form). #1965</li>
<li>Fix regression on previous version on snippets completion. #1978</li>
<li>Add <code>forward</code>, <code>forward-select</code>, <code>backward</code> and <code>backward-select</code> paredit actions.</li>
<li>Show add require code action for invalid syntax codes like <code>my-alias/</code>. #1957</li>
<li>Improve startup performance for huge projects avoiding publish empty diagnostics for every file of the project unnecessarily.</li>
<li>Improve timbre context log.</li>
<li>Fix suggestion for add require code action. #2017</li>
<li>Improve find definition so it works on <code>declare</code> forms too. #1986</li>
</ul>
</li>
</ul>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h4 id="311---340">3.1.1 - 3.4.0</h4>
<ul>
<li>Remove <code>:</code> lexer check since this is delegated to clojure-lsp/clj-kondo already.</li>
<li>Fix comment form complain about missing paren.</li>
<li>Improve server installation fixing concurrency bugs + using lsp4ij install API.</li>
<li>Bump clj4intellij to 0.7.1</li>
<li>Support Namespaces on search everywhere (Shift + shift). #64</li>
<li>Add support for <code>forward</code>, <code>backward</code>, <code>forward-select</code>, <code>backward-select</code> paredit actions. #72</li>
<li>Fix go to declaration or usages. #70</li>
</ul>
<h3 id="clojure-repl-intellijhttpsgithubcomafucherclojure-repl-intellij"><a href="https://github.com/afucher/clojure-repl-intellij">clojure-repl-intellij</a></h3>
<p>Together with the help of <a href="https://github.com/afucher">@afucher</a>, we improved so much the IntelliJ REPL experience, fixing multiple issues and adding multiple features, the experience now is pretty close to other REPL experiences in other editors!</p>
<h4 id="230---252">2.3.0 - 2.5.2</h4>
<ul>
<li>Update repl window ns after switching ns.</li>
<li>Fix exception on settings page.</li>
<li>Fix special form evaluations. #135</li>
<li>Add support for JVM args on local REPL configuration. #124</li>
<li>Send to REPL eval results. #92</li>
<li>Fix repl input when evaluated the same input of last eval.</li>
<li>Fix history navigation via shortcut not working after 2.0.0.</li>
<li>Enhance REPL evaluations. #108
<ul>
<li>Isolate ns from REPL windows and file editors</li>
<li>Evaluate ns form from file automatically to avoid namespace-not-found errors.</li>
</ul>
</li>
<li>Fix REPL window horizontal scrollbar not working.</li>
<li>Fix REPL window broken after making any change to its layout. #144</li>
<li>Disable &ldquo;clear REPL&rdquo; action when REPL is not connected. #126</li>
<li>Bump clj4intellij to 0.8.0</li>
<li>Configure project with IntelliJ integration tests (headless)</li>
</ul>
<h3 id="lsp4cljhttpsgithubcomclojure-lsplsp4clj"><a href="https://github.com/clojure-lsp/lsp4clj">lsp4clj</a></h3>
<h4 id="1120---1130">1.12.0 - 1.13.0</h4>
<ul>
<li>Add <code>textDocument/selectionRange</code> LSP feature coercers.</li>
<li>Add inlay-hint LSP feature coercers.</li>
</ul>
<h3 id="clj4intellijhttpsgithubcomericdalloclj4intellij"><a href="https://github.com/ericdallo/clj4intellij">clj4intellij</a></h3>
<h4 id="070---080">0.7.0 - 0.8.0</h4>
<ul>
<li>Create <code>def-extension</code> to create plugin.xml extension points easily and more idiomatic.</li>
<li>Fix clojure-lsp hook</li>
<li>Drop support of older IntelliJ versions (2021/2022). Now requires minimum IntelliJ 2023.3 (Build 233)</li>
<li>Bump JAVA min version to 17</li>
<li>Add support for tests. <br></li>
</ul>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>2025 Annual Funding Report 2. Published May 2, 2025.</p>
<p>In this post I&rsquo;ll give updates about open source I worked on during March and April 2025.</p>
<p>To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work
possible. Without you the below projects would not be as mature or wouldn&rsquo;t
exist or be maintained at all! So a sincere thank you to everyone who
contributes to the sustainability of these projects.</p>
<img alt="gratitude" src="https://emoji.slack-edge.com/T03RZGPFR/gratitude/f8716bb6fb7e5249.png" width="50px" text-align="center">
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br">Nubank</a></li>
</ul>
<p>Open the details section for more info about sponsoring.</p>
<details>
<summary>Sponsor info</summary>
<p>If you want to ensure that the projects I work on are sustainably maintained,
you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>On to the projects that I&rsquo;ve been working on!</p>
</details>
<!--

sources: https://github.com/borkdude
local ~/dev and ~/dev/babashka dir (since github doesn't show all repos)

babashka sub dir checken
-->
<h3 id="blog-posts">Blog posts</h3>
<p>I blogged about an important improvement in babashka regarding type hints
<a href="https://blog.michielborkent.nl/babashka-java-reflection-type-hints.html">here</a>.</p>
<h3 id="interviews">Interviews</h3>
<p>Also I did an interview with Jiri from Clojure Corner by Flexiana, viewable <a href="https://www.youtube.com/watch?v=H7ZlwEDxzRs">here</a>.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/H7ZlwEDxzRs?si=HQuZFsQXloxGkF9B" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<h3 id="updates">Updates</h3>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months.</p>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Improve Java reflection based on provided type hints (read blog post <a href="https://blog.michielborkent.nl/babashka-java-reflection-type-hints.html">here</a>)</li>
<li>Add compatibility with the <a href="https://github.com/potetm/fusebox">fusebox</a> library</li>
<li>Fix virtual <code>ThreadBuilder</code> interop</li>
<li>Add <code>java.util.concurrent.ThreadLocalRandom</code></li>
<li>Add <code>java.util.concurrent.locks.ReentrantLock</code></li>
<li>Add classes:
<ul>
<li><code>java.time.chrono.ChronoLocalDate</code></li>
<li><code>java.time.temporal.TemporalUnit</code></li>
<li><code>java.time.chrono.ChronoLocalDateTime</code></li>
<li><code>java.time.chrono.ChronoZonedDateTime</code></li>
<li><code>java.time.chrono.Chronology</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka/issues/1806">#1806</a>: Add <code>cheshire.factory</code> namespace (<a href="https://github.com/lread">@lread</a>)</li>
<li>Bump GraalVM to <code>24</code></li>
<li>Bump SCI to <code>0.9.45</code></li>
<li>Bump edamame to <code>1.4.28</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1801">#1801</a>: Add <code>java.util.regex.PatternSyntaxException</code></li>
<li>Bump core.async to <code>1.8.735</code></li>
<li>Bump cheshire to <code>6.0.0</code></li>
<li>Bump babashka.cli to <code>0.8.65</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>Replace tools.analyzer with a more light-weight analyzer which also adds support for Clojure 1.12</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/653">#653</a>: respect <code>:context expr</code> in <code>compile-string</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/657">#657</a>: respect <code>:context expr</code> in <code>set!</code> expression</li>
<li><a href="https://github.com/squint-cljs/squint/issues/659">#659</a>: fix invalid code produced for REPL mode with respect to <code>return</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/651">#651</a> Support <code>:require</code> + <code>:rename</code> + allow renamed value to be used in other :require clause</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/649">#649</a>: reset ns when compiling file and fix initial global object</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/647">#647</a>: emit explicit <code>null</code> when written in else branch of <code>if</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/640">#640</a>: don&rsquo;t emit anonymous function if it is a statement (<a href="https://github.com/jonasseglare">@jonasseglare</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/643">#643</a>: Support lexicographic compare of arrays (<a href="https://github.com/jonasseglare">@jonasseglare</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/602">#602</a>: support hiccup-style shorthand for id and class attributes in <code>#jsx</code> and <code>#html</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/635">#635</a>: <code>range</code> fixes</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/636">#636</a>: add <code>run!</code></li>
<li><code>defclass</code>: elide constructor when not provided</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/603">#603</a>: don&rsquo;t emit multiple returns</li>
<li>Drop constructor requirement for <code>defclass</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.<br></p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2522">#2522</a>: support <code>:config-in-ns</code> on <code>:missing-protocol-method</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2524">#2524</a>: support <code>:redundant-ignore</code> on <code>:missing-protocol-method</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1292">#1292</a>: NEW linter: <code>:missing-protocol-method</code>. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2512">#2512</a>: support vars ending with <code>.</code>, e.g. <code>py.</code> according to clojure analyzer</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2516">#2516</a>: add new <code>--repro</code> flag to ignore home configuration</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2493">#2493</a>: reduce image size of native image</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2496">#2496</a>: Malformed <code>deftype</code> form results in <code>NPE</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2499">#2499</a>: Fix <code>(alias)</code> bug (<a href="https://github.com/Noahtheduke">@Noahtheduke</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2492">#2492</a>: Report unsupported escape characters in strings</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2502">#2502</a>: add end locations to invalid symbol</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2511">#2511</a>: fix multiple parse errors caused by incomplete forms</li>
<li>document var-usages location info edge cases (<a href="https://github.com/sheluchin">@sheluchin</a>)</li>
<li>Upgrade to GraalVM 24</li>
<li>Bump datalog parser</li>
<li>Bump built-in cache</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting</p>
<ul>
<li>Fix <a href="https://github.com/babashka/sci/issues/957">#957</a>: <code>sci.async/eval-string+</code> should return promise with <code>:val nil</code> for ns form rather than <code>:val &lt;Promise&gt;</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/959">#959</a>: Java interop improvement: instance method invocation now leverages type hints</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/942">#942</a>: improve error location of invalid destructuring</li>
<li>Add <code>volatile?</code> to core vars</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/950">#950</a>: interop on local in CLJS</li>
<li>Bump edamame to <code>1.4.28</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</p>
<ul>
<li>Fix <a href="https://github.com/borkdude/quickdoc/issues/32">#32</a>: fix anchor links to take into account var names that differ only by case</li>
<li>Revert source link in var title and move back to <code>&lt;sub&gt;</code></li>
<li>Specify clojure 1.11 as the minimal Clojure version in <code>deps.edn</code></li>
<li>Fix macro information</li>
<li>Fix <a href="https://github.com/borkdude/quickdoc/issues/39">#39</a>: fix link when var is named multiple times in docstring</li>
<li>Upgrade clj-kondo to <code>2025.04.07</code></li>
<li>Add explicit <code>org.babashka/cli</code> dependency</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</p>
<ul>
<li><a href="https://github.com/babashka/cli/issues/119">#119</a>: <code>format-table</code> now formats multiline cells appropriately (<a href="https://github.com/lread">@lread</a>)</li>
<li>Remove <code>pom.xml</code> and <code>project.clj</code> for cljdoc</li>
<li><a href="https://github.com/babashka/cli/issues/116">#116</a>: Un-deprecate <code>:collect</code> option to support custom transformation of arguments to collections (<a href="https://github.com/lread">@lread</a>)</li>
<li>Support <code>:collect</code> in <code>:spec</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</p>
<ul>
<li><a href="https://github.com/babashka/process/issues/163">#163</a>, <a href="https://github.com/babashka/process/issues/164">#164</a>: Program resolution strategy for <code>exec</code> and Windows now matches macOS/Linux/PowerShell (<a href="https://github.com/lread">@lread</a>)</li>
<li>Fix memory leak by executing shutdown hook when process finishes earlier than VM exit (<a href="https://github.com/maxweber">@maxweber</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/html">html</a>: Html generation library inspired by squint&rsquo;s html tag</p>
<ul>
<li>Fix <a href="https://github.com/borkdude/html/issues/3">#3</a>: allow dynamic attribute value: <code>(html [:a {:a (+ 1 2 3)}])</code></li>
<li>Fix <a href="https://github.com/borkdude/html/issues/9">#9</a>: shortcuts for id and classes</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Add <code>cljs.pprint/pprint</code></li>
<li>Add <code>add-tap</code></li>
<li>Bump squint compiler common which brings in new <code>#html</code> id and class shortcuts + additional features and optimizations, such as an optimization for <code>aset</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>Add better Deno + <code>jsr:</code> dependency support, stay tuned.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a>: Use instaparse from babashka</p>
<ul>
<li>Several improvements which makes babashka compatible with <a href="https://github.com/gfredericks/test.chuck">test.chuck</a>. See <a href="https://files.mastodon.social/media_attachments/files/114/437/768/756/996/338/original/b8ebcb333f287e5c.png">this screenshot</a>!</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</p>
<ul>
<li><a href="https://github.com/borkdude/edamame/issues/117">#117</a>: throw on triple colon keyword</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li><a href="https://github.com/babashka/fs/issues/141">#141</a>: <code>fs/match</code> doesn&rsquo;t match when root dir contains glob or regex characters in path</li>
<li><a href="https://github.com/babashka/fs/issues/138">#138</a>: Fix <code>fs/update-file</code> to support paths (<a href="https://github.com/rfhayashi">@rfhayashi</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</p>
<ul>
<li>Upgrade to GraalVM 23, fixes encoding issue with Korean characters</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity
happened in the past month.</p>
<details>
<summary>Click for more details</summary>  
- [rewrite-edn](https://github.com/borkdude/rewrite-edn): Utility lib on top of  
- [deps.clj](https://github.com/borkdude/deps.clj): A faithful port of the clojure CLI bash script to Clojure  
- [scittle](https://github.com/babashka/scittle): Execute Clojure(Script) directly from browser script tags via SCI  
- [rewrite-clj](https://github.com/clj-commons/rewrite-clj): Rewrite Clojure code and edn  
- [pod-babashka-go-sqlite3](https://github.com/babashka/pod-babashka-go-sqlite3): A babashka pod for interacting with sqlite3  
- [tools-deps-native](https://github.com/babashka/tools-deps-native) and [tools.bbuild](https://github.com/babashka/tools.bbuild): use tools.deps directly from babashka  
- [http-client](https://github.com/babashka/http-client): babashka's http-client<br>  
- [http-server](https://github.com/babashka/http-server): serve static assets  
- [bbin](https://github.com/babashka/bbin): Install any Babashka script or project with one comman  
- [sci.configs](https://github.com/babashka/sci.configs): A collection of ready to be used SCI configs.
  - Added a configuration for `cljs.spec.alpha` and related namespaces  
- [qualify-methods](https://github.com/borkdude/qualify-methods)  
  - Initial release of experimental tool to rewrite instance calls to use fully
    qualified methods (Clojure 1.12 only0  
- [neil](https://github.com/babashka/neil): A CLI to add common aliases and features to deps.edn-based projects.<br>
- [tools](https://github.com/borkdude/tools): a set of [bbin](https://github.com/babashka/bbin/) installable scripts  
- [sci.nrepl](https://github.com/babashka/sci.nrepl): nREPL server for SCI projects that run in the browser  
- [babashka.json](https://github.com/babashka/json): babashka JSON library/adapter  
- [squint-macros](https://github.com/squint-cljs/squint-macros): a couple of
  macros that stand-in for  
  [applied-science/js-interop](https://github.com/applied-science/js-interop)
  and [promesa](https://github.com/funcool/promesa) to make CLJS projects
  compatible with squint and/or cherry.
- [grasp](https://github.com/borkdude/grasp): Grep Clojure code using clojure.spec regexes  
- [lein-clj-kondo](https://github.com/clj-kondo/lein-clj-kondo): a leiningen plugin for clj-kondo  
- [http-kit](https://github.com/http-kit/http-kit): Simple, high-performance event-driven HTTP client+server for Clojure.  
- [babashka.nrepl](https://github.com/babashka/babashka.nrepl): The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs  
- [jet](https://github.com/borkdude/jet): CLI to transform between JSON, EDN, YAML and Transit using Clojure  
- [pod-babashka-fswatcher](https://github.com/babashka/pod-babashka-fswatcher): babashka filewatcher pod  
- [lein2deps](https://github.com/borkdude/lein2deps): leiningen to deps.edn converter  
- [cljs-showcase](https://github.com/borkdude/cljs-showcase): Showcase CLJS libs using SCI  
- [babashka.book](https://github.com/babashka/book): Babashka manual  
- [pod-babashka-buddy](https://github.com/babashka/pod-babashka-buddy): A pod around buddy core (Cryptographic Api for Clojure).  
- [gh-release-artifact](https://github.com/borkdude/gh-release-artifact): Upload artifacts to Github releases idempotently  
- [carve](https://github.com/borkdude/carve) - Remove unused Clojure vars  
- [4ever-clojure](https://github.com/oxalorg/4ever-clojure) - Pure CLJS version of 4clojure, meant to run forever!  
- [pod-babashka-lanterna](https://github.com/babashka/pod-babashka-lanterna): Interact with clojure-lanterna from babashka  
- [joyride](https://github.com/BetterThanTomorrow/joyride): VSCode CLJS scripting and REPL (via [SCI](https://github.com/babashka/sci))  
- [clj2el](https://borkdude.github.io/clj2el/): transpile Clojure to elisp  
- [deflet](https://github.com/borkdude/deflet): make let-expressions REPL-friendly!  
- [deps.add-lib](https://github.com/borkdude/deps.add-lib): Clojure 1.12's add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI  
</details>  
 <br>
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p>2025 Annual Funding Report 2. Published May 5, 2025.</p>
<p>Hello friends! Here&rsquo;s an update on my <strong>March-April 2025 Clojurists Together</strong> work.</p>
<h3 id="cider">CIDER</h3>
<ul>
<li>We just published a huge CIDER <a href="https://clojurians.slack.com/archives/C015AL9QYH1/p1746007257709719"><strong>1.18</strong></a> release that I spent two months working on. It is packed with features to the brim! See the full list of changes in the announcement.</li>
<li>150 commits and 64 PRs accross 6 repositories.</li>
<li>Auxiliary releases: cider-nrepl 0.52.1 -&gt; <a href="https://github.com/clojure-emacs/cider-nrepl/blob/master/CHANGELOG.md#0557-2025-04-29">0.55.7</a>, Orchard 0.30.1 -&gt; <a href="https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0343-2025-04-28">0.34.3</a>.</li>
</ul>
<h3 id="compliment">Compliment</h3>
<ul>
<li>New release: <a href="https://github.com/alexander-yakushev/compliment/blob/master/CHANGELOG.md#070-2025-03-25">0.7.0</a>.</li>
<li>New feature: priority-based candidate sorting.</li>
</ul>
<h3 id="maintenance">Maintenance</h3>
<ul>
<li>Started testing all of the projects I maintain again JDK24.</li>
<li>Added support for JDK24 in Virgil (<a href="https://github.com/clj-commons/virgil/blob/master/CHANGELOG.md#040-2025-03-27">0.4.0</a>)  <br></li>
</ul>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>2025 Annual Funding Report 2. Published April 30, 2025.</p>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<p>Hi folks! 👋👋<br>
Hope everyone&rsquo;s well, and those in Europe enjoying the first glimpses of actual ☀️ in a while :-)</p>
<h3 id="recent-work">Recent work</h3>
<h3 id="telemere-structured-logs-and-telemetry-for-cljs">Telemere: structured logs and telemetry for Clj/s</h3>
<p><a href="https://www.taoensso.com/telemere">Telemere</a> <strong>v1 stable</strong> is now officially and finally <a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0">available</a>! 🍾🥳🎉</p>
<p>It was a lot of work to get here, but I&rsquo;m happy with the results - and I&rsquo;m very grateful for all the folks that have been patiently testing early releases and giving feedback 🙏</p>
<p>If you haven&rsquo;t yet had an opportunity to check out Telemere, now&rsquo;s a pretty good time.</p>
<p>It&rsquo;s basically a modern rewrite of <a href="https://www.taoensso.com/timbre">Timbre</a> that handles both <strong>structured and unstructured logging</strong> for Clojure and ClojureScript applications. It&rsquo;s small, fast, and <em>very</em> flexible.</p>
<p>I&rsquo;ll of course continue to support Timbre, but Telemere offers a lot of advantages, and <a href="https://github.com/taoensso/telemere/wiki/5-Migrating#from-timbre">migration</a> is often pretty straight-forward.</p>
<p>There&rsquo;s a couple video intros:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=lOaZ0SgPVu4">Lightning tour</a> (7 mins)</li>
<li><a href="https://youtu.be/-L9irDG8ysM?si=nu9qTubt6BE_7h7e">Full intro</a>  (24 mins)</li>
</ul>
<p>Telemere also has the most extensive <a href="https://github.com/taoensso/telemere/wiki/1-Getting-started">docs</a> I&rsquo;ve written for a library, including both:</p>
<ul>
<li>Lots of beginner-oriented stuff, and</li>
<li>Advanced info for folks that might like to <a href="https://github.com/taoensso/telemere/wiki/4-Handlers#writing-handlers">write custom handlers</a>, <a href="https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#*xfn*">transforms</a>, or <a href="https://github.com/taoensso/telemere/wiki/8-Community#handlers-and-tools">other tools</a>.</li>
</ul>
<h3 id="tufte-performance-monitoring-for-cljs">Tufte: performance monitoring for Clj/s</h3>
<p><a href="https://www.taoensso.com/tufte">Tufte</a> <strong>v3 RC1</strong> is now also <a href="https://github.com/taoensso/tufte/releases/tag/v3.0.0-RC1">available</a>.</p>
<p>Tufte&rsquo;s been around for ages but recently underwent a <strong>major overhaul</strong> focused on improving usability, and interop with Telemere.</p>
<p>The two now share a <strong>common core</strong> for filtering and handling. This means that they get to share relevant concepts, terminology, capabilities, and config APIs.</p>
<p>The shared core also means wider testing, easier ongoing maintenance, and the opportunity for improvements to further cross-pollinate in future.</p>
<p>Performance has also been significantly improved, and the documentation greatly expanded. There&rsquo;s too much new stuff to mention here, but as usual please see the <a href="https://github.com/taoensso/tufte/releases/tag/v3.0.0-RC1">release notes</a> for details.</p>
<h3 id="other-stuff">Other stuff</h3>
<p>Several other releases worth mentioning:</p>
<ul>
<li><a href="https://www.taoensso.com/truss">Truss</a> <a href="https://github.com/taoensso/truss/releases/tag/v2.1.0">v2.1.0</a> - micro toolkit for Clojure/Script errors</li>
<li><a href="https://www.taoensso.com/http-kit">http-kit</a> <a href="https://github.com/http-kit/http-kit/releases/tag/v2.9.0-beta1">v2.9.0-beta1</a> - high performance HTTP client+server for Clojure</li>
<li><a href="https://www.taoensso.com/timbre">Timbre</a> <a href="https://github.com/taoensso/timbre/releases/tag/v6.7.0">v6.7.0</a> - pure Clojure/Script logging library</li>
<li><a href="https://www.taoensso.com/nippy">Nippy</a> <a href="https://github.com/taoensso/nippy/releases/tag/v3.5.0">v3.5.0</a> - fast serialization for Clojure</li>
</ul>
<p>I&rsquo;ll note that Telemere, Tufte, and Truss are now intended to form a sort of <strong>suite of complementary observability tools</strong> for modern Clojure and ClojureScript systems:</p>
<ul>
<li><a href="https://www.taoensso.com/telemere">Telemere</a> for logging, tracing, and general telemetry</li>
<li><a href="https://www.taoensso.com/tufte">Tufte</a> for performance monitoring</li>
<li><a href="https://www.taoensso.com/truss">Truss</a> for assertions and error handling</li>
</ul>
<p>Together the 3x offer what I hope is quite a pleasant (and unique) observability story for Clojure/Script developers.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>Next couple months I expect to focus on:</p>
<ul>
<li>Getting <a href="https://www.taoensso.com/tempel">Tempel</a> v1 stable out (data security framework for Clojure)</li>
<li>Significant work on <a href="https://www.taoensso.com/sente">Sente</a> (realtime web comms for Clojure/Script)</li>
</ul>
<p>After that, still need to decide. Might be additional stuff for Telemere, or gearing up for the first public release of <a href="https://www.taoensso.com/carmine">Carmine</a> v4 (Redis client + message queue for Clojure).</p>
<p>Cheers everyone! :-)  <br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2025 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q2-2025-funding-announcement/</link>
      <pubDate>Sun, 20 Apr 2025 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2025-funding-announcement/</guid>
      <description>We are funding 6 projects for a total of $33K USD in Q2 2025.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce that  we will be funding 6 projects in Q2 2025 for a total of $33K USD (3 for $9K and 3 shorter or more experimental projects for $2K).  Thanks to all our members for making this happen! Congratulations to the 6 developers below:</p>
<p><strong>$9K Projects</strong><br>
<a href="#bozhidar-batsov-cider">Bozhidar Batsov: CIDER</a><br>
<a href="#brandon-ringe-calva">Brandon Ringe: CALVA</a><br>
<a href="#jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</a></p>
<p><strong>$2K Projects</strong><br>
<a href="#jeremiah-coyle-bling">Jeremiah Coyle: Bling</a><br>
<a href="#karl-pietrzak-code-combat">Karl Pietrzak: CodeCombat</a><br>
<a href="#siyoung-byun-scicloj---building-bridges-to-new-clojure-users">Siyoung Byun: Scicloj - Building Bridges to New Clojure Users</a></p>
<h2 id="bozhidar-batsov-cider">Bozhidar Batsov: CIDER</h2>
<p>Provide continued support for CIDER, nREPL and the related libraries (e.g. Orchard, cidernrepl, etc) and improve them in various ways.</p>
<p>Some ideas that I have in my mind:</p>
<ul>
<li>Improve support for alternative Clojure runtimes</li>
<li>Simplify some of CIDER&rsquo;s internals (e.g. jack-in, session management)</li>
<li>Improve CIDER&rsquo;s documentation (potentially record a few up-to-date video tutorials as well)</li>
<li>Improve clojure-ts-mode and continue the work towards it replacing clojure-mode</li>
<li>Add support for clojure-ts-mode in inf-clojure</li>
<li>Continue to move logic outside of cider-nrepl</li>
<li>Improvement to the nREPL specification and documentation; potentially built some test suite for nREPL specification compatibility</li>
<li>Various improvements to the nREPL protocol</li>
<li>Stabilize Orchard and cider-nrepl enough to do a 1.0 release for both projects</li>
<li>Build a roadmap for CIDER 2.0</li>
<li>Write up an analysis of the State of Clojure 2024 survey results (connected to the roadmap item)</li>
</ul>
<h2 id="brandon-ringe-calva">Brandon Ringe: CALVA</h2>
<p>I&rsquo;ll be working on a new REPL output view for Calva, which is a webview in VS Code. The current default REPL output view utilizes an editor and somewhat emulates a terminal prompt. The performance of the editor view degrades when there&rsquo;s a high volume of output and/or when there are large data structures printed in it. The webview will allow us to add more rich features to the output webview, while also providing better performance.</p>
<p>I&rsquo;ve started this work, the and I&rsquo;ll use the funding of Clojurists Together to get the work over the finish line and release an initial, opt-in version of the REPL output webview. I&rsquo;ll also be adding tests, responding to user feedback about the feature, fixing bugs, and adding features to it.</p>
<p>This is the first feature of Calva that integrates with VS Code&rsquo;s API directly from ClojureScript. This is partly an experiment to see if writing more of Calva in ClojureScript is a good idea; I suspect that it is.</p>
<h2 id="jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</h2>
<p>In Q1 2025, I built out jank&rsquo;s error reporting to stand completely in a category of its own, within the lisp world. We have macro expansion stack tracing, source info preserved across expansions so we can point at specific forms in a syntax quote, and even clever solutions for deducing source info for non-meta objects like numbers and keywords. All of this is coupled with gorgeous terminal reporting with syntax highlighting, underlining, and box formatting.</p>
<p>In Q2, I plan to aim even higher. I&rsquo;m going to build jank&rsquo;s seamless C++ interop system. We had native/raw, previously, for embedding C++ strings right inside of jank code. This worked alright, but it was tied to jank having C++ codegen. Now that we have LLVM IR codegen, embedding C++ is less practical. Beyond that, though, we want to do better. Here&rsquo;s a snippet of what I have designed for jank this quarter.<br>
; Feed some C++ into Clang so we can start working on it.<br>
; Including files can also be done in a similar way.<br>
; This is very similar to native/raw, but is only used for declarations.<br>
; It cannot <em>run</em> code.<br>
(c++/declare &ldquo;struct person{ std::string name; };&quot;)<br>
; <code>let</code> is a Clojure construct, but <code>c++/person.</code> creates a value<br>
; of the <code>person</code> struct we just defined above, in automatic memory (i.e. no heap allocation).
(let [s (c++/person. &ldquo;sally siu&rdquo;)<br>
; We can then access structs using Clojure&rsquo;s normal interop syntax. n (.-name s)<br>
; We can call member functions on native values, too.<br>
; Here we call std::string::size on the name member.<br>
l (.size n)]<br>
; When we try to gives these native values to <code>println</code>, jank will<br>
; detect that they need boxing and will automatically find a<br>
; conversion function from their native type to jank&rsquo;s boxed<br>
; <code>object_ptr</code> type. If such a function doesn&rsquo;t exist, the<br>
; jank compiler fails with a type error.<br>
(println n l))</p>
<p><img src="https://github.com/user-attachments/assets/e7b554c8-fb8d-40c8-a75b-af9cf7e60055" alt="image"></p>
<p>In truth, this is basically the same exact syntax that Clojure has for Java interop, except for the c++ namespace to disambiguate. Since I want jank to work with other langs in the future, I think it makes sense to spell out the lang. Later, we may have a swift or rust namespace which works similarly. But let&rsquo;s talk about this code.</p>
<p>This interop would be unprecedented. Sure, Clojure JVM does it, but we&rsquo;re talking about the native world. We&rsquo;re talking about C++. Ruby, Python, Lua, etc. can all reach into C. The C ABI is the lingua franca of the native world. But here, we&rsquo;re reaching into C++ from a dynamic lang. We&rsquo;ll call constructors, pull out members, call member functions, and jank will automatically ensure that destructors are called for any locals. Furthermore, jank already has full JIT compilation abilities for C++ code, so that means we can use our seamless interop to instantiate templates, define new structs which never existed before, etc.</p>
<h2 id="jeremiah-coyle-bling">Jeremiah Coyle: Bling</h2>
<p>Bling is a library for rich text formatting in the console. <a href="https://github.com/paintparty/bling">https://github.com/paintparty/bling</a> Work on Bling in Q2 of 2025 will focus on the following 3 goals:</p>
<ul>
<li>Add support for using hiccup to style and format messages</li>
<li>Add support a template string syntax to style and format messages</li>
<li>Create 1-3 additional formatting templates for callouts, headers, and points-of-interest.</li>
</ul>
<p>The following 4 features are stretch goals for Q2. They will be pursued in the following order when the initial 3 goals are completed.</p>
<ul>
<li>Add support automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">https://github.com/chalk/supports-color</a></li>
<li>Add documentation about how to leverage Bling to create great-looking warnings and errors in your own projects. Example of using bling&rsquo;s templates to create nice warnings can be found {here:](<a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#helpful-warnings-forbad-option-values">https://github.com/paintparty/fireworks?tab=readme-ov-file#helpful-warnings-forbad-option-values</a>)</li>
<li>Add documentation about using Bling in conjunction with existing libraries which format Spec and Malli messages into human readable form.</li>
<li>Support arbitrary hex colors, and their conversion, if necessary, to x256</li>
</ul>
<h2 id="karl-pietrzak-code-combat">Karl Pietrzak: Code Combat</h2>
<p>My project will focus on adding Clojure(Script) to CodeCombat<br>
See Wiki page at <a href="https://github.com/codecombat/codecombat/wiki/Aether">https://github.com/codecombat/codecombat/wiki/Aether</a></p>
<h2 id="siyoung-byun-scicloj---building-bridges-to-new-clojure-users">Siyoung Byun: Scicloj - Building Bridges to New Clojure Users</h2>
<p>In 2025, Scicloj aims to improve the accessibility of Clojure for individuals working with data,
regardless of their programming backgrounds. The project will initially focus on reviewing
existing Scicloj libraries, analyzing their codebases, and actively using them to better
understand their documentation structure. Specifically, the initial effort will concentrate on
clearly organizing and distinguishing between tutorials and API documentation. From these
insights, the project aims to develop standardized templates to encourage greater consistency across the documentation of existing Scicloj ecosystem libraries, making those libraries more robust and user-friendly.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Annually-Funded Developers&#39; Update: Jan./Feb. 2025</title>
      <link>https://www.clojuriststogether.org/news/annually-funded-developers-update-jan./feb.-2025/</link>
      <pubDate>Sat, 08 Mar 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/annually-funded-developers-update-jan./feb.-2025/</guid>
      <description>Dragan Duric, Eric Dallo, Michiel Borkent, Peter Taoussanis, Oleksandr Yakushev</description>
      <content:encoded><![CDATA[<p>Hello Fellow Clojurists!
This is the first report from the 5 developers receiving Annual Funding in 2025. (Highlights listed on the list below - but the reports include much more).</p>
<p><a href="#dragan-duric">Dragan Duric</a>: Apple M Engine Neanderthal<br>
<a href="#eric-dallo">Eric Dallo</a>: lsp-intellij, repl-intellij. lsp, lsp4clj<br>
<a href="#michiel-borkent">Michiel Borkent</a>: clj-kondo, squint, babashka, fs, SCI, and more&hellip;<br>
<a href="#peter-taoussanis">Peter Taoussanis</a>: Truss v2, Telemere v1 RC3<br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>: CIDER, clj-async-profiler and Flamebin, clj-memory-meter</p>
<h2 id="dragan-duric">Dragan Duric</h2>
<p>2025 Annual Funding Report 1. Published February 27, 2025.</p>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpus) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>In January and February, I released the first version of Neanderhal that can run on Mac/Apple M!</p>
<p><strong>My grant proposal:</strong> Here&rsquo;s what I&rsquo;ve proposed when applying for the CT grant.<br>
I propose to * Implement an Apple M engine for Neanderthal.* This involves:</p>
<ul>
<li>buying an Apple M2/3 Mac (the cheapest M3 in Serbia is almost 3000 USD (with VAT).</li>
<li>learning enough macOS tools (Xcode was terrible back in the days) to be able to do anything.</li>
<li>exploring JavaCPP support for ARM and macOS.</li>
<li>exploring relevant libraries (OpenBLAS may even work through JavaCPP).</li>
<li>exploring Apple Accelerate.</li>
<li>learning enough JavaCPP tooling to be able to see whether it is realistic that I build Accelerate wrapper (and if I can&rsquo;t, at least to know how much I don&rsquo;t know).</li>
<li>I forgot even little C/C++ that I did know back in the day. This may also give me some headaches, as I&rsquo;ll have to quickly pick up whatever is needed.</li>
<li>writing articles about relevant topics so Clojurians can pick this functionality as it arrives.</li>
</ul>
<p>Projects directly involved:<br>
<a href="https://github.com/uncomplicate/neanderthal">https://github.com/uncomplicate/neanderthal</a><br>
<a href="https://github.com/uncomplicate/deep-diamond">https://github.com/uncomplicate/deep-diamond</a><br>
<a href="https://github.com/uncomplicate/clojure-cpp">https://github.com/uncomplicate/clojure-cpp</a></p>
<p>First, I set to the task of tidying up the existing versions of Uncomplicate libraries (Neanderthal, Deep Diamond, etc.) to bring them up with the latest versions of native libraries, cuda, etc., and to fix some outstanding issues/bugs that might complicate work on Apple M support. After that, it was time for the main task, the beginnings of Apple M support.</p>
<p>The plan was to buy an Apple M2/M3, but in the meantime the nice Clojurians from Prague donated a used (but fantastically beefed up) MacBook Pro Max M1, so this was covered quickly!</p>
<p>I explored OpenBLAS as the first choice (the other is Apple Accelerate), as it can also work on Linux and Windows, and could be immediately beneficial to all users and easier to start with (I didn&rsquo;t need to switch to Apple yet).</p>
<p>I implemented the OpenBLAS engine for the part of functionality that was supported by JavaCPP&rsquo;s openblas preset.  A lot of critical functionality was not present there (although some of it was there in the openblas itself), so I jumped at the opportunity to learn some JavaCPP preset building, and improved JavaCPP&rsquo;s OpenBLAS.
After a bit of experimentation and lot of waiting on the compiler and github tools, this is now contributed upstream.</p>
<p>Next, I returned to the pleasant part of work - programming in Clojure - and completed the first Neanderthal
engine that runs in Apple M Macs. This covers the core and linalg namespace, because this is what OpenBLAS covers. The rest of Neanderthal functionality is waiting for me to explore Apple Accelerate, and to create engine based on that.</p>
<p>I managed to release Neanderthal 0.53.2, which enables Clojurians to use this on their Macs, just in time for this report.</p>
<p>I hope they&rsquo;ll have immediate benefits, and have fun doing some high performance hacking on their Macs.</p>
<p>Many thanks for CT for sponsoring this work!  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>2025 Annual Funding Report 1. Published February 27, 2025.</p>
<p>In the first two months of sponsorship I could work on so many things related to IDE development which made me really glad of this sponsorship! :heart:</p>
<p>I spend most of the time improving the Clojure development on IntelliJ, improving both <a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a> and <a href="https://github.com/afucher/clojure-repl-intellij">clojure-repl-intellij</a> plugins releasing 2 major extremally important versions.
The IntelliJ Clojure development using those plugins are way better and mature, please test and give feedback!</p>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<p>The 3.0.0 major version was a refactor on most of the plugin to use <a href="https://github.com/redhat-developer/lsp4ij">lsp4ij</a>, an OSS plugin for IntelliJ which makes easier to code and use LSP features, so this integration removed tons of code from this plugin that I needed to implement manually (and some had some bugs) and added support for lots of missing features that I didn&rsquo;t even plan to add. The lsp4ij plugin is used by multiple languages already which makes this plugin more resilient and stable. Check it out the call hierarchy feature on the image.<br>
<img src="https://github.com/user-attachments/assets/10fec440-1eb0-4fbd-a668-be36f4061d73" alt="call-hierarchy dallo feb 2025"></p>
<p><em>Kudos to <a href="https://github.com/angelozerr">@angelozerr</a> for the help during lsp4ij integration on their side.</em></p>
<h4 id="300---310">3.0.0 - 3.1.0</h4>
<ul>
<li>Fix brace matcher to insert closing brace for some missing cases.</li>
<li>Add imcompatible tag with Cursive and Clojure-Kit plugins.</li>
<li>Integrate with lsp4ij, a LSP client plugin, removing lots of logics from this plugin and fixing multiple bugs and issues. Fixes #63, #61, #59, #57, #53, #36, #21, #9, #5</li>
<li>Drop support for older intellijs, supporting 2023.3 onwards.</li>
<li>Bump clj4intellij to 0.6.3.</li>
<li>Fix code lens references not working when more than a project is opened. #67</li>
<li>Fix Settings page exception when more than a project was opened and closed.</li>
<li>Fix comment form complain about missing paren.</li>
<li>Improve server installation fixing concurrency bugs + using lsp4ij install API.</li>
</ul>
<h3 id="clojure-repl-intellijhttpsgithubcomafucherclojure-repl-intellij"><a href="https://github.com/afucher/clojure-repl-intellij">clojure-repl-intellij</a></h3>
<p>This 2.0.0 major release included multiple fixes and new features like the new _<em>Inlay hint eval result</em> + _<em>REPL syntax coloring</em>.</p>
<p><img src="https://github.com/user-attachments/assets/f441d4cc-8a14-4939-baaa-268b7886fbae" alt="clojure-repl-intellij dallo feb 2025"></p>
<p><em>Kudos to <a href="https://github.com/afucher">@afucher</a> for the help on some of those features.</em></p>
<h4 id="200---220">2.0.0 - 2.2.0</h4>
<ul>
<li>Add icons of REPL commands to REPL window (clear and entry history navigation). #99</li>
<li>Drop support of older IntelliJ versions (2021/2022). Now requires minimum IntelliJ 2023.3 (Build 233)</li>
<li>Fix namespace-not-found error handling. Now shows a message to the user. #107</li>
<li>Add eval inlay hint support. #106</li>
<li>Add action to interrupt evals on the REPL session (<code>shift alt R</code> + <code>shift alt S</code>).  #104</li>
<li>Add color settings page for customization of some tokens.</li>
<li>Add default name for RunConfigurations instead of save as Unnamed. #123</li>
<li>Add REPL syntax highlight. #18</li>
<li>Fix <code>eval defun at cursor</code> action error. #121</li>
<li>Create view error on test error. #128</li>
<li>Block backspace on repl input.</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p><a href="https://clojure-lsp.io/">clojure-lsp</a> is the base for all Clojure language handle logic and analysis, so lots of fixes and improvements are made all the time.</p>
<h4 id="20250122-232823---20250207-161124">2025.01.22-23.28.23 - 2025.02.07-16.11.24</h4>
<ul>
<li>
<p>General</p>
<ul>
<li>Bump clj-kondo to <code>2025.01.16</code></li>
<li>Bump lsp4clj to <code>1.11.0</code>.</li>
<li>Add semantic version sorting in completion lib versions. #1913</li>
<li>Fix internal error in range formatting. #1931</li>
<li>Drop support for jdk 8. #1942</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Change simple keyword completion to return all known keywords. #1920</li>
<li>Return textEdit to CompletionItems to fix completion in Zed #1933</li>
<li>Restrict linked edits to namespace aliases only, and fix a few related issues #1947</li>
<li>Add <code>:hover :hide-signature-call?</code> settings option to disable showing the surrounding call. #1954, @NoahTheDuke</li>
<li>Revert #1933, which caused a regression on completion adding extra text.</li>
<li>Fix fetching libs exception causing progress notification to be stuck. #1958</li>
</ul>
</li>
<li>
<p>API/CLI</p>
<ul>
<li>Add <code>:project-and-shallow-analysis</code> type to <code>dump</code> command</li>
<li>Add <code>:diagnostics</code> to <code>dump</code> command output (successor of <code>:findings</code>)</li>
</ul>
</li>
</ul>
<h3 id="lsp4cljhttpsgithubcomclojure-lsplsp4clj"><a href="https://github.com/clojure-lsp/lsp4clj">lsp4clj</a></h3>
<p>lsp4lj is the base of clojure-lsp, it&rsquo;s the layer that has all the LSP communication layer, making easy to build LSP clients/servers of any language in Clojure.</p>
<h4 id="v1110">v1.11.0</h4>
<ul>
<li>Add a <code>:response-executor</code> option to control on which thread responses to
server-initiated requests are run, defaulting to Promesa&rsquo;s <code>:default</code>
executor, i.e. <code>ForkJoinPool/commonPool</code>.</li>
<li>Fix work done progress notification to allow nullable <code>message</code>.</li>
</ul>
<h3 id="clj4intellijhttpsgithubcomericdalloclj4intellij"><a href="https://github.com/ericdallo/clj4intellij">clj4intellij</a></h3>
<p>clj4intellij is a lib that makes possible to code IntelliJ plugins in Clojure, it&rsquo;s used by both clojure-lsp-intellij and clojure-repl-intellij plugins.</p>
<h4 id="060---063">0.6.0 - 0.6.3</h4>
<ul>
<li>Add unregister-action! and improve register-action!</li>
<li>Add clj-kondo hook for proxy+.  <br></li>
</ul>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>2025 Annual Funding Report 1. Published February 28, 2025.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without you, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all. Top sponsors:</p>
<ul>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://github.com/pitch-io">Pitch</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways.  Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a>  OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.  Thank you! On to the projects that I&rsquo;ve been working on!</p>
<p>As I&rsquo;m writing this I&rsquo;m still recovering from a flu that has kept me bedridden for a good few days, but I&rsquo;m starting to feel better now. Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months.<br>
As I&rsquo;m writing this I&rsquo;m still recovering from a flu that has kept me bedridden for a good few days, but I&rsquo;m starting to feel better now.</p>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months.</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>Unreleased:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2493">#2493</a>: reduce image size of native image</li>
<li>2025.02.20:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2473">#2473</a>: New linter: :unknown-ns-options will warn on malformed (ns) calls. The linter is {:level :warning} by default. (<a href="https://github.com/Noahtheduke">@Noahtheduke</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2475">#2475</a>: add :do-template linter to check args &amp; values counts (<a href="https://github.com/imrekoszo">@imrekoszo</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2465">#2465</a>: fix :discouraged-var linter for fixed arities</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2277">#2277</a>: prefer an array class symbol over (Class/forName &hellip;) in defprotocol and extend-type</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2466">#2466</a>: fix false positive with tagged literal in macroexpand hook</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2463">#2463</a>: using :min-clj-kondo-version results in incorrect warning (<a href="https://github.com/imrekoszo">@imrekoszo</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2464">#2464</a>: :min-clj-kondo-version warning/error should have a location in config.edn (<a href="https://github.com/imrekoszo">@imrekoszo</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2472">#2472</a> hooks api/resolve should return nil for unresolved symbols and locals</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2472">#2472</a>: add api/env to determine if symbol is local</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2482">#2482</a>: Upgrade to Oracle GraalVM 23</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2483">#2483</a>: add api/quote-node and api/quote-node? to hooks API (<a href="https://github.com/camsaul">@camsaul</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2490">#2490</a>: restore unofficial support for ignore hints via metadata</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler
<ul>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/609">#609</a>: make remove return a transducer when no collection is provided</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/611">#611</a>: Implement the set? function (<a href="https://github.com/jonasseglare">@jonasseglare</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/613">#613</a>: Optimize aset</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/XXX">#626</a>: Implement take-last</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/615">#615</a>: (zero? &ldquo;0&rdquo;) should return false</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/617">#617</a>: deftype field name munging problem</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/618">#618</a>: Named multi-arity fn args don&rsquo;t get munged (<a href="https://github.com/grayrest">@grayrest</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/622">#622</a>: operator precendence issue with | and if</li>
<li>Add clojure.string functions lower-case, upper-case, capitalize (<a href="https://github.com/plexus">@plexus</a>)</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/605">#605</a>: merge command line &ndash;paths with squint.edn config properly</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/607">#607</a>: make mapcat return a transducer if no collections are provided (<a href="https://github.com/jonasseglare">@jonasseglare</a>)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.
<ul>
<li>Experimenting upgrading to new beta core.async, work in is a branch ready to be merged</li>
<li><a href="https://github.com/babashka/babashka/issues/1785">#1785</a>: Allow subclasses of Throwable to have instance methods invoked (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1791">#1791</a>: interop problem on Jsoup form element</li>
<li><a href="https://github.com/babashka/babashka/issues/1793">#1793</a>: Bump rewrite-clj to 1.1.49 (fixes parsing of foo// among other things)</li>
<li>Bump deps.clj</li>
<li>Bump fs</li>
</ul>
</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure
<ul>
<li>v0.5.24 (2025-01-09)</li>
<li><a href="https://github.com/babashka/fs/issues/135">#135</a>: additional fix for preserving protocol when calling fs/path on multiple arguments (<a href="https://github.com/Sohalt">@Sohalt</a>)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting
<ul>
<li>Records should have keys present and set to nil</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>Catch up with several new versions of clojure CLI</li>
<li>Fix <a href="https://github.com/borkdude/deps.clj/issues/132">#132</a>: copy install tools.edn to config dir when install version is newer, similar to clojure CLI bash script</li>
<li>Adds support for XDG_DATA_HOME environment variable according to <a href="https://specifications.freedesktop.org/basedir-spec/latest/">XDG Base Directory Specification</a></li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases
<ul>
<li>Add support for DuckDB (<a href="https://github.com/paintparty">@avelino</a>)</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata
<ul>
<li>Fix #115: add location to exception for invalid keyword</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/rewrite-edn">rewrite-edn</a>: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments
<ul>
<li><a href="https://github.com/borkdude/rewrite-edn/issues/40">#40</a>: assoc/update now handles map keys that have no indent at all (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/borkdude/rewrite-edn/issues/43">#43</a>: bump rewrite-clj to 1.1.49 (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/borkdude/rewrite-edn/issues/40">#40</a>: assoc/update now handles map keys that have no indent at all (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/borkdude/rewrite-edn/issues/40">#40</a>: assoc/update now aligns indent to comment if that&rsquo;s all that is in the map (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/borkdude/rewrite-edn/issues/40">#40</a>: update now indents new entries in same way as assoc (<a href="https://github.com/lread">@lread</a>) <br></li>
</ul>
</li>
</ul>
<p><a href="https://blog.michielborkent.nl/oss-updates-jan-feb-2025.html">Other projects I&rsquo;ve been working on this month. See Click for More Details.</a> <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>2025 Annual Funding Report 1. Published February 27, 2025.</p>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏<br>
- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<p>Hi everyone! 👋</p>
<p>I&rsquo;ve been focused recently on getting <a href="https://www.taoensso.com/telemere">Telemere</a> v1 over the finish line. That&rsquo;s been a lot of ongoing work, in part because I&rsquo;m trying to establish patterns that can be easily shared between a suite of complementary libs (Telemere, <a href="https://www.taoensso.com/tufte">Tufte</a>, and <a href="https://www.taoensso.com/truss">Truss</a>).</p>
<p>I&rsquo;ve also been considering long-term plans for how to better modularize <a href="https://www.taoensso.com/encore">Encore</a> to help reduce dependency and build sizes where relevant. More on that later in the year.</p>
<h3 id="truss-v2---an-opinionated-micro-toolkit-for-cljs-errors">Truss v2 - an opinionated micro toolkit for Clj/s errors</h3>
<p>I&rsquo;ve recently released <a href="https://github.com/taoensso/truss/releases/tag/v2.0.0">Truss v2</a>, which has enlarged the scope of the library from just assertion utils to a <strong>general error toolkit</strong> for Clojure and ClojureScript.</p>
<p><strong>v2 includes:</strong></p>
<ul>
<li>A ground-up rewrite of the existing assertion utils to improve performance, reduce build size, and improve integration with Telemere.</li>
<li>A new set of small but high-value error utils moved from Encore as part of the ongoing modularization effort.</li>
<li>A new <a href="https://cljdoc.org/d/com.taoensso/truss/CURRENT/api/taoensso.truss#ex-info">contextual exception</a> type that&rsquo;s already used by Encore and Telemere, and will be used by all of my other libraries in future.</li>
<li>Updated docs and a new <a href="https://www.taoensso.com/truss/slack">Slack channel</a>.<br>
Truss v2 basically packages together a minimal set of mature tools and patterns that I&rsquo;ve used over many years to help tame Clojure&rsquo;s often unruly errors. It&rsquo;s simple stuff, but practical - and it helps.<br>
For more info see the <a href="https://github.com/taoensso/truss">README</a> and <a href="https://cljdoc.org/d/com.taoensso/truss/CURRENT/api/taoensso.truss">docstrings</a>.</li>
</ul>
<h3 id="telemere-v1-rc3---structured-logging-and-telemetry-for-cljs">Telemere v1 RC3 - structured logging and telemetry for Clj/s</h3>
<p>I was hoping to release Telemere v1 final this month, but decided that a <a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0-RC3">third release candidate</a> was warranted.</p>
<p>The latest improvements are focused on harmonizing relevant terminology, concepts, and API between Telemere, <a href="https://www.taoensso.com/truss">Truss</a>, and the forthcoming v3 of <a href="https://www.taoensso.com/tufte">Tufte</a>.</p>
<p>Big thanks to everyone that&rsquo;s been helping test and give feedback! v1 final really should (finally) be available next month 🙏</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>The next major release planned is <a href="https://www.taoensso.com/tufte">Tufte</a> v3. I&rsquo;ve already got an early draft prepared, but there&rsquo;s polish needed - and new docs.</p>
<p>v3 improves performance and significantly improves interop with Telemere, offering what I believe to be a pretty compelling combination for <a href="https://github.com/taoensso/telemere#next-gen-observability">Clojure/Script observability and monitoring</a>.</p>
<p>For plans after that, you can see my <a href="https://taoensso.com/roadmap/2025">2025 roadmap</a>), which as usual I&rsquo;ll keep updated along the way 👍</p>
<p>Cheers everyone! :-) <br></p>
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p>2025 Annual Funding Report 1. Published February 28, 2025.</p>
<p>Hello friends! Here&rsquo;s a short summary of my <strong>January-February Clojurists Together 2025 sponsorship</strong> work.</p>
<h3 id="cider">CIDER</h3>
<ul>
<li>I spearheaded the <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.17.0"><strong>1.17</strong></a> and <strong>1.17.1</strong> releases of CIDER.</li>
<li>The biggest feature of the release is the support for automatic downloading of Java sources (details: <a href="https://clojurians.slack.com/archives/C06MAR553/p1739810631203369)">https://clojurians.slack.com/archives/C06MAR553/p1739810631203369)</a>.</li>
<li>Auxiliary releases: nrepl <a href="https://github.com/nrepl/nrepl/blob/master/CHANGELOG.md#131-2025-01-01">1.3.1</a>, cider-nrepl <a href="https://github.com/clojure-emacs/cider-nrepl/blob/master/CHANGELOG.md#0521-2025-02-24">0.52.1</a>, Orchard <a href="https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0301-2025-02-24">0.30.1</a>.</li>
</ul>
<h3 id="clj-async-profiler-and-flamebin">clj-async-profiler and Flamebin</h3>
<ul>
<li>New releases: <a href="https://github.com/clojure-goes-fast/clj-async-profiler/blob/master/CHANGELOG.md#160-2025-01-09">1.6.0</a> and <a href="https://github.com/clojure-goes-fast/clj-async-profiler/blob/master/CHANGELOG.md#161-2025-02-10">1.6.1</a>.</li>
<li>New feature: switchable viewing modes for diffgraphs (details: <a href="https://clojurians.slack.com/archives/C06MAR553/p1736447669594659">https://clojurians.slack.com/archives/C06MAR553/p1736447669594659</a>)</li>
<li>New feature: total percentage is automatically calculated for highlighted frames.</li>
<li>Both features are also supported at Flamebin (<a href="https://flamebin.dev/)">https://flamebin.dev/)</a>.</li>
</ul>
<h3 id="clj-memory-meter">clj-memory-meter</h3>
<ul>
<li>New release: <a href="https://github.com/clojure-goes-fast/clj-memory-meter/blob/master/CHANGELOG.md#040-2025-02-18">0.4.0</a>.</li>
<li>New feature: memory usage tracing.</li>
<li>New blog post: I have written about this new clj-memory-meter feature on Clojure Goes Fast blog: <a href="https://clojure-goes-fast.com/blog/tracking-memory-usage/">Tracking memory usage with clj-memory-meter.trace</a>.</li>
</ul>
<h3 id="misc-projects">Misc projects</h3>
<ul>
<li>New release: virgil <a href="https://github.com/clj-commons/virgil/blob/master/CHANGELOG.md#032-2025-01-28">0.3.2</a> - bugfixes.</li>
<li>New release: clj-java-decompiler <a href="https://github.com/clojure-goes-fast/clj-java-decompiler/blob/master/CHANGELOG.md#037-2025-01-28">0.3.7</a> - bugfixes.  <br></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for Proposals. Feb. 2025 Member Survey</title>
      <link>https://www.clojuriststogether.org/news/call-for-proposals.-feb.-2025-member-survey/</link>
      <pubDate>Thu, 06 Mar 2025 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-proposals.-feb.-2025-member-survey/</guid>
      <description>We are awarding up to $33K for Q2 2025 Projects</description>
      <content:encoded><![CDATA[<p>Greetings folks!</p>
<p>Clojurists Together is pleased to announce that we are opening our Q2 2025 funding round for Clojure Open Source Projects.  Applications will be accepted through the 17th of March 2025 (midnight Pacific Time). We are looking forward to reviewing your proposals! <a href="https://clojuriststogether.org/open-source/">More information and the application can be found here.</a></p>
<p>We will be awarding up to $33,000 USD for a total of 5-7 projects. The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established. Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed. We expect projects to start on April 1, 2025.</p>
<p>A BIG THANKS to all our members for your continued support. We also want to encourage you to reach out to your <a href="https://www.clojuriststogether.org/developers/">colleagues</a> and <a href="https://www.clojuriststogether.org/companies/">companies</a> to join Clojurists Together so that we can fund EVEN MORE great projects throughout the year.</p>
<p>We surveyed our members again in February to find out what types of initiatives they would like us to focus on for this round of funding. Their responses are summarized below. In particular, it was great to see members' feedback relating to how often they used or referred to developers' work we have funded. Also noted that several of you plan to attend Clojure/Conj, Clojure Berlin MeetUps, SciNoj Light, ClojureX, and ReClojure. CLojurists Together will be one of the sponsors of <a href="https://www.reclojure.org/">ReClojure in London this May</a>.</p>
<p>Here is more from our February Members' survey.</p>
<p><img src="https://github.com/user-attachments/assets/de41cff5-ca19-4dbf-b4ee-106d56fb5cf0" alt="Usage Feb 2025"></p>
<p><img src="https://github.com/user-attachments/assets/5b44768f-07af-4a76-9302-e9ebc33e378f" alt="platforms in projects feb 25"></p>
<p><img src="https://github.com/user-attachments/assets/738cc38f-0f1d-453b-ba04-42b651ff0203" alt="improve clojure feb 25"></p>
<p><img src="https://github.com/user-attachments/assets/4c191b66-9861-41fa-9ec8-e069a58dd93d" alt="improve clojurescript feb 25"></p>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<p>•	&ldquo;Beginners&rdquo; onboarding. I think we need to make a concerted effort to attract new people (not only people without programming experience) and make the initial stages of &ldquo;getting into Clojure(Script)&rdquo; much more guided. Even if that initially means &ldquo;opinionated&rdquo;. Once a person has a minimum level of confidence, she can always explore other &ldquo;opinionated options&rdquo;. Otherwise, we risk fragmenting the efforts, and making the learners confused (which can led them to rejecting the language).<br>
•	We need to gain more hype and visibility in the wider software development community<br>
•	Outreach to new developers<br>
•	Learning experience for people who are not senior developers. Build tooling and getting started material for newcomers<br>
•	Data Science - can I make an R-quality chart without Python?<br>
•	Shadow - linting and bus-factor - Shadow is fiendishly complex judging by the rate of questions on Slack, and there is just one expert.<br>
•	ClojureDart<br>
•	New use cases, data analysis, clojure in academia, beginner resources, interop<br>
•	JS Ecosystem interop. How to use stuff like shadcn, tailwind etc. These things should not be so different from how people do it in JS.<br>
•	Scientific Clojure and Clojure for data processing<br>
•	DX tools.<br>
•	Build tooling the introduction of deps has made the ecosystem more difficult to get into<br>
•	The developer experience - it is already good, but it could be so much better. Better, more usable error messages, stack traces and better / easier to use profiling tools and tools for structuring builds<br>
•	The core is stagnant, especially the spec debacle.</p>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong?</h3>
<p>•	Just a great community<br>
•	Clojure-JVM language maintenance<br>
•	Web development, data processing<br>
•	The language. The tooling is becoming stronger, but more to go I think.<br>
•	Developer Experience Tools for experienced devs<br>
•	Very excited about all the work around the data science scene ie noj, clerk<br>
•	Clojure async, scripting, and web use cases are well covered<br>
•	Core language<br>
•	Build tooling<br>
•	The backwards compatibility and stability of libraries<br>
•	Linting<br>
•	Core libraries for config, web apps, routing, database interaction are all well served<br>
•	In general everything just works and is very stable, can&rsquo;t wish for a better ecosystem to build on.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>•	Jank (3) Jank seems increasingly important to use all the C++ AI related libs and models.<br>
•	Malli (3)<br>
•	shadow-cljs (3)<br>
•	Everything borkdude is doing (3)<br>
•	Babashka (2)<br>
•	Calva (2)<br>
•	CIDER (2)<br>
•	ClojureDart (2)<br>
•	Clojure LSP (2)<br>
•	Datalevin (2)<br>
•	Reitit (2)<br>
•	SciCloj (2)<br>
•	BB, carmine, Cheshire, clang, clay, clj-kondo, Clojars, clojupyter, clojure.jdbc, Cloverage, Conjure, Datahike, datomic-related, dtype-next, Duct (for deps.edn), Elasticsearch (spandex), fastmath, FlowStorm, Fulcro, girouette, http-kit, honeysql, HugSQL, kindly, Neanderthal, next-jdbc, nippy, noj, parinfer, Pathom, Portal, python-clj, Reagent, Shadow, snitch. NBBAero, squint/cherry. tableplot. tech.ml.dataset. A continuation of oz. Statistical libraries (say brms),  uix</p>
<p>•	I would LOVE to see some additional testing and cleanup work on Bifurcan&ndash;I&rsquo;ve been using it a ton recently and it&rsquo;s a big step up from the standard Clojure data structures</p>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h3>
<p>•	That AI&rsquo;s get better at writing/reviewing Clojure code.<br>
•	I would love to see wider adoption of cljs on node.<br>
•	More cljc portable libraries usable in the JVM, browser, and Dart<br>
•	A plan for growth into new use cases, fields, and user personas<br>
•	Good integrations of Clojure IDEs with LLMs<br>
•	User-friendly developer tools: easy bootstrap, easy frameworks, a starting point to move fast from the start<br>
•	Moldable development<br>
•	Clojure data science tools with paths to reach parity with R and python<br>
•	I would love an online course <em>for free</em><br>
•	Better support and tutorials around datalog databases beyond datomic<br>
•	Some kind of consensus as to how to create &ldquo;quickstart&rdquo; applications for various usecases that will make the Clojure ecosystem easier for new users to approach and for existing Clojurians to &ldquo;sell&rdquo; the stack into the teams that they work with. Ruby had / has Rails, Elixir has Phoenix, Node had / has Express, Python had / has Flask - Clojure needs a toolchain to create the same skeletons without departing from the many libraries approach that makes Clojure eventually far more versatile, down the road.<br>
•	Show the broader dev community that choosing Clojure for new projects is viable.<br>
•	We need to gain more hype and visibility in the wider software development community.<br>
•	More outreach, articles and so on to new developers.<br>
•	Improve adoption for non-Clojure users.<br>
•	It would be great to think of how we can grow the Clojure community so that it will be sustainable in the long run. What are some ways we can reach new audiences and bring more people into the community?<br>
•	I&rsquo;d like it to be easier for newcomers to Clojure to get started.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Nov. and Dec. 2024 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/nov.-and-dec.-2024-project-updates/</link>
      <pubDate>Thu, 09 Jan 2025 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/nov.-and-dec.-2024-project-updates/</guid>
      <description>The latest from Bozhidar Batsov, Michiel Borkent, Toby Crawley, Thomas Heller, Kira McLean, Nikita Prokopov, Tommi Reiman, Daniel Slutsky, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Happy New Year all! This is the last set up updates from our developers who received 2024 annual funding - and the final reports from Ambrose Bonnaire-Sergeant and Daniel Slutsky who were funded in Q3 2024. Thanks to everyone for their amazing work throughout the year!</p>
<h2 id="long-term-project-updates">Long-Term Project Updates</h2>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER    <br>
<a href="#michiel-borkent">Michiel Borkent:</a> squint, babashka, neil, cherry, clj-kondo, and more<br>
<a href="#toby-crawley">Toby Crawley:</a> clojars-web <br>
<a href="#thomas-heller">Thomas Heller:</a> shadow-cljs, shadow-grove <br>
<a href="#kira-howe">Kira Howe:</a> Scicloj Libraries. tcutils, Clojure Data Cookbook, and more<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Humble UI, Datascript, AlleKinos, Clj-reload, and more<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Reitit 7.0. Malli, jsonista, and more <br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Carmine, Nippy, Telemere, and more  <br></p>
<h2 id="q3-2024-project-update">Q3 2024 Project Update</h2>
<p><a href="#ambrose-bonnaire-sergeant-malli">Ambrose Bonnaire-Sergeant: Malli</a><br>
<a href="#daniel-slutsky-scicloj">Daniel Slutsky:SciCloj</a></p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>Report 6. Published January 1, 2025</p>
<p>Happy New Year, everyone!<br>
The last couple of months were a bit slower than usual for CIDER and friends, but still we managed to make some good progress. Below are a list of highlights:</p>
<ul>
<li>CIDER 1.16.1 was released in early December with a <a href="https://github.com/clojure-emacs/cider/blob/master/CHANGELOG.md#1161-2024-12-03">bunch of bug-fixes</a></li>
<li>nREPL 1.3.1 is also out with a <a href="https://github.com/nrepl/nrepl/blob/master/CHANGELOG.md#131-2025-01-01">couple of small fixes</a>.</li>
<li>Work has been done in Orchard to simplify the parsing of Java source files
<ul>
<li>We&rsquo;ve dropped support for Java source parsing on Java 8 to make the codebase more maintainable</li>
<li>Now you no longer need to have the JDK sources on the classpath (Orchard will look for them in several common places)</li>
<li>This (and some other improvements) with be integrated with CIDER for its next release (1.17), which I&rsquo;m hoping to launch in the next month or so.</li>
</ul>
</li>
<li><a href="https://github.com/nrepl/piggieback/blob/master/CHANGES.md#060-2021-12-31">Piggieback 0.6</a> is out with improved compatibility for nREPL 1.3.
<ul>
<li>That&rsquo;s the first release in over 3 years, btw!</li>
</ul>
</li>
<li>We&rsquo;ve launched a <a href="https://metaredux.com/posts/2024/12/23/state-of-cider-2024.html">State of CIDER 2024</a> to gather input from the users about they way they are currently using CIDER. The data from this survey will help us shape up the roadmap for 2025. The survey will remain open until the end of January.</li>
</ul>
<p>That&rsquo;s all from me for now. Thanks again for supporting CIDER&rsquo;s development in 2024!  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>Report 6. Published December 30, 2024</p>
<p><strong>Updates</strong>
In this post I&rsquo;ll give updates about open source I worked on during November and December 2024. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without <em>you</em>, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all.</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br/">Nubank</a></li>
</ul>
<h3 id="sponsor-info">Sponsor info</h3>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which aren&rsquo;t listed above, please get in touch. On to the projects that I&rsquo;ve been working on!</p>
<h3 id="updates">Updates</h3>
<p>Clojurists Together announced that I&rsquo;m among the 5 developers who were voted to receive the Long Term Funding in 2025. You can see the announcement <a href="https://www.clojuriststogether.org/news/clojurists-together-2025-long-term-funding-announcement/">here</a>. Thanks so much!<br>
Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months.</p>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li><a href="https://github.com/babashka/babashka/issues/1771">#1771</a>: <code>*e*</code> in REPL should contain exception thrown by user, not a wrapped one</li>
<li><a href="https://github.com/babashka/babashka/issues/1777">#1777</a> Add <code>java.nio.file.attribute.UserDefinedFileAttributeView</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1776">#1776</a> <code>Add java.nio.file.attribute.PosixFileAttributes</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1761">#1761</a> Support calling <code>clojure.lang.RT/iter</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1760">#1760</a> For compatibility with <a href="https://github.com/paintparty/fireworks">Fireworks v0.10.3</a>, added the following to <code>:instance-checks</code> entry in <code>babashka.impl.classes/classes</code>(<a href="https://github.com/paintparty">@paintparty</a>)
<ul>
<li><code>clojure.lang.PersistentArrayMap$TransientArrayMap</code></li>
<li><code>clojure.lang.PersistentHashMap$TransientHashMap</code></li>
<li><code>clojure.lang.PersistentVector$TransientVector</code></li>
<li><code>java.lang.NoSuchFieldException</code></li>
<li><code>java.util.AbstractMap</code></li>
<li><code>java.util.AbstractSet</code></li>
<li><code>java.util.AbstractList</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka/issues/1760">#1760</a> For compatibility with <a href="https://github.com/paintparty/fireworks">Fireworks v0.10.3</a>, added <code>volatile?</code> entry to <code>babashka.impl.clojure.core/core-extras</code>(<a href="https://github.com/paintparty">@paintparty</a>)</li>
<li>Bump <code>babashka.cli</code> to <code>0.8.61</code></li>
<li>Bump <code>clj-yaml</code> to <code>1.0.29</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1768">#1768</a>: Add <code>taoensso.timbre</code> <code>color-str</code> function</li>
<li>Add classes:
<ul>
<li><code>javax.crypto.KeyAgreement</code></li>
<li><code>java.security.KeyPairGenerator</code></li>
<li><code>java.security.KeyPair</code></li>
<li><code>java.security.spec.ECGenParameterSpec</code></li>
<li><code>java.security.spec.PKCS8EncodedKeySpec</code></li>
<li><code>java.security.spec.X509EncodedKeySpec</code></li>
<li><code>java.security.Signature</code></li>
</ul>
</li>
<li>Add <code>java.util.concurrent.CompletionStage</code></li>
<li>Bump <code>core.async</code> to <code>1.7.701</code></li>
<li>Bump <code>org.babashka/cli</code> to <code>0.8.162</code></li>
<li>Include <a href="https://jsoup.org/">jsoup</a> for HTML parsing. This makes bb compatible with the <a href="https://github.com/clj-commons/hickory">hickory</a> library (and possibly other libraries?).</li>
<li><a href="https://github.com/babashka/babashka/issues/1752">#1752</a>: include <code>java.lang.SecurityException</code> for <code>java.net.http.HttpClient</code> support (<a href="https://github.com/grzm">@grzm</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1748">#1748</a>: add <code>clojure.core/ensure</code></li>
<li>Upgrade <code>taoensso/timbre</code>to <code>v6.6.0</code></li>
<li>Upgrade <code>babashka.http-client</code> to <code>v0.4.22</code></li>
<li>Add <code>:git/sha</code> from build to <code>bb describe</code> output (<a href="https://github.com/lispyclouds">@lispyclouds</a>)</li>
<li>Fix NPE with determining if executing from self-contained executable</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/255">#255</a>: fn literal with rest args</li>
<li><a href="https://github.com/squint-cljs/squint/issues/596">#596</a>: fix unary division to produce reciprocal</li>
<li><a href="https://github.com/squint-cljs/squint/issues/592">#592</a>: fix <code>clj-&gt;js</code> to not process custom classes</li>
<li><a href="https://github.com/squint-cljs/squint/issues/585">#585</a>: fix <code>clj-&gt;js</code> to realize lazy seqs into arrays</li>
<li><a href="https://github.com/squint-cljs/squint/issues/586">#586</a>: support extending protocol to <code>nil</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/581">#581</a>: support docstring in <code>defprotocol</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/582">#582</a>: add <code>extend-protocol</code></li>
<li>Add <code>delay</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/575">#575</a>: <code>map?</code> should not return <code>true</code> for array</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/577">#577</a>: support <code>$default</code> + <code>:refer</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/572">#572</a>: prevent vite page reload</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</p>
<ul>
<li>Fix <a href="https://github.com/babashka/cli/issues/109">#109</a>: allow options to start with a number</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</p>
<ul>
<li><a href="https://github.com/babashka/babashka/issues/99">#99</a>: make <code>js/import</code> work</li>
<li><a href="https://github.com/babashka/babashka/issues/55">#55</a>: create gh-pages dir before using.</li>
<li><a href="https://github.com/babashka/babashka/issues/89">#89</a>: allow <code>evaluate_script_tags</code> to specify individual scripts.</li>
<li><a href="https://github.com/babashka/scittle/issues/87">#87</a>: prod build on fresh checkout fails</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy. \</p>
<ul>
<li>Unreleased</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2451">#2272</a>: Lint for nil return from if-like forms</li>
<li>Add <code>printf</code> to vars linted by <code>analyze-format</code>. (<a href="https://github.com/tomdl89">@tomdl89</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2272">#2272</a>: Report var usage in <code>if-let</code> etc condition as always truthy</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2272">#2272</a>: Report var usage in <code>if-not</code> condition as always truthy</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2433">#2433</a>: false positive redundant ignore with hook</li>
<li>Document <code>:cljc</code> config option. (<a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2439">#2439</a>: uneval may apply to nnext form if reader conditional doesn&rsquo;t yield a form (<a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2431">#2431</a>: only apply redundant-nested-call linter for nested exprs</li>
<li>Relax <code>:redundant-nested-call</code> for <code>comp</code>, <code>concat</code>, <code>every-pred</code> and <code>some-fn</code> since it may affect performance</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2446">#2446</a>: false positive <code>:redundant-ignore</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2448">#2448</a>: redundant nested call in hook gen&rsquo;ed code</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2424">#2424</a>: fix combination of :config-in-ns and :discouraged-namespace</li>
<li>2024.11.14</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2212">#2212</a>: NEW linter: <code>:redundant-nested-call</code> (<a href="https://github.com/tomdl89">@tomdl89</a>), set to level <code>:info</code> by default</li>
<li>Bump <code>:redundant-ignore</code>, <code>:redundant-str-call</code> linters to level <code>:info</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1784">#1784</a>: detect <code>:redundant-do</code> in <code>catch</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2410">#2410</a>: add <code>--report-level</code> flag</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2416">#2416</a>: detect empty <code>require</code> and <code>:require</code> forms (<a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1786">#1786</a>: Support <code>gen-interface</code> (by suppressing unresolved symbols)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2407">#2407</a>: support ignore hint on called symbol</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2420">#2420</a>: Detect uneven number of clauses in <code>cond-&gt;</code> and <code>cond-&gt;&gt;</code> (<a href="https://github.com/tomdl89">@tomdl89</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2415">#2415</a>: false positive type checking issue with <code>str/replace</code> and <code>^String</code> annotation</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>1.3.196 (2024-11-25)</li>
<li>Add <code>locking</code> macro for compatibility with CLJS</li>
<li>1.3.195 (2024-11-07)</li>
<li><a href="https://github.com/babashka/nbb/issues/343">#343</a>: support <code>:reload</code> for reloading CLJS namespaces and JS code</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</p>
<ul>
<li>Fix parsing of <code>b//</code> symbol</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3</p>
<ul>
<li><a href="https://github.com/babashka/pod-babashka-go-sqlite3/issues/19">#19</a>: Restore mac intel support (this time for real)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and <a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>: use tools.deps directly from babashka</p>
<ul>
<li>Fix <a href="https://github.com/babashka/tools-deps-native/issues/30">#30</a>: pod won&rsquo;t run on newer versions of macOS</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client \</p>
<ul>
<li><a href="https://github.com/babashka/http-client/issues/71">#73</a>: Allow implicit ports when specifying the URL as a map (<a href="https://github.com/lvh">@lvh</a>)</li>
<li><a href="https://github.com/babashka/http-client/issues/71">#71</a>: Link back to sources in release artifact(<a href="https://github.com/lread">@lread</a>)</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>There are many other projects I’m involved with but that had little to no activity in the past month. Check out the <strong>Other Projects</strong> section (more details) of <a href="https://blog.michielborkent.nl/oss-updates-nov-dec-2024.html">my blog here</a> to see a full list. <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<p>Report 6. Published December 31, 2024</p>
<p><a href="https://github.com/clojars/clojars-web/blob/main/CHANGELOG.org#2024-december">CHANGELOG</a> | <a href="https://github.com/clojars/clojars-web/compare/7da06ec54d579d01578b2ee62bd20deeb1d87fe6...739b3a062370a75a8f6217a3d73ce5e42225c145"><code>clojars-web</code> commits</a></p>
<ul>
<li>Added a new API to provide a <a href="https://github.com/clojars/clojars-web/pull/896">release feed</a></li>
</ul>
<h4 id="november-2024">November 2024</h4>
<p><a href="https://github.com/clojars/clojars-web/blob/main/CHANGELOG.org#2024-november">CHANGELOG</a> | <a href="https://github.com/clojars/clojars-web/compare/7414339136d6ac3455525fd949ee8372ff15ea03...7da06ec54d579d01578b2ee62bd20deeb1d87fe6"><code>clojars-web</code> commits</a> | <a href="https://github.com/clojars/infrastructure/compare/e801cb297560b911c9b1ad01cd46c805d16eeed3...dea9364b1bf31d0018909d2a34c68d628118d65a"><code>infrastructure</code> commits</a></p>
<ul>
<li>Worked with a new contributor (<a href="https://github.com/opoku">Osei Poku</a>) to <a href="https://github.com/clojars/clojars-web/pull/893">implement a sitemap</a></li>
<li>Constrained heap usages for cron tasks to prevent competition with the webapp<br>
(this was causing the server instance to become unavailable on occasion)  <br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Report 6.  Published January 6, 2025</p>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.28.20 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a>  <br></p>
<hr>
<h2 id="kira-howe">Kira Howe</h2>
<p>Report 6. Published December 31, 2024.</p>
<p>This is a summary of the open source work I spent my time on throughout November and December 2024. This was the last period of my ongoing funding from Clojurists together. It&rsquo;s been such a magical year in many ways and I&rsquo;m so grateful to have had the opportunity to spend so much time focusing on open source this year. It was a fantastic experience and I hope to be able to take another professional hiatus at some point in the future to do it again.</p>
<p>I&rsquo;ve really enjoyed writing these summaries, too, and I find knowing they&rsquo;re coming helps motivate me to stay more organized and keep better track of things, so I&rsquo;ll probably continue to publish them even though I&rsquo;ll be spending less time on side projects as my focus shifts to other priorities this year.</p>
<h3 id="sponsors-1">Sponsors</h3>
<p>I always start these posts with a sincere thank you to the generous ongoing support of my sponsors that make this work possible. I can&rsquo;t say how much I appreciate all of the support the community has given to my work and would like to give a special thanks to Clojurists Together and Nubank for providing incredibly generous grants that allowed me reduce my client work significantly and afford to spend more time on projects for the Clojure ecosystem for nearly a year.</p>
<p>If you find my work valuable, please share it with others and consider supporting it financially. There are details about how to do that on my <a href="https://github.com/sponsors/kirahowe">GitHub sponsors page</a>. On to the updates!</p>
<h3 id="bobkonf-2025">BOBKonf 2025</h3>
<p>One exciting update is that <a href="https://bobkonf.de/2025/howe.html">a workshop I proposed got accepted to BOBKonf</a>, which will be in Berlin next March. It&rsquo;ll be similar to the types of talks and workshops I&rsquo;ve been doing over the last couple of years at e.g. the Conj and London Clojurians, of course updated to show off the latest and greatest developments in the Clojure-for-data ecosystem. I spent some time in December beginning work on the content and now I&rsquo;m in full conference-driven-development mode, figuring out what&rsquo;s realistic to finish in time to demo at the event and what we should consider stable &ldquo;enough&rdquo; for now and just include. This preliminary work also sparked a couple of minor conversations, one about <a href="https://github.com/scicloj/clay/issues/192">quarto theming of Clay notebooks</a> and another about <a href="https://clojurians.zulipchat.com/#narrow/channel/236259-tech.2Eml.2Edataset.2Edev/topic/excel.20dates/near/486781881">parsing dates from Excel workbooks</a>.</p>
<p>Anyway there are still a couple of months to work on it, which on one hand feels like a long time but on the other hand is also no time at all. Before I know it I&rsquo;ll be landing in Berlin ready to share the wonders of Clojure with a new eager audience.</p>
<h3 id="clojure-data-cookbook">Clojure Data Cookbook</h3>
<p>This has been a very long-running, very ongoing project of mine. The high level goal was always (and still is) to create resources that would allow people to figure out how to be productive with Clojure&rsquo;s data stack. In reality what this particular project morphed into was a process for discovering the gaps in the ecosystem and guiding development of new tools, uncovering missing features to implement or new libraries to write every time I&rsquo;d start work on a new chapter.</p>
<p>We&rsquo;ve come a long way over the past couple of years and there&rsquo;s still work to do but the ecosystem is reasonably mature now. The <a href="https://scicloj.github.io/noj/">Noj book</a> has taken on covering a lot of the topics I wanted to document thanks to Daniel Slutsky&rsquo;s incredible efforts at coordinating the community to produce this amazing content. The list of draft articles demonstrates many of the areas where work is still very ongoing in the development of the various libraries. Tutorials are mostly not left unfinished because the authors haven&rsquo;t gotten around to finishing them, but more because the question of what exactly to write about is yet to be answered.</p>
<p>On the Clojure Data Cookbook itself, the current work in progress is <a href="https://scicloj.github.io/clojure-data-cookbook/">available here</a> and includes only sections that document stable and established functionality. The goal of making Clojure&rsquo;s data stack accessible and easy to work with is still at the top of my priority list but conversations are underway about what the best way to do that is in the context of the current ecosystem.</p>
<h3 id="ggclj">ggclj</h3>
<p>Another project I&rsquo;ve been poking away at the last couple of months is my implementation of the <a href="https://github.com/kirahowe/ggclj">grammar of graphics in Clojure</a>. Most of my effort here is spent learning more and more about the core concepts of data visualization and how graphics can be represented using a grammar, and then how that grammar could be implemented in an existing programming language. This along with exploring prior implementations in other languages. I have a very rudimentary build process working for transforming an arbitrary dataset into a standardized, graph-able dataset, but nothing yet on the actual graphic rendering. It&rsquo;s very interesting and satisfying but I&rsquo;m not sure how useful. But, in the spirit of heeding Rich&rsquo;s advice from the last Conj about doing projects for fun, I haven&rsquo;t let it go completely. It&rsquo;s still something I&rsquo;d love to get working someday.</p>
<h3 id="reflecting-on-a-year-of-open-source">Reflecting on a year of open source</h3>
<p>As I mentioned above I really enjoyed having the time this year to work on so many interesting projects for the Clojure community. It&rsquo;s so rewarding to see how far we&rsquo;ve come. Even though it feels like there is still so much to do, I think it&rsquo;s important to reflect on the progress we have made and think about how the problems we encountered along the way shaped the path we took.</p>
<p>When I first started working on the Clojure Data Cookbook, there wasn&rsquo;t even a way to publish a book made out of Clojure files. Clerk was brand new and Clay barely existed. Now we can render a pile of Clojure files as a Quarto book! And the need for better documentation has spurred tons of amazing development in this space. The literate programming story in Clojure is better than in any other language.</p>
<p>We&rsquo;ve also made huge strides in connecting the various libraries of the ecosystem together. At the beginning of the year there were many amazing but disconnected libraries. I&rsquo;ve been really inspired by the ideas behind the tidyverse and have been trying to communicate the idea of sharing common idioms and data structures. An ecosystem is starting to emerge in Noj that offers a coherent, standardized, shared paradigm for using all of the amazing tools of the Clojure data ecosystem together. The default stack has been chosen, and serious efforts are now underway toward making these libraries feature complete and interoperable. And I plan to continue working on tutorials, guides, and workshops as much as I can to help promote it all.</p>
<p>I&rsquo;m grateful for all the changes in my life that have taken my time away from working on side projects as much as I used to, like marriage and a great new job, but in many ways I miss doing more of this work and I sincerely hope I find myself in a position to veer off of this &ldquo;standard&rdquo; life track in the future to take a period to focus on this kind of stuff full time again. Even better would be figuring out a way to make it sustainable so that I could continue to do it full time. If you have any idea  how to make that work, let me know :)</p>
<p>It turns out I am not the kind of market-oriented, entrepreneurially-minded person who can turn coding skills into a business that generates steady income for my family. I like contracting and the slow-and-steady community building type of work that constitutes a career in open source, but unfortunately continuing down this road is just not in the cards for me this year. Though I&rsquo;ll never be able to completely resist working on it whenever I can :) Thanks so much for reading this far, and hope to see you around the Clojureverse!  <br></p>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Report 6. Published December 30, 2024</p>
<p>Hi, this is Niki Tonsky and past two month I was working on Fast EDN parser.</p>
<h3 id="fast-ednhttpsgithubcomtonskyfast-edn-a-faster-edn-parser-for-clojure"><a href="https://github.com/tonsky/fast-edn/">Fast EDN</a>, a faster EDN parser for Clojure.</h3>
<p>This project started with a question: why does EDN parse so much slower than JSON? Is there a good reason for that? Turned out, no! That’s how Fast EDN was born.</p>
<ul>
<li>~6× speed improvement over <code>clojure.edn</code>.</li>
<li>Outperforms transit-clj.</li>
<li>More consistent error reporting.</li>
<li>Much cleaner code.</li>
</ul>
<h3 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed-clojure-support-for-sublime-text-4"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>, Clojure support for Sublime Text 4:</h3>
<ul>
<li>New <code>Select Topmost Form</code> command</li>
<li>New <code>Align Cursors</code> command</li>
<li>Fixed evaluation of <code>()</code> (closes <a href="https://github.com/tonsky/Clojure-Sublimed/issues/131">131</a>)</li>
<li>Add <code>|</code> to the allowed symbols chars <a href="https://github.com/tonsky/Clojure-Sublimed/issues/132">132</a></li>
<li>Clarified some symbol/keyword edge cases in syntax</li>
<li>Color scheme adjustments</li>
</ul>
<h3 id="sublime-executorhttpsgithubcomtonskysublime-executor-executable-runner-for-sublime-text"><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>, executable runner for Sublime Text:</h3>
<ul>
<li>Put 0.2 sec limit on <code>find_executables</code>. Large project shouldn’t be a problem anymore</li>
</ul>
<p><strong>Misc:</strong></p>
<ul>
<li><a href="https://github.com/clojure-goes-fast/clj-async-profiler/pull/42">New icons</a> for <a href="https://github.com/clojure-goes-fast/clj-async-profiler/">clj-async-profiler</a></li>
<li><a href="https://github.com/clj-commons/virgil/pull/39">Throw on fail</a> for <a href="https://github.com/clj-commons/virgil">virgil</a></li>
</ul>
<p>Both of these libraries were crucial in developing Fast EDN, so I contributed back.</p>
<p>And the most important news of all. <a href="https://tonsky.me/">tonsky.me</a>, my personal website:</p>
<ul>
<li>Now has a winter theme!</li>
</ul>
<p>Overall, what a year! Thanks Clojurists Together and my patrons for making it possible to work almost entire year on open-source full time. Best year of my life (so far!)</p>
<p>Happy New Year everyone!  <br></p>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Report 6. Published  January 1, 2025</p>
<p>Reflected on my year of working with Open Source. Having authored tens of Clojure Open Source Libraries makes you look things from another angle. Instead of just adding more (fun) features, I dedicated time to go through all old issues and open PRs from 2024 for the <a href="https://github.com/topics/metosin-active">active</a> and <a href="https://github.com/topics/metosin-stable">stable</a> libraries where there is no clear lead developer or it&rsquo;s me.</p>
<p>Closed a lot of support tickets, answered questions and reviewed and merged PRs. Thanks to all contributors and sorry to not doing this earlier!</p>
<p>Some releases:</p>
<h3 id="malli-0170">Malli 0.17.0</h3>
<ul>
<li>Don&rsquo;t output <code>:definitions nil</code> in swagger. <a href="https://github.com/metosin/malli/issues/1134">#1134</a></li>
<li><strong>BREAKING</strong>: <code>:gen/fmap</code> property requires its schema to create a generator.
<ul>
<li>previous behavior defaulted to a <code>nil</code>-returning generator, even if the schema doesn&rsquo;t accept <code>nil</code></li>
<li>use <code>:gen/return nil</code> property to restore this behavior</li>
</ul>
</li>
<li>Support decoding map keys into keywords for <code>[:map</code> schemas in <code>json-transformer</code> <a href="https://github.com/metosin/malli/issues/1135">#1135</a></li>
<li><code>:not</code> humanizer <a href="https://github.com/metosin/malli/pull/1138">#1138</a></li>
<li>FIX: <code>:seqable</code> generates <code>nil</code> when <code>:min</code> is greater than 0 <a href="https://github.com/metosin/malli/issues/1121">#1121</a></li>
<li>FIX: <code>malli.registry/{mode,type}</code> not respected in Babashka <a href="https://github.com/metosin/malli/issues/1124">#1124</a></li>
<li>FIX: <code>:float</code> accepts doubles but never generates them <a href="https://github.com/metosin/malli/issues/1132">#1132</a></li>
<li>FIX: <code>:float</code> missing humanizer <a href="https://github.com/metosin/malli/issues/1122">#1122</a></li>
<li>Updated dependencies:</li>
</ul>
<pre><code>fipp/fipp '0.6.26' to '0.6.27'
</code></pre><h3 id="ring-http-response-095">Ring-http-response 0.9.5</h3>
<ul>
<li>Fix pre-expr syntax <a href="https://github.com/metosin/ring-http-response/pull/34">#34</a></li>
<li>updated dependencies:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[ring/ring-core <span style="color:#e6db74">&#34;1.13.0&#34;</span>] is available but we use <span style="color:#e6db74">&#34;1.12.2&#34;</span>
</code></pre></div><h3 id="going-forward-to-2025">Going Forward to 2025</h3>
<p>Yes, it&rsquo;s already 1.1! I did not apply for Clojurists Together funding as I didn&rsquo;t have the time I wished for to work on Open Source. Not going anywhere, but need to figure out a way to continue the work in a sustaineable way. Cheers.</p>
<h3 id="something-else">Something Else</h3>
<p>Vegan Pizza from Metosin <a href="https://en.wikipedia.org/wiki/Pikkujoulu">pikkujoulu</a>.</p>
<p><img width="1728" alt="pizza" src="https://gist.githubusercontent.com/ikitommi/8c904bfaa17f3871f80d3e20ea84ebb7/raw/fefaf3a6befa7966c557197f2ecd5cbfe7e2dbfa/pizza.jpg">  <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>Report 6. Published December 31, 2024</p>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<p>Hey folks, it&rsquo;s the end of the year again! 🍾🎉</p>
<p>Will keep today&rsquo;s update short-</p>
<p>This was another busy year for open source work, with almost 50 public <a href="https://www.taoensso.com/news#2024">releases</a> (🫣). The biggest can be easily seen on my <a href="https://www.taoensso.com/roadmap/2024">2024 roadmap</a>.</p>
<p>The headline focus was <a href="https://www.taoensso.com/telemere">Telemere</a> - a modern rewrite of <a href="https://www.taoensso.com/timbre">Timbre</a> that offers an improved API to cover traditional logging, structured logging, tracing, basic performance measurement, and more.</p>
<p>That&rsquo;s been a lot of ongoing work - getting things polished for v1 final. I&rsquo;m pretty happy with the present state: <a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0-RC2">v1 RC2</a> was recently released, and I expect that to become v1 final in January 🎉</p>
<p>The agenda for next year (2025) currently includes:</p>
<ul>
<li><a href="https://www.taoensso.com/telemere">Telemere</a> v1 final</li>
<li><a href="https://www.taoensso.com/tempel">Tempel</a> v1 final (sorry for the delay on this!)</li>
<li><a href="https://www.taoensso.com/sente">Sente</a> v1.21 (with lots of <a href="https://github.com/taoensso/sente/issues/456">planned improvements</a>)</li>
<li><a href="https://www.taoensso.com/tufte">Tufte</a> v3 (incl. sharing Telemere&rsquo;s core)</li>
<li><a href="https://www.taoensso.com/truss">Truss</a> v2 (incl. improved integration with Telemere)</li>
<li>Continued long-term work on <a href="https://www.taoensso.com/carmine">Carmine</a> v4 (currently in early alpha)</li>
</ul>
<p>Looking forward to it :-)</p>
<p>As usual, my up-to-date roadmap will be available <a href="https://www.taoensso.com/roadmap">here</a> once it&rsquo;s ready.</p>
<p>Thank you everyone, see you next year! 👋🫶  <br></p>
<hr>
<h2 id="ambrose-bonnaire-sergeant-malli">Ambrose Bonnaire-Sergeant: Malli</h2>
<p>Report 3 (Q3 2024). Published January 14, 2025</p>
<p>This is the final of three reports in the project to extend Malli with constraints.</p>
<p><a href="https://www.clojuriststogether.org/news/sept.-and-oct.-2024-short-term-project-updates/#malli-ambrose-bonnaire-sergeant">Report 1</a><br>
<a href="https://www.clojuriststogether.org/news/nov.-2024-short-term-project-updates/#malli-ambrose-bonnaire-sergeant">Report 2</a></p>
<p>Thanks to everyone who made this project possible.</p>
<h3 id="background">Background</h3>
<p>This project aims to improve the expressiveness of Malli schemas, in particular
to improve the ability to specify complex invariants about the keysets of a <code>:map</code>
schema.</p>
<h3 id="progress">Progress</h3>
<ul>
<li>open PR&rsquo;s
<ul>
<li><a href="https://github.com/metosin/malli/pull/1161">Introduce schemas for map key constraints</a>
<ul>
<li>Some promising feedback on slack:
<ul>
<li>&ldquo;This is amazing. The virtue of being &ldquo;open to changes&rdquo; often results in this kind of implicit rules. I think I&rsquo;m going to use this a lot once this PR is merged.&rdquo;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>merged PR&rsquo;s
<ul>
<li><a href="https://github.com/metosin/malli/pull/1138">:not humanizer</a></li>
<li><a href="https://github.com/metosin/malli/pull/1141">don&rsquo;t generate nil if :seqable is non-empty</a></li>
<li><a href="https://github.com/metosin/malli/pull/1142">add :float humanizer</a></li>
<li><a href="https://github.com/metosin/malli/pull/1143">align :float and :double generators</a></li>
<li><a href="https://github.com/metosin/malli/pull/1144">refactor generator ns with -never-gen helpers</a>
<ul>
<li>malli.generator: 646 =&gt; 557 LOC</li>
</ul>
</li>
<li><a href="https://github.com/metosin/malli/pull/1147">Propagate options to 1-child -reducing, disallow 0-child</a></li>
</ul>
</li>
</ul>
<p>In my previous report, I speculated whether <code>:map</code> could be made more expressive
without changing the <code>:map</code> schema itself or any new features to Malli. I think
I&rsquo;ve now achieved that.</p>
<p>I&rsquo;ve proposed adding six new schemas to Malli that are designed to be combined
using <code>[:and [:map ...] S1 S2 S3 ...]</code>. Some custom code is needed to support
humanization.</p>
<p>If this gets merged, the next step is to improve the generator for <code>:and</code>.
My original hunch to avoid <code>:and</code> was because of its probabilistic generator, which
inspired the initial design to add constraints to the <code>:map</code> schema itself
to avoid the problem altogether.</p>
<p>Throughout this project, I designed a more accurate <code>:and</code> generator that I will
work on next. The basic strategy to generate <code>[:and S T]</code> will be to generate <code>S</code>
but propagate <code>T</code> as extra information to the <code>S</code> generator in a canonical form.
This requires a backwards-compatible update to each schema&rsquo;s generator to make
use of this information before returning the generator.</p>
<p>The more exciting part is the representation used to improve generators could be
reused for other tasks like simplifying schemas and optimizing validators.</p>
<h3 id="demo">Demo</h3>
<p>I will end this report with a demo of the proposed schemas from
<a href="https://github.com/metosin/malli/pull/1161">#1161: Introduce schemas for map key constraints</a>.</p>
<p>The <code>:and</code> schema can be used to constrain an existing schema to be more specific.<br>
In this section we show how to constrain a <code>:map</code> schema with more specific keys.</p>
<p>The schema <code>[:has K]</code> asserts the key <code>K</code> must be present.<br>
This is the main building block for key constraints that will be combined
with other schemas.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span>
    [<span style="color:#e6db74">:and</span> <span style="color:#e6db74">:map</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:x</span>]]
    {}))
<span style="color:#75715e">; =&gt; {:x [&#34;missing required key&#34;]}</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span>
    [<span style="color:#e6db74">:and</span> <span style="color:#e6db74">:map</span> [<span style="color:#e6db74">:has</span> nil nil] [<span style="color:#e6db74">:has</span> []]]
    {}))
<span style="color:#75715e">; =&gt; [&#34;missing required key&#34;]</span>
</code></pre></div><p>The <code>:or</code> schema asserts that at least one of its children is satisfied.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; at least one padding direction must be provided</span>
(<span style="color:#66d9ef">def </span>Padding
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:top</span> {<span style="color:#e6db74">:optional</span> true} number?]
    [<span style="color:#e6db74">:bottom</span> {<span style="color:#e6db74">:optional</span> true} number?]
    [<span style="color:#e6db74">:left</span> {<span style="color:#e6db74">:optional</span> true} number?]
    [<span style="color:#e6db74">:right</span> {<span style="color:#e6db74">:optional</span> true} number?]]
   [<span style="color:#e6db74">:or</span>
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:top</span>]
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:bottom</span>]
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:left</span>]
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:right</span>]])

(<span style="color:#a6e22e">m/validate</span> Padding {<span style="color:#e6db74">:left</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:right</span> <span style="color:#ae81ff">10</span> <span style="color:#e6db74">:up</span> <span style="color:#ae81ff">25</span> <span style="color:#e6db74">:down</span> <span style="color:#ae81ff">50</span>}) <span style="color:#75715e">;=&gt; true</span>
(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> Padding {}))
<span style="color:#75715e">; =&gt; {:top [&#34;missing required key&#34;],</span>
<span style="color:#75715e">;     :bottom [&#34;missing required key&#34;],</span>
<span style="color:#75715e">;     :left [&#34;missing required key&#34;],</span>
<span style="color:#75715e">;     :right [&#34;missing required key&#34;]}</span>
</code></pre></div><p>The <code>:xor</code> schema requires exactly one of its children to be satisfied.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; :mvn/version or :git/sha must be provided, but not both</span>
(<span style="color:#66d9ef">def </span>GitOrMvn
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:mvn/version</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
    [<span style="color:#e6db74">:git/sha</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]]
   [<span style="color:#e6db74">:xor</span>
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:mvn/version</span>]
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:git/sha</span>]]])

(<span style="color:#a6e22e">m/validate</span> GitOrMvn {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>

(<span style="color:#a6e22e">m/validate</span> GitOrMvn {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span> <span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;123&#34;</span>})) <span style="color:#75715e">; =&gt; false</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> GitOrMvn
             {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>
              <span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;123&#34;</span>}))
<span style="color:#75715e">; =&gt; [&#34;should not have key :git/sha&#34;]</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> GitOrMvn
             {}))
<span style="color:#75715e">; =&gt; {:mvn/version [&#34;missing required key&#34;],</span>
<span style="color:#75715e">;     :git/sha [&#34;missing required key&#34;]}</span>
</code></pre></div><p>The <code>:iff</code> schema requires either all or none of its children to be satisfied.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; either both :user and :pass are provided, or neither</span>
(<span style="color:#66d9ef">def </span>UserPass
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:user</span> {<span style="color:#e6db74">:optional</span> true} string?]
    [<span style="color:#e6db74">:pass</span> {<span style="color:#e6db74">:optional</span> true} string?]]
   [<span style="color:#e6db74">:iff</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:user</span>] [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:pass</span>]]])

(<span style="color:#a6e22e">m/validate</span> UserPass {}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> UserPass {<span style="color:#e6db74">:user</span> <span style="color:#e6db74">&#34;a&#34;</span> <span style="color:#e6db74">:pass</span> <span style="color:#e6db74">&#34;b&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> UserPass {<span style="color:#e6db74">:user</span> <span style="color:#e6db74">&#34;a&#34;</span>}))
<span style="color:#75715e">; =&gt; {:pass [&#34;missing required key&#34;]}</span>
</code></pre></div><p>The <code>:implies</code> schema is satisfied if either its first child is <em>not</em> satisfied or
all of its children are satisfied.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; if :git/tag is provided, then so should :git/sha</span>
(<span style="color:#66d9ef">def </span>TagImpliesSha
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:git/sha</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
    [<span style="color:#e6db74">:git/tag</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]]
   [<span style="color:#e6db74">:implies</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:git/tag</span>] [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:git/sha</span>]]])

(<span style="color:#a6e22e">m/validate</span> TagImpliesSha {<span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;abc123&#34;</span>}) <span style="color:#75715e">;=&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> TagImpliesSha {<span style="color:#e6db74">:git/tag</span> <span style="color:#e6db74">&#34;v1.0.0&#34;</span> <span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;abc123&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> TagImpliesSha {<span style="color:#e6db74">:git/tag</span> <span style="color:#e6db74">&#34;v1.0.0&#34;</span>}))
<span style="color:#75715e">; =&gt; {:git/sha [&#34;missing required key&#34;]}</span>
</code></pre></div><p>The <code>:disjoint</code> schema is similar to <code>:xor</code> but also permits zero schemas to match.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; :mvn/* and :git/* keys should not coexist</span>
(<span style="color:#66d9ef">def </span>SeparateMvnGit
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:mvn/version</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
    [<span style="color:#e6db74">:git/sha</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
    [<span style="color:#e6db74">:git/tag</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
    [<span style="color:#e6db74">:git/url</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]]
   [<span style="color:#e6db74">:disjoint</span>
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:mvn/version</span>]
    [<span style="color:#e6db74">:or</span>
     [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:git/sha</span>]
     [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:git/url</span>]
     [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:git/tag</span>]]]])

(<span style="color:#a6e22e">m/validate</span> SeparateMvnGit {}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> SeparateMvnGit {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> SeparateMvnGit {<span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> SeparateMvnGit {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span> <span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;abc123&#34;</span>}) <span style="color:#75715e">; =&gt; false</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> SeparateMvnGit
             {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>
              <span style="color:#e6db74">:git/sha</span> <span style="color:#e6db74">&#34;abc123&#34;</span>}))
<span style="color:#75715e">; =&gt; [&#34;should not have key :git/sha&#34;]</span>
</code></pre></div><p>For multiple sets of disjoint keys, use multiple <code>:disjoint</code> schemas.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; cannot hold :up + :down or :left + :right</span>
(<span style="color:#66d9ef">def </span>DPad
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:down</span> {<span style="color:#e6db74">:optional</span> true} [<span style="color:#e6db74">:=</span> <span style="color:#ae81ff">1</span>]]
    [<span style="color:#e6db74">:left</span> {<span style="color:#e6db74">:optional</span> true} [<span style="color:#e6db74">:=</span> <span style="color:#ae81ff">1</span>]]
    [<span style="color:#e6db74">:right</span> {<span style="color:#e6db74">:optional</span> true} [<span style="color:#e6db74">:=</span> <span style="color:#ae81ff">1</span>]]
    [<span style="color:#e6db74">:up</span> {<span style="color:#e6db74">:optional</span> true} [<span style="color:#e6db74">:=</span> <span style="color:#ae81ff">1</span>]]]
   [<span style="color:#e6db74">:disjoint</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:down</span>] [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:up</span>]]
   [<span style="color:#e6db74">:disjoint</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:left</span>] [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:right</span>]]])

(<span style="color:#a6e22e">m/validate</span> DPad {}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:up</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:down</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:right</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:left</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:up</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:left</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:down</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:left</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:up</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:right</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> DPad {<span style="color:#e6db74">:down</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:right</span> <span style="color:#ae81ff">1</span>}) <span style="color:#75715e">; =&gt; true</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> DPad {<span style="color:#e6db74">:up</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:down</span> <span style="color:#ae81ff">1</span>}))
<span style="color:#75715e">; =&gt; [&#34;should not have key :up&#34;]</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> DPad {<span style="color:#e6db74">:left</span> <span style="color:#ae81ff">1</span> <span style="color:#e6db74">:right</span> <span style="color:#ae81ff">1</span>}))
<span style="color:#75715e">; =&gt; [&#34;should not have key :right&#34;]</span>
</code></pre></div><p>In this example, we nest <code>:and</code> in <code>:or</code> to assert that either a secret or
user/pass must be provided. The <code>:disjoint</code> schema is used to ensure
both are not provided. Even if we used <code>:xor</code> instead of <code>:or</code>, it
would still be legal to provide <code>{:secret &quot;1234&quot; :user &quot;user&quot;}</code> without
this additional constraint.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>SecretOrCreds
  [<span style="color:#e6db74">:and</span>
   [<span style="color:#e6db74">:map</span>
    [<span style="color:#e6db74">:secret</span> {<span style="color:#e6db74">:optional</span> true} string?]
    [<span style="color:#e6db74">:user</span> {<span style="color:#e6db74">:optional</span> true} string?]
    [<span style="color:#e6db74">:pass</span> {<span style="color:#e6db74">:optional</span> true} string?]]
   [<span style="color:#e6db74">:or</span>
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:secret</span>]
    [<span style="color:#e6db74">:and</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:user</span>] [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:pass</span>]]]
   [<span style="color:#e6db74">:disjoint</span>
    [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:secret</span>]
    [<span style="color:#e6db74">:or</span> [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:user</span>] [<span style="color:#e6db74">:has</span> <span style="color:#e6db74">:pass</span>]]]])

(<span style="color:#a6e22e">m/validate</span> SecretOrCreds {<span style="color:#e6db74">:secret</span> <span style="color:#e6db74">&#34;1234&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>
(<span style="color:#a6e22e">m/validate</span> SecretOrCreds {<span style="color:#e6db74">:user</span> <span style="color:#e6db74">&#34;user&#34;</span> <span style="color:#e6db74">:pass</span> <span style="color:#e6db74">&#34;hello&#34;</span>}) <span style="color:#75715e">; =&gt; true</span>

(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> SecretOrCreds {<span style="color:#e6db74">:user</span> <span style="color:#e6db74">&#34;user&#34;</span>}))
<span style="color:#75715e">; =&gt; {:secret [&#34;missing required key&#34;], :pass [&#34;missing required key&#34;]}</span>

<span style="color:#75715e">;; combining :or with :disjoint helps enforce this case</span>
(<span style="color:#a6e22e">me/humanize</span>
  (<span style="color:#a6e22e">m/explain</span> SecretOrCreds {<span style="color:#e6db74">:secret</span> <span style="color:#e6db74">&#34;1234&#34;</span> <span style="color:#e6db74">:user</span> <span style="color:#e6db74">&#34;user&#34;</span>}))
<span style="color:#75715e">; =&gt; [&#34;should not have key :user&#34;]</span>
</code></pre></div><br>
<hr>
<h2 id="daniel-slutsky-scicloj">Daniel Slutsky: SciCloj</h2>
<p>Report 3 (Q3 2024). Published December 19, 2024.</p>
<p>The <a href="https://www.clojuriststogether.org/">Clojurists Together</a> organization has decided <a href="https://www.clojuriststogether.org/news/q3-2024-funding-announcement/">to sponsor</a> Scicloj community building for Q3 2024, as a project by Daniel Slutsky. This is the second time the project has been selected this year. Here is Daniel&rsquo;s last update for this period.</p>
<p>This overview of November&rsquo;s work is extended by a few recent updates from the first half of December.</p>
<p>Comments and ideas would help. :pray:</p>
<h3 id="november-2024-1">November 2024</h3>
<p><a href="https://scicloj.github.io/">Scicloj</a> is a Clojure group developing a stack of tools and libraries for data science. Alongside the technical challenges, community building has been an essential part of its efforts since the beginning of 2019. Our current main community-oriented goal is making the existing data science stack easy to use through the maturing of the Noj library, mentioned below. In particular, we are working on example-based documentation, easy setup, and recommended workflows for common tasks.</p>
<p>All these, and the tools to support them, grow organically, driven by real-world use cases.</p>
<p>I serve as a community organizer at Scicloj, and this project was accepted for Clojurists Together funding in 2024 Q1 &amp; Q3. I also receive regular funding through Github Sponsors, mostly from Nubank.</p>
<p>As some parts of November&rsquo;s work have only matured during the beginning of December, I am writing this report a couple of weeks late. It overviews my involvement during November, the first half of December, and then comments about the proposed directions for the near future.</p>
<p>I had 31 meetings during November and 25 meetings during the first half of December. Most of them were one-on-one meetings for open-source mentoring or similar contexts.</p>
<p>All the projects mentioned below are done in collaboration with others. I will mention at least a few of the people involved.</p>
<h3 id="november-2024-and-early-december-highlights">November 2024 and early December highlights</h3>
<h3 id="design-discussions">Design discussions</h3>
<p>This has been a thoughtful period in <a href="https://scicloj.github.io/docs/community/chat/">the Clojurians Zulip chat</a>. We faced a few questions regarding how we organize functionality across libraries and went through a careful thinking process to reach a common ground of understanding. A lot of the details shared below are the fruit of those discussions.</p>
<h3 id="nojhttpssciclojgithubionoj"><a href="https://scicloj.github.io/noj/">Noj</a></h3>
<p>The Noj library is the entry point to data science with Clojure, collecting a stack of relevant libraries. During this period, it was officially announced as Beta stage. We kept extending it and mostly worked on documentation. Carsten Behring kept improving the documentation workflow, partially automating it, and creating extensive documentation for a few major Noj components. I also took part in documentation and in helping other community members contribute a few drafts.</p>
<h3 id="tableplothttpssciclojgithubiotableplot"><a href="https://scicloj.github.io/tableplot/">Tableplot</a></h3>
<p>Tableplot, the plotting library based on the <a href="https://vita.had.co.nz/papers/layered-grammar.html">layered grammar of graphics</a> idea, was one of my main foci of development. I implemented quite a few additional types of plots and control parameters and put a lot of work into the documentation reference.</p>
<h3 id="tablemathhttpssciclojgithubiotablemath"><a href="https://scicloj.github.io/tablemath/">Tablemath</a></h3>
<p>Tablemath is one result of our recent design discussions. It is a new library for math and statistics that composes well with <a href="https://github.com/techascent/tech.ml.dataset">tech.ml.dataset</a> and <a href="https://scicloj.github.io/tablecloth">Tablecloth</a> datasets and uses the functionality of <a href="https://github.com/generateme/fastmath">Fastmath</a>. Tablemath is highly inspired by <a href="https://www.r-project.org/">R</a> and its packages and is intended to compose well with <a href="https://scicloj.github.io/tableplot/">Tableplot</a> layered plotting.
During this period, I released an initial version after exploring a few directions.</p>
<h3 id="clayhttpssciclojgithubioclay"><a href="https://scicloj.github.io/clay/">Clay</a></h3>
<p>Clay, the REPL-friendly notebook and data visualization tool, received a few updates from other community members. On my side, I explored the different ways it consumes JS and CSS dependencies. We want to make this part more modular for various use cases. At the moment, I am struggling with a few technical difficulties.</p>
<h3 id="kindly-renderhttpsgithubcomsciclojkindly-render"><a href="https://github.com/scicloj/kindly-render">Kindly-render</a></h3>
<p>Kindly-render is a tool-agnosic implementation of the <a href="https://scicloj.github.io/kindly/">Kindly</a> data visualization standard. Timothy Pratley kept developing it, and it looks very promising. My involvement was not intensive, except for a few joint coding sessions and reviews of the code.</p>
<h3 id="scicloj-open-source-mentoringhttpssciclojgithubiodocscommunitygroupsopen-source-mentoring"><a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">Scicloj open-source mentoring</a></h3>
<p>In this period, we continued the collaboration of quite a few mentees and the current four mentors, including myself. To focus on progress with currently ongoing projects, we did slow down the growth of the project and could only accept a few new mentees.</p>
<h3 id="meeting-new-community-members">Meeting new community members</h3>
<p>In the last few weeks, I did meet a few new community members: Clojurians who wish to get involved in data science and people of scientific or data background who wish to get involved in Clojure. There is a good momentum in adopting the Scicloj toolkit for various needs. With a few of the new friends, I started meeting more or less regularly and exploring their concrete use cases.</p>
<h3 id="clojure-in-academia">Clojure in Academia</h3>
<p>Following an initiative of Thomas Clark, we started an active exploration of pathways to make Clojure more present in academia. I reached out to about a dozen people who are active in academia and known to be involved in Clojure and scheduled a couple of meetings to discuss possible directions. There has been a warm response from most of the relevant people, who expressed their willingness to help explore this direction.</p>
<p>Three main directions were proposed: (1) Working on academic papers to discuss technical aspects of Clojure&rsquo;s scientific stack. (2) Collaborating with researchers on specific use cases of Clojure. (3) Demonstrating the potential of Clojure in academic teaching.</p>
<p>The teaching perspective, which was proposed by Blaine Mooers, will receive the highest priority in the short term.</p>
<p>As a first step, we are considering organizing an online conference to make one or more of the above directions more visible and encourage further interest.</p>
<h3 id="tutorial-meetings">Tutorial meetings</h3>
<p>During our work on documenting Noj, we experimented with various workflows of writing tutorials together. Recently, we converged on a format that is working. We meet quite often and write tutorial drafts together. The same draft will typically be handled by different people in different meetings. Each time, we review everything so that the session is self-contained. This way, more people learn about topics they care about, and the content we write gets to be reviewed by more people and more perspectives.</p>
<h3 id="linear-algebra-meetings">Linear Algebra meetings</h3>
<p>The weekly linear algebra meetings keep happening every week. They typically go by the tutorial format mentioned above.</p>
<h3 id="website">Website</h3>
<p>This period has been a usual period in terms of website maintenance.</p>
<h3 id="real-world-data-group">real-world-data group</h3>
<p>The <a href="https://scicloj.github.io/docs/community/groups/real-world-data/">real-world-data group</a> is a space for Clojure data practitioners to share their experiences. It keeps going, meeting every two weeks. In the three meetings we had in November and the one we had in December so far, we mainly discussed the topics mentioned above in this report, as well as a few work experiences of group members.</p>
<h2 id="near-term-goals">Near term goals</h2>
<h3 id="noj">Noj</h3>
<p>In the near future, we should bring the Noj documentation to a state that is good enough to be clear and welcoming to new users.</p>
<h3 id="tablemath">Tablemath</h3>
<p>Tablemath will probably be the main experimental project on my agenda. The main goals are to combine the underlying libraries (Fastmath, dtype-next, tech.ml.dataset, Tablecloth) to benefit from the advantages of each of them in terms of ergonomics as well as performance and to provide a user-friendly API inspired by R. (2)</p>
<h3 id="clojure-in-academia-1">Clojure in academia</h3>
<p>This project is still in its very early stages. We should explore various directions and carefully pick those which might be promising.</p>
<h3 id="tooling">Tooling</h3>
<p>I will join Timothy Pratley on the goal of helping different tools support the Kindly standard. Cursive, Calva, Quarto, and Clojupyter are a few of the relevant candidates.  <br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Thanks..and more</title>
      <link>https://www.clojuriststogether.org/news/thanks..and-more/</link>
      <pubDate>Sun, 29 Dec 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/thanks..and-more/</guid>
      <description>$254,000 in project funding - 30 grants, 24 developers</description>
      <content:encoded><![CDATA[<p>As 2024 comes to a close we want to reach out and thank you for supporting Clojure, open-source, and the Clojurists Together community.</p>
<h4 id="weve-been-able-to-accomplish-a-lot-this-year-with-your-support">We’ve been able to accomplish a lot this year with your support.</h4>
<p>In 2024, we funded a total of $254,000 of projects. 17 developers completed 22 shorter-term projects ($110,000 USD). 8 developers received a monthly stipend for the year ($144,000 USD in long-term funding). Since 2018, Clojurists Together has awarded more than $1.1 million to 86 developers working on more than 142 projects.</p>
<p>Your input on our quarterly surveys is critical to ensuring that we are funding work that is needed, valued, and adopted by the community at large. 26% of members participate every quarter.</p>
<p>33% of members participated in the new process for selecting the developers to receive 2025 annual funding. Thank you for reviewing the proposals and voting!</p>
<p>We appreciate your subscription to our regular news and updates dispatches - as we believe it encourages wider use of the tools and resources of the developers we have funded - strengthening and advancing the open-source and Clojure community. For those of you who subscribe but are not yet members, <a href="https://www.clojuriststogether.org/developers/">you can always join the voting community for as little as $5 per month.</a></p>
<p>We were able to sponsor and attend the Heart of Clojure conference in Belgium in September - and it was a pleasure to talk with many of you again in person after a long CoVid hiatus.</p>
<h4 id="the-developers-work-we-fund-is-highly-valued---and-used-daily">The developer’s work we fund is highly valued - and used daily.</h4>
<p>In addition to requesting specific tools and improvements, we have heard a consistent call for better documentation (content, presentation, and organization) and more support for engaging and supporting new Clojure users. This year, we received and funded several proposals that focused on these needs and will continue to encourage work in these areas.</p>
<p><img src="image-3.png" alt="alt text"></p>
<h4 id="short-term-projects-funded-in-2024">Short-Term Projects Funded in 2024</h4>
<p><strong>Q1 2024:</strong> CIDER, clojure-lsp, Instaparse, Jank, scicloj, sitefox, UnifyBio, Wolframite</p>
<p><strong>Q2 2024:</strong> Clj-kondo, babashka, SCI, nbb, squint/cherry, Clj-merge tool, compojure-api, Enjure, Jank, Lost in Lambduhhs podcast, Plexus</p>
<p><strong>Q3 2024:</strong> clj-Nix, Clojure Goes Fast, Jank, Kushi, Malli, ScioCloj, Standard Clojure Style</p>
<p><strong>2024 developers receiving annual funding:</strong> Bozhidar Batsov, Michiel Borkent, Thomas Heller, Kira McLean, Nikita Prokopov, Tommi Reiman, Peter Taoussanis, Toby Crawley.</p>
<h4 id="fun-facts-and-thank-yous">Fun Facts and Thank You&rsquo;s</h4>
<p>We are truly an international group bringing a wide range of experience. From Q1 2022 to Q3 2024, we funded developers working in 20 countries including Austria, Belgium, Brazil, Bulgaria, Canada, Denmark, England, Finland, France, Germany, Israel, Lithuania, Netherlands, Norway, Poland, Serbia, Spain, Sweden, UK and the US.</p>
<p><strong>This staggering amount of work has benefited our members and the broader Clojurist community.</strong><br>
A thanks goes out to all the developers for their commitment and contributions to the community over the last 7 years: Adam Helins, Alexander Oloo, Ambrose Bonnaire-Sergeant, Arne Brasseur, Ashima Panjwani, Baptiste Dupuch, Benjamin Kamphaus, Ben Brinckerhoff, Bobbi Tower, Bozhidar Batsov, Brandon Ringe, Bruce Hauman, Chris Badahdah, Chris McCormick, Charles Comstock, Chris Oakman, Christian Johansen, Christophe Grand, Dainius Jocas, Daniel Higginbotham, Daniel Slutsky,Danny Freeman, David Levy, David Nolen, Dragan Duric, Eric Dallo, Ethan Miller, Gert Goet, Grodziski, Henry Widd, Iizuka Masashi, Isaac Johnston, Jack Rusher, Jacob O’Bryant, James Reeves, Janet Carr, Jeaye Wilkerson, Jeremiah Coyle, John Collins, John Stevenson, Joakim Tengstrand, Joel Holdbrooks, José Luis Lafuente, Juho Teperi, Karol Wójcik, Kira McLean, Konrad Kühne, Kury Harringer, L. Jordan Miller, Lee Hinman, Lukas Domagala, Mark Engelberg, Martin Kavalar, Matthew Davidson, Matthew Huebert, Matthew Ratzke, Michael Sappler, Michiel Borkent, Mike Fikes, Mitesh Shah, Nikita Prokopov, Oleksandr Yakushev, Oleksii Kachaiev, Oliver Caldwell, Othman Azil, Peter Stromberg, Peter Taoussanis, Rafael Krzyważnia, Sam Ritchie, Savo Djuric, Sean Corfield, Sebastian Zartner, Thomas Clark, Thomas Heller, Tim Pope, Toby Crawley, Tommi Jalkanen, Tommi Reiman, VEMV, Vladislav Protsenko, William Acton, Zach Oakes, Žygis Medelis, and the team at Gaiwan.</p>
<p>Finally, a shout-out to the companies and organizations who have supported our work throughout the year and most for many years. They believe in Open Source development and have made a commitment to Clojure as an important tool for their product, service, and organizational projects. If your company might consider becoming a sponsoring member, please contact Daniel Compton at <a href="mailto:daniel@clojuriststogether.org">daniel@clojuriststogether.org</a> to explore further.</p>
<p><img src="image-5.png" alt="alt text"></p>
<p><strong>And a shout out to the Into, Cons and Assoc Members who Contributed in 2024!</strong><br>
bevuta IT GmbH, QA Wolf, Inc, Jepsen, Xcoo, Sharetribe, Halal Booking, Basil, Cognician, Biotz SL, Matrix Operations, Strategic Blue, Eric Normand, Nubizzi, Bloom Ventures, Mastodon C, Ardoq AS, Condense, Mediquest, Vane GmbH, Codesmith GmbH, ELiT Ltd. Thorax informatieprojecten &amp; advies, Fern Flower Labs, Joshua Miller and Revenue Share member Jacek Schae (Learn Reagent, Learn re-frame).</p>
<p><strong>&hellip; and another thank you to all the 2024 Contributing Members.</strong> <a href="https://www.clojuriststogether.org/members/">All of you make this work possible!</a></p>
<p>Let’s join in celebrating this wonderful community - and hoping for peace in the New Year.<br>
lvh, Maria, Daniel, Heather, Felix, Max, and Lorelai (Clojurists Together Board), Kathy (Program Manager).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together 2025 Long-Term Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-2025-long-term-funding-announcement/</link>
      <pubDate>Tue, 10 Dec 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-2025-long-term-funding-announcement/</guid>
      <description>Clojurists Together is funding 5 developers $1.5k/month for 12 months</description>
      <content:encoded><![CDATA[<p>The votes are in!! Clojurists Together members have voted to to fund 5 developers $1.5k/month for 12 months ($90k USD total!). We&rsquo;re pleased to announce the following developers/teams who will be funded:</p>
<p><a href="#michiel-borkent">Michiel Borkent</a><br>
<a href="#eric-dallo">Eric Dallo</a><br>
<a href="#dragan-djuric">Dragan Djuric</a><br>
<a href="#peter-taoussanis">Peter Taoussanis</a><br>
<a href="#oleksandr-yakushev">Oleksandr Yakushev</a></p>
<p>We are very excited to see what these developers will do over the next year. They will share updates of what they&rsquo;ve been working on, and we&rsquo;ll post and email them as part of  our regular updates. You&rsquo;ll find summaries below of what each of these developers plan to work on (although they are just a starting points and they&rsquo;re free to change their plans as they see fit). If you want more detail, you can refer back to the proposals submitted on our <a href="https://www.clojuriststogether.org/news/vote-on-2025-long-term-funding-applications/">website</a>.</p>
<p>Thanks to the all of you - the Members -  who took the time to review the applications and make the difficult decision to select just 5 from many excellent proposals. Congratulations are in order to Michiel, Eric, Dragan, Peter, and Oleksandr! For everyone else who submitted their projects, there will be more grant opportunities in 2025 - so keep posted.</p>
<h3 id="michiel-borkent">Michiel Borkent</h3>
<p>My main projects are clj-kondo, babashka / SCI, and squint/cherry. I will develop new features, specified below per project. As usual I&rsquo;ll also work on ongoing maintenance and offering support on Slack and Github.</p>
<h3 id="eric-dallo">Eric Dallo</h3>
<p>I want to dedicate more time on big features for anything related to the Clojure LSP ecosystem, this includes: clojure-lsp and all integrations with editors, intellij, calva, lsp-mode, and so on.
Also, I want to improve the IntelliJ experience to be as good as Cursive, improving clojure-repl-intellij and clojure-lsp-intellij projects so we can have good options for LSP in any editors.</p>
<h3 id="dragan-djuric">Dragan Djuric</h3>
<p>My goal with this funding in 2025 is to support Apple silicon (M cpu) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible). This will hugely streamline user experience regarding high performance computing in Clojure for Apple macOS users, which is a considerable chunk of Clojure community.</p>
<h3 id="peter-taoussanis">Peter Taoussanis</h3>
<p>Multiple projects, incl. further work on Telemere, Tufte, Tempel, and more. I have been trying to focus recent work on practical areas where Clojure either doesn&rsquo;t already have great solution/s, or where Clojure might be able to offer something uniquely advantageous over other languages/platforms. There&rsquo;s still a lot of low-hanging fruit re: both observability and data security for example. Beyond that, just focusing on practical tools that work at scale while being approachable for beginners</p>
<h3 id="oleksandr-yakushev">Oleksandr Yakushev</h3>
<p>I plan to continue working on Clojure Goes Fast tooling. During Q3 2024, I&rsquo;ve covered a lot of ground with new features and redesign of clj-async-profiler and the first release of Flamebin. This also opened a lot of ideas and opportunities for further improvement of those tools. I have a large backlog of tasks for:</p>
<ul>
<li>Flamebin – implement authorization and social login, client-side encrypted private flamegraphs, collaborative commenting, configuration editing and saving;</li>
<li>clj-async-profiler – unified configuration, configuration reuse between flamegraphs, automatic analysis and performance improvement suggestions;</li>
<li>Clojure Goes Fast knowledge base – populate the list of bad performance practices that can be later be linked to by the clj-async-profiler analyzer;</li>
<li>clj-java-decompiler – CIDER integration which I wished to do in Q3 but couldn&rsquo;t get to in this quarter.</li>
</ul>
<h2 id="thanks">Thanks</h2>
<p>Thanks again  to all of our members for selecting these developers. If it wasn&rsquo;t for your generous support, this wouldn&rsquo;t be possible. I wanted to add a special thanks to Latacora, Roam Research, Whimsical, Nubank, Cisco, JUXT, Metosin, Solita, Adgoji, Grammarly, Nextjournal, ClojureStream, Shortcut, Flexiana, Toyokumo, Griffin, doctronic, and 180° Seguros. They have all contributed significant amounts to Clojurists Together which lets us award $90,000 in long-term funding to Clojure developers.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Nov. 2024 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/nov.-2024-short-term-project-updates/</link>
      <pubDate>Mon, 09 Dec 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/nov.-2024-short-term-project-updates/</guid>
      <description>clj-Nix, Clojure Goes Fast, Jank, Kushi, Malli, SciCloj, Standard Clojure Style</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve got our second (and one third) set of reports from developers working on short-term projects funded in Q3 2024. You&rsquo;ll find a brief description of each project at the top of the page to provide some context &ndash; followed by current project updates.</p>
<h3 id="clj-nix-josé-luis-lafuenteclj-nix-josé-luis-lafuente"><a href="#clj-nix-jos%C3%A9-luis-lafuente">clj-Nix: José Luis Lafuente</a></h3>
<ul>
<li>Develop an alternative builder for Nix that uses Babashka / SCI instead of Bash. It provides a way
for constructing complex Nix derivations using Babashka/SCI entirely, eliminating the need to
write any Bash code.</li>
<li>Also, will be adding a Babashka writer to nixpkgs. Nixpkgs supports creating self-contained scripts, called &ldquo;nix writers.&rdquo; Traditionally written in Bash, recent versions of nixpkgs include the ability to write these scripts in Python, Ruby, or Rust.</li>
</ul>
<h3 id="clojure-goes-fast-oleksandr-yakushevclojure-goes-fast-oleksandr-yakushev"><a href="#clojure-goes-fast-oleksandr-yakushev">Clojure Goes Fast: Oleksandr Yakushev</a></h3>
<ul>
<li>Create a new web application for clj-async-profiler that will allow users to host and share the generated flamegraphs. At the moment, even though flamegraphs are just self-contained HTML files, sending them to
somebody is a chore. The new service can make this much easier and offer extra features
like saving and sharing dynamic transforms on the fly. Additionally, I&rsquo;d like to focus on the UI
side of clj-async-profiler - add new dynamic transforms, improve aesthetics and the UX.</li>
<li>For clj-java-decompiler, expand its preprocessing abilities to present clearer results to the user and integrate it more tightly with established Clojure IDEs like CIDER and Calva, which requires some groundwork.</li>
<li>Adapting and updating benchmarking content in the <a href="https://clojure-goes-fast.com/kb/">Clojure Goes Fast knowledge base</a></li>
</ul>
<h3 id="jank-jeaye--wilkersonjank-jeaye--wilkerson"><a href="#jank-jeaye--wilkerson">Jank: Jeaye  Wilkerson</a></h3>
<p>Jank feels like Clojure now, with 92% syntax parity and nearly 40% clojure.core parity. But it only feels like Clojure to me because none of you are using it yet. My top priority is to change that.  I&rsquo;ll be working on building out jank&rsquo;s nREPL server, which involves implementing bencode support, <code>clojure.test</code>, improving native interop, supporting pre-compiled binary modules, and ultimately adding AOT compilation support.</p>
<h3 id="kushi-jeremiah-coylekushi-jeremiah-coyle"><a href="#kushi-jeremiah-coyle">Kushi: Jeremiah Coyle</a></h3>
<p>Continue development of Kushi, a foundation for building web UI with ClojureScript. Work this funding cycle will focus on finishing the new css transpilation pipeline, significant build system performance upgrades, and implementing a reimagined theming system.</p>
<h3 id="malli-ambrose-bonnaire-sergeantmalli-ambrose-bonnaire-sergeant"><a href="#malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</a></h3>
<p>This project (Constraints and Humanization) aims to drastically improve the expressivity of Malli schemas to help address current user feedback and enable future extensions. The basic idea is to add a constraint language to each schema to express fine-grained invariants and then make this constraint language compatible with validators/explainers/generators/etc so that Malli users can write high-level, precise schemas without resorting to partial workarounds. See prototype here: <a href="https://github.com/frenchy64/malli/pull/12">https://github.com/frenchy64/malli/pull/12</a></p>
<h3 id="scicloj-daniel-slutskyscicloj-daniel-slutsky"><a href="#scicloj-daniel-slutsky">SciCloj: Daniel Slutsky</a></h3>
<p>Check out Daniel&rsquo;s video: <a href="https://www.youtube.com/watch?v=WO6mVURUky4">https://www.youtube.com/watch?v=WO6mVURUky4</a>. Scicloj is a Clojure group developing a stack of tools &amp; libraries for data science.
Alongside the technical challenges, community building has been an essential part of its
efforts since the beginning of 2019. Our community-oriented goal is making the existing data-science stack easy to use through the maturing of the Noj library, mentioned below. In particular, we are working on
example-based documentation, easy setup, and recommended workflows for common tasks. All these, and the tools to support them, grow organically, driven by real-world use-cases. See updates for progress on Q3 projects and documentation.</p>
<h3 id="standard-clojure-stylechris-oakmanstandard-clojure-style-chris-oakman"><a href="#standard-clojure-style-chris-oakman">Standard Clojure Style:Chris Oakman</a></h3>
<p>Continue work on Standard Clojure Style - which is a &ldquo;no config, runs everywhere, follows simple rules&rdquo; formatter for Clojure code. More information about the genesis of the project can be found on Issue #1:
<a href="https://github.com/oakmac/standard-clojure-style-js/issues/1">https://github.com/oakmac/standard-clojure-style-js/issues/1</a><br>
<br></p>
<hr>
<h2 id="clj-nix-josé-luis-lafuente">clj-nix: José Luis Lafuente</h2>
<p>Q3 2024 Report No. 2 (final), Published Nov. 29, 2024</p>
<h3 id="nix-babashka-builder">Nix babashka builder</h3>
<p>I&rsquo;ve made some progress with the Babashka builder. The builder should still be
considered experimental, and the API may change . It&rsquo;s now possible to create
and override derivations, as well as have interdependencies between different
derivations created with the Babashka builder.</p>
<p>I&rsquo;m particularly happy with the reduction in Nix code. The Babashka builder
allows you to create Nix derivations with minimal Nix code. While it might still
feel a bit hacky, it&rsquo;s possible to define Nix dependencies between derivations
directly within Clojure code.</p>
<p>On the less positive side, I think it&rsquo;s currently difficult to reuse some of the
build helpers available in Nixpkgs. I definitely don&rsquo;t want to reimplement all
those helpers, so I&rsquo;ll try to find a way to reuse those Nixpkgs helpers (even if
they&rsquo;re written in Bash) from the Babashka builder.</p>
<p>I also wrote some documentation for it. If you want to know more, <a href="https://jlesquembre.github.io/clj-nix/bb-env/">see</a></p>
<p>I also created a repository with some examples, covering four topics:</p>
<ul>
<li>A basic derivation</li>
<li>An override</li>
<li>How to wrap other programs to capture all runtime dependencies</li>
<li>Dependencies between multiple derivations created with the Babashka builder</li>
</ul>
<p>Here is the <a href="https://github.com/jlesquembre/bb-pkgs">link:</a></p>
<h3 id="improvements-for-clj-nix">Improvements for clj-nix</h3>
<p>While it&rsquo;s not directly related to this proposal, I&rsquo;d also like to mention some
improvements I made to clj-nix on my own time. These improvements primarily
focus on how clj-nix generates lock files.</p>
<p>I&rsquo;ve also released a new version with these changes:<br>
<a href="https://github.com/jlesquembre/clj-nix/releases/tag/0.4.0">Release 0.4.0</a></p>
<p>The Nix Babashka builder is not included in this release (as I believe it&rsquo;s
still too early for a stable release). However, I&rsquo;ve already merged it into the
main branch, making it easier for people to test it out.  <br></p>
<hr>
<h2 id="clojure-goes-fast-oleksandr-yakushev">Clojure Goes Fast: Oleksandr Yakushev</h2>
<p>Q3 2024 Reports No. 2 and 3 (final), Published Oct. 31 and Nov. 30, 2024</p>
<p><strong>Report 2:</strong><br>
During the second month of my Clojurists Together project I published a major update of clj-async-profiler. The new release contains a redesigned and improved profile list page with better UI, convenient sorting, and easy access to diffing functionality. The rest of the time I&rsquo;ve spent working on the flamegraph sharing webapp that I plan to release into a public betatest at the beginning of the third month. As a bullet list:</p>
<ul>
<li>Published the release of clj-async-profiler 1.4.0. Big changes:
<ul>
<li>New index page design.</li>
<li>Diffgraph generation functionality accessible from UI.</li>
<li>Flamegraph rendering fixes - prevent horizontal scrollbar from appearing and the tooltip from clipping near screen borders.</li>
<li>Stability fix for JDK23.</li>
</ul>
</li>
<li>Wrote a blogpost about 1.4.0 release <a href="https://clojure-goes-fast.com/blog/clj-async-profiler-140/">highlighting the main changes:</a>.</li>
<li>Set up infrastructure, deployment, and proof-of-concept implementation of the flamegraph sharing site. Got very close to the initial public release.</li>
</ul>
<p><strong>Report 3:</strong><br>
I&rsquo;ve spent the third month of my Clojureists Together project working primarily on Flamebin — a new web application that allows uploading and sharing flamegraphs. At the beginning of the month I launched it as public beta, and by the end of the November I finally published it as a first stable release. A more detailed report below:</p>
<ul>
<li>Made a public release of <a href="https://flamebin.dev">Flamebin</a>
<ul>
<li>Set up a <a href="https://github.com/clojure-goes-fast/flamebin">public repository</a></li>
<li>Created and configured a VPS instance to host the web application</li>
<li>Configured CI for testing, buildign the application and deploying it to two environemnts (QA and prod)</li>
<li>Flamebin allows uploading profiles to later render them as flamegraphs:
<ul>
<li>Supports two formats of uploads — collapsed stackframes (compatible with perf, async-profiler, and other profiling tools) and dense profiles.</li>
<li>Uploading is possible using a web page or through clj-async-profiler integration.</li>
<li>An uploaded profile can either be publicly visible or private. Private uploads are encrypted by a secret read-token that is required for viewing the profile and is not stored on the server.</li>
<li>Accidentally uploaded profiles can be deleted by providing a secret edit-token.</li>
</ul>
</li>
<li>Uploaded flamegraphs have a stable URL that can be viewed by anyone (for public flamegraphs) or only by those with a read-token (for private flamegraphs). The flamegraph renderer is reused from clj-async-profiler. User can explore the flamegraph interactively, change the viewing preferences, and also save those preferences so that other users can open the pre-configured flamegraph later.</li>
</ul>
</li>
</ul>
<p>I also made two releases of clj-async-profiler — 1.5.0 and 1.5.1 follow-up. These releases unified the approach to flamegraph configuration, enabling different ways to change the configuration:</p>
<ul>
<li>Specify the configuration before generate a flamegraph, using code.</li>
<li>Save the current configuration (set in UI) to the server for the subsequently generated flamegraphs to inherit.</li>
<li>Copy and paste configuration between different flamegraphs in the UI.</li>
<li>Provide configuration in the URL parameter.<br>
All of the configuration improvements were ported to Flamebin as well.</li>
</ul>
<p>Finally, I&rsquo;ve been updating the <a href="https://clojure-goes-fast.com/kb/profiling/clj-async-profiler/">Clojure Goes Fast knowledge base</a> to cover the new clj-async-profiler and Flamebin features.  <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q3 2024 Report No. 2, Published Nov. 30, 2024</p>
<p>Hi everyone! It&rsquo;s been a very busy couple of months as I&rsquo;ve been developing
jank&rsquo;s LLVM IR generation, improving jank&rsquo;s semantic analysis, and furthering
jank&rsquo;s module loading system. Thank you to all of my Github sponsors and to
Clojurists Together, who help me pay the bills. As of January 2025, I&rsquo;ll be
working on jank full-time and every new sponsor means that much more.
Without further ado, let&rsquo;s dive into the details of the past couple of months.</p>
<h3 id="llvm-ir">LLVM IR</h3>
<p>The main focus of the past couple of months has been filling out jank&rsquo;s LLVM IR
generation. This has required further improving some of its semantic analysis
since I was previously able to cut some corners when generating C++ code.</p>
<p>At this point, all AST nodes in jank have working and tested IR generation
except for <code>try</code>, since doing so requires hooking into the C++ runtime&rsquo;s unwind
mechanism and I&rsquo;ve been saving that rabbit hole for last.</p>
<p>IR generation has caused so many fun bugs the past couple of months that I had
to look into a better way of organizing my notes for this quarter. There was
just too much. When developing a language, especially in a pre-alpha stage like
jank, when something crashes or is otherwise completely wrong, the issue could
be anywhere from lexing to parsing to semantic analysis to code generation to
object modeling to core function algorithms to data structures. I think there
were some of each discovered in the past couple of months, but the majority of
them were in the new IR generation.</p>
<h3 id="named-recursion">Named recursion</h3>
<p>One of the fun bugs I ran into was with how Clojure handles recursion through
the function&rsquo;s own name. This doesn&rsquo;t go through the var; it just references the
function object directly. The same applies with just a self-reference. For
example:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">fn </span>foo []
  foo)

(<span style="color:#66d9ef">defn </span>foo []
  foo)
</code></pre></div><p>In Clojure, and in jank with C++ generation, each function is an object (struct
or class). A self-reference can literally just mean <code>this</code>. But with the LLVM IR
generation, each function, and more specifically each function arity, is
compiled to a dedicated C function. Aside from closures, which get an implicit
first argument which is a generated struct of the captured values, the function
itself has no other identifying state or object. This means a self-reference
actually needs to build a new object. Previously, I would always just generate a
local into each function like so:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#66d9ef">auto</span> <span style="color:#66d9ef">const</span> foo{ <span style="color:#66d9ef">this</span> };
</code></pre></div><p>Then I would register that local automatically during semantic analysis for
functions. A self-reference would then just be a <code>local_reference</code> AST node.
This can&rsquo;t carry over well to IR generation, so I&rsquo;ve added two new AST nodes:</p>
<ol>
<li><code>recursion_reference</code>, which is created when we analyze that we&rsquo;re referring
to the current function by name somewhere</li>
<li><code>named_recursion</code>, which is created when we&rsquo;re analyzing a <code>call</code> and find
that the source expression is a <code>recursion_reference</code></li>
</ol>
<p>This does mean that a self-reference within a function wouldn&rsquo;t be <code>identical?</code>
to the invoking object, but that&rsquo;s something we can document and otherwise
really not care about.</p>
<h3 id="startup-performance">Startup performance</h3>
<p>Ultimately, the main reason for generating LLVM IR is that C++ is too slow to
compile. If compiling <code>clojure.core</code> means generating 100K lines of C++ to
compile, we end up waiting far too long for jank to start up. On my machine, it
took around <strong>12 seconds</strong>.</p>
<p>Now, with IR generation, and a lot more functionality baked into jank itself,
rather than JIT compiled, compiling <code>clojure.core</code> from source takes only <strong>2 seconds</strong>.
This is fast enough to where we can easily include it as part of jank&rsquo;s
build system. We can then pre-compile the sources to binaries and load those
instead.</p>
<p>When I tried this with C++ generation, it took <strong>4 minutes</strong> to compile all of
the C++ generated for <code>clojure.core</code> into a C++20 module with a backing shared
library. It then took <strong>300ms</strong> to load at runtime, which dropped the start time
from <strong>12 seconds</strong> to <strong>300ms</strong>. That AOT compilation cost was huge, but the gain was
also big.</p>
<p>With IR generation, we can also generate object files. Amazingly, it can be done
within the same <strong>2 seconds</strong> used to compile <code>clojure.core</code> in the first place.
When loading that object file at runtime, jank can now start up in <strong>150ms</strong>. So, we
spend a fraction of the time actually compiling the code and even less time
loading it. Overall, for startup performance, LLVM IR has been a huge win. This
is exactly what I wanted and I&rsquo;m very pleased with the results.</p>
<p><img src="https://github.com/user-attachments/assets/d2c8fe03-9411-49c1-9a9f-5fe56b99076f" alt="image"></p>
<p>Note, when all of this is baked into the executable AOT, startup time is around
<strong>50ms</strong>. jank doesn&rsquo;t support AOT compilation of full programs yet, but I&rsquo;ve
manually added the object files to jank&rsquo;s CMake build in order to test this out.
Once we do have AOT compilation to binaries, we can also add direct linking,
link-time optimizations (LTO), etc. and drop these numbers down even further.</p>
<h3 id="runtime-performance">Runtime performance</h3>
<p>Runtime performance will be negatively impacted by IR generation, at least to
start. The C++ code jank used to generate was quite optimized. I was taking
advantage of various C++ features, like function overloading, type inference,
and easy (yet ambiguous) unboxing of numerical values. With IR gen, we need to
do all of those manually, rather than rely on a C++ compiler to help. This will
take more work, but it also allows us to tailor the optimizations to best fit jank.</p>
<p>I&rsquo;m not ready to report any benchmark results for runtime performance
differences yet, since I don&rsquo;t think measuring the initial IR generation against
the previous C++ generation is a good usage of time. Optimizing IR can happen as
we go, without breaking any ABI compatibility. I&rsquo;m more focused on getting
jank released right now.</p>
<h3 id="build-system-and-portability-improvements">Build system and portability improvements</h3>
<p>Apart from working on LLVM IR generation the past couple of months, I&rsquo;ve put a
fair amount of time into improving jank&rsquo;s builds system and dependency
management. In particular, vcpkg has been removed entirely. I was using vcpkg to
bring in some C and C++ source dependencies, but some of them regularly fail to
build from source on very normal setups and vcpkg on its own causes issues with
build systems such as Nix. Altogether, it&rsquo;s well known that the build system and
dependency tooling for C and C++ is terrible. While I aim for jank to improve
that, in its own way, we still need to suffer through it for the compiler
itself.</p>
<p>In order to remove vcpkg, I had to address all of the dependencies it was
pulling in.</p>
<ul>
<li>bdwgc (Boehm GC) requires compilation
<ul>
<li>Added a submodule and hooked into CMake</li>
<li><a href="https://github.com/ivmai/bdwgc/pull/675">Required a PR for CMake compatibility</a></li>
</ul>
</li>
<li>fmt requires compilation
<ul>
<li>Added a submodule and hooked into CMake</li>
</ul>
</li>
<li>libzipp requires compilation
<ul>
<li>Added a submodule and hooked into CMake</li>
</ul>
</li>
<li>immer is header-only
<ul>
<li>Added a submodule</li>
</ul>
</li>
<li>magic_enum is header-only
<ul>
<li>Added a submodule</li>
</ul>
</li>
<li>cli11 is header-only
<ul>
<li>Added a submodule</li>
</ul>
</li>
<li>doctest is in all major package repos</li>
<li>boost is in all major package repos
<ul>
<li><code>boost::preprocessor</code> isn&rsquo;t found by CMake on Ubuntu, but it&rsquo;s there
<ul>
<li>Doesn&rsquo;t exist in brew&rsquo;s package, though</li>
<li>Had to add as a submodule</li>
</ul>
</li>
<li>Causes Clang to crash while building <code>incremental.pch</code></li>
</ul>
</li>
</ul>
<p>All in all, this required <strong>seven new git submodules</strong>. Even something as
commonplace as boost led to dependency issues across various platforms. I did
all of my testing on Ubuntu, Arch, NixOS, and macOS. Once I had all of those
submodules, I still ran into some issues with Clang hard crashing while trying
to compile an incremental pre-compiled header (PCH) with boost. This was the
final straw with PCHs for me.</p>
<h3 id="pre-compiled-headers">Pre-compiled headers</h3>
<p>jank started out with PCHs from the beginning. I was concerned about
compile-times and I knew that many source files would need access to the whole
object model in order to compile. While this remains true, I didn&rsquo;t expect
that PCHs would be such a headache when JIT compiling C++. There have been a
handful of Cling bugs and then Clang bugs related to loading PCHs into the
incremental C++ environment. I&rsquo;ve spent entire days compiling Clang/LLVM while
bisecting in order to find root causes.
<a href="https://github.com/jank-lang/jank/pull/94">Haruki</a> has been so close to building
jank on Nix but has been running into issues when compiling the incremental PCH.
This has been a long time coming.</p>
<p>After removing the PCHs, fixing all source files to include what they need,
refactoring some heavy headers so they can be used less often, and running some
tooling to further clean things up, we can wipe our hands of all of that. jank
does still need to JIT compile C++ code, but it can do so using both a C API and
a C++ API. Devs using jank can include what they need.</p>
<p>Previously, just loading the incremental PCH with all of jank&rsquo;s headers took a
whopping 2.5 seconds every start up and we always paid that cost. Now, better
following the (intended) nature of C++, we can pay for what we use.</p>
<h3 id="community-update">Community update</h3>
<p>I have not been the only one working on jank. The past couple of months, my
newest mentee through the <a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">SciCloj mentorship program</a>,
<a href="https://github.com/stmonty">Monty Bichouna</a>, has wrapped up Unicode lexing support. This
allows jank the important ability to properly represent Unicode symbols and
keywords. Monty&rsquo;s work builds on Saket&rsquo;s recent work to add Unicode support for
character objects.</p>
<p>To further jank&rsquo;s interop story, <a href="https://github.com/Samy-33">Saket Patel</a> also
recently merged some changes which allow jank to accept include paths, linker
paths, and linked shared libraries. This means that you can now include other C
and C++ libraries from your JIT compiled bridge code and have the JIT linker
resolve those symbols in your libraries. In other words,
<strong>it&rsquo;s now possible to use jank to wrap arbitrary C and C++ libraries</strong>.
Saket took this further by adding an opaque pointer wrapper object which can
store any non-owned native pointer to be passed through any jank function and
stored in any jank data structure. Each of these is a small step toward a much
richer interop story. Saket also added persistent history to jank&rsquo;s CLI REPL and
improved its usability by hooking into LLVM&rsquo;s line editing capabilities.</p>
<p><a href="https://github.com/jianlingzhong">Jianling Zhong</a> added support for ratio objects in
jank, including the whole polymorphic math treatment necessary for them. He also
implemented jank&rsquo;s delay object and corresponding <code>clojure.core/delay</code> macro as
well as jank&rsquo;s repeat object, which backs the <code>clojure.core/repeat</code> function.</p>
<p>Finally, <a href="https://github.com/quoll">Paula Gearon</a> has been making excellent
progress on a sister project to jank,
<a href="https://github.com/jank-lang/clojure.core-test">clojure.core-test</a>, which is a
cross-dialect test suite for all of <code>clojure.core</code>. Ultimately, my goal with
this is to aid Clojure dialect developers by providing a thorough test suite for
Clojure&rsquo;s core functions. By being able to run and pass this suite, my
confidence in jank will be strong. I&rsquo;m sure other dialect developers will feel
similarly.</p>
<h3 id="whats-next">What&rsquo;s next?</h3>
<p>I need to fix a couple remaining bugs with the LLVM IR generation and then
implement IR generation for <code>try</code> nodes, in the next couple of weeks. After
that, the next big goal is error reporting. This is an exciting task to tackle,
since the impact of it is going to feel so rewarding. I have been suffering
jank&rsquo;s terrible error messages for years. Even worse, we as an industry have
been suffering terrible error messages for decades. There&rsquo;s been some exciting
progress in <a href="https://elm-lang.org/news/compiler-errors-for-humans">Elm</a>,
<a href="https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html">Rust</a>, etc
for improving the way errors are reported, providing
actionable feedback, and including sufficient context to make errors less
cryptic. I don&rsquo;t think that Clojure does well in this area, currently, and I aim
to raise the bar.</p>
<p>If that sounds interesting, stay tuned for my next update!  <br></p>
<hr>
<h2 id="kushi-jeremiah-coyle">Kushi: Jeremiah Coyle</h2>
<p>Q3 2024 Report No. 2 (final), Published Nov. 30, 2024</p>
<h3 id="q3-milestones">Q3 Milestones</h3>
<p>Thanks to the funding from Clojurists Together, the Q3 development of Kushi pursued the following 3 milestones:</p>
<ol>
<li>Finishing the new css transpilation API.</li>
<li>Reimplementing the build system for enhanced performance.</li>
<li>A reimagined theming system.</li>
</ol>
<h3 id="progress">Progress</h3>
<h4 id="milestone-1-finishing-the-new-css-transpilation-api">Milestone #1: Finishing the new css transpilation API.</h4>
<ul>
<li><strong>Goals</strong>
<ol>
<li>Solidify the API design and implementation of Kushi&rsquo;s CSS transpilation functionality.</li>
<li>Incorporate the use of lightingcss for CSS transformation (older browsers) and minification.</li>
<li>Refactor existing public functions for injecting stylesheets, google fonts, etc.</li>
</ol>
</li>
<li><strong>Progress:</strong> Complete on branch <code>new-build-system</code>. The majority of the time spent working on Kushi in the first half of the funding period was focused on implementing a new CSS transpilation pipeline. An updated set of public macros and supporting functions was designed and implemented around this. A broad test suite was written, which consists of 7 tests containing 54 assertions. Additional refinement of the implementation was done during the course of realizing milestone #2. Updated documentation of this API  is reflected in the <code>README.md</code> on this branch.</li>
<li><strong>Next steps:</strong> Continue to test this new API by upgrading existing UI work (such as Kushi&rsquo;s interactive documentation site) that uses the current (soon to be previous) API, then adjust and refine implementation details as necessary.</li>
</ul>
<h4 id="milestone-2-reimplementing-the-build-system-for-enhanced-performance">Milestone #2: Reimplementing the build system for enhanced performance.</h4>
<ul>
<li><strong>Goal</strong>: Reimplement the build system for performance, and eliminate the use of side-effecting macros.</li>
<li><strong>Progress:</strong> Complete on branch <code>new-build-system</code></li>
<li><strong>Next steps:</strong>
<ul>
<li>Support the use of the new version of the <code>sx</code> macro.</li>
<li>Adopt new conventions to Kushi documentation site source.</li>
<li>Merge this work into main branch.</li>
</ul>
</li>
</ul>
<h4 id="milestone-3-a-reimagined-theming-system">Milestone #3: A reimagined theming system.</h4>
<ul>
<li>
<p><strong>Goal</strong>: Based on learnings from using Kushi to build a lot of production UI over that last 2-3 years, redesign and implement a new theming system. This will involve harmonizing 3 principled subsystems:</p>
<ol>
<li>Design tokens (a global system of CSS custom properties).</li>
<li>Utility classes.</li>
<li>Component-level data-attribute conventions.</li>
</ol>
</li>
<li>
<p><strong>Progress:</strong> 80% complete implementation on branch <code>oklch</code>.</p>
</li>
<li>
<p><strong>Next steps:</strong> .</p>
<ul>
<li>Refine syntactical conventions of <code>data-</code> attributes</li>
<li>Reconcile new (oklch) and legacy (hsl) color system, with realistic backwards compatibility</li>
<li>After merging <code>new-build-system</code> branch into main branch, adopt new conventions to Kushi documentation site source.</li>
<li>Merget this work into main branch  <br></li>
</ul>
<hr>
</li>
</ul>
<h2 id="malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</h2>
<p>Q3 2024 Report No. 2, Published Nov. 30, 2024</p>
<p>This is the second report of three in the project to extend Malli with constraints. [Report 1] is here. (<a href="https://www.clojuriststogether.org/news/sept.-and-oct.-2024-short-term-project-updates/#malli-ambrose-bonnaire-sergeant">https://www.clojuriststogether.org/news/sept.-and-oct.-2024-short-term-project-updates/#malli-ambrose-bonnaire-sergeant</a>)</p>
<h3 id="background">Background</h3>
<p>In this project, I proposed to extend the runtime verification library
Malli with constraints with the goal of making the library more expressive
and powerful.</p>
<p>With this addition, schemas can be extended with extra invariants (constraints) that must be
satisfied for the schema to be satisfied. Anyone can add a constraint to a schema.
Crucially, these extensions should work as seamlessly as if the author of the schema
added it themselves.</p>
<h3 id="progress-1">Progress</h3>
<p>I finished my <a href="https://github.com/frenchy64/malli/pull/20/files">prototype</a> porting existing <code>:min</code>/<code>:max</code> schema properties to a new &ldquo;constraint&rdquo; framework.
This seems like a useful framework in general but I&rsquo;m not fully convinced it&rsquo;s the simplest solution
to having more expressive <code>:map</code> keyset constraints.</p>
<p>I spent the rest of the month iterating and reviewing various design decisions.</p>
<p>First I learnt how cljs bundle size works, and <a href="https://github.com/frenchy64/malli/pull/21/files">refactored</a>
the constraint to live in <code>malli.core</code> while still being removable from the cljs bundle. This simplified a
few things, but at this point I reviewed my notes and started pulling apart the solution by
the problems they solved.</p>
<p>This constraints project was inspired as a &ldquo;big&rdquo; solution to multiple problems:</p>
<ul>
<li><code>:map</code> keyset constraints are not expressive enough, forcing use of <code>:fn</code> schemas</li>
<li><code>:and</code> and <code>:not</code> generators are not reliable enough for complex keyset constraints</li>
<li>humanization for <code>:not</code>, <code>:and</code> and <code>:or</code> errors are too confusing for complex keyset constraints</li>
</ul>
<p>If all of these problems were solved, we could possibly avoid changing <code>:map</code> constraints
at all and just add one new schema <code>[:contains k]</code> that tests <code>#(contains? % k)</code>.<br>
A schema like this could be used for a map that either has <code>:secret</code> or both <code>:user</code> and <code>:pass</code>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[<span style="color:#e6db74">:and</span> [<span style="color:#e6db74">:map</span>
       [<span style="color:#e6db74">:secret</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
       [<span style="color:#e6db74">:user</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]
       [<span style="color:#e6db74">:pass</span> {<span style="color:#e6db74">:optional</span> true} <span style="color:#e6db74">:string</span>]]
      [<span style="color:#e6db74">:or</span>
       [<span style="color:#e6db74">:and</span>
        [<span style="color:#e6db74">:contains</span> <span style="color:#e6db74">:secret</span>]
        [<span style="color:#e6db74">:not</span> [<span style="color:#e6db74">:contains</span> <span style="color:#e6db74">:user</span>]]
        [<span style="color:#e6db74">:not</span> [<span style="color:#e6db74">:contains</span> <span style="color:#e6db74">:password</span>]]]
       [<span style="color:#e6db74">:and</span> 
        [<span style="color:#e6db74">:not</span> [<span style="color:#e6db74">:contains</span> <span style="color:#e6db74">:secret</span>]]
        [<span style="color:#e6db74">:contains</span> <span style="color:#e6db74">:user</span>]
        [<span style="color:#e6db74">:contains</span> <span style="color:#e6db74">:pass</span>]]]]
</code></pre></div><p>My thinking is, if we can make <code>m/explain</code> and <code>mg/generate</code> work with this kind of schema,
we could reapply those insights to other schema transformations like OpenAPI or JSON Schema
and perhaps move away from monolithic schemas like <code>:map</code> which accumulate features (<code>::m/default</code>,
<code>:min</code>, <code>:max</code>, <code>:optional</code>) and instead decomplect their features into independent repurposable
schemas that can be combined with composite schemas like <code>:and</code> and <code>:or</code> without compromising
performance or expressivity.</p>
<p>My <a href="https://github.com/frenchy64/malli/pull/23/files">prototype</a> for this idea introduces
a new namespace <code>malli.solver</code> that transforms schemas into descriptions of all the values they
represent. By rewriting the <code>:and</code> generator to propagate extra information to the first
schema conjunct from the other conjuncts, we could, for example have a schema like
<code>[:and :string [:min-count 10]]</code> generate identically to <code>[:string {:min 10}]</code> by utilizing
the extra information in the <code>:string</code> generator. Perhaps the latter could even <code>m/deref</code> to the former,
which starts to look very similar to my original &ldquo;constraint&rdquo; solution where schemas contain
other schemas at the same &ldquo;level&rdquo;, without extra machinery.</p>
<p>Here&rsquo;s a list of some of the directions I&rsquo;ve worked on in the last few months:</p>
<ul>
<li><a href="https://github.com/frenchy64/malli/pull/20/files">min/max constraints</a>
<ul>
<li>finish constraints for schemas supporting <code>:min</code>/<code>:max</code> properties:
<ul>
<li><code>:int</code>, <code>:double</code>, <code>:float</code>, <code>:string</code>, <code>:vector, </code>:sequential<code>, </code>:seqable<code>, </code>:set`</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/frenchy64/malli/pull/21/files">min/max constraints by default</a>
<ul>
<li>like previous work, but move constraints to <code>malli.core</code></li>
<li>can disable constraints via system property to preserve cljs bundle size</li>
</ul>
</li>
<li>opened issues
<ul>
<li><a href="https://github.com/metosin/malli/issues/1121"><code>:seqable</code> generates nil when :min is greater than 0</a></li>
<li><a href="https://github.com/metosin/malli/issues/1122"><code>:float</code> missing humanizer</a></li>
<li><a href="https://github.com/metosin/malli/issues/1128">Double generator fails if <code>{:max (- Double/MAX_VALUE)}</code></a></li>
<li><a href="https://github.com/metosin/malli/issues/1129"><code>[:= ##NaN]</code> rejects <code>##NaN</code> yet generates it</a></li>
<li><a href="https://github.com/metosin/malli/issues/1130">Opaque <code>such-that</code> error when using <code>##NaN</code> as bound</a></li>
<li><a href="https://github.com/metosin/malli/issues/1132"><code>:float</code> accepts doubles but never generates them</a></li>
<li><a href="https://github.com/metosin/malli/issues/1133">Opaque assertion errors with infinite bounds</a></li>
</ul>
</li>
<li>merged pr&rsquo;s
<ul>
<li><a href="https://github.com/metosin/malli/pull/1120">Require generator for <code>:gen/fmap</code></a></li>
<li><a href="https://github.com/metosin/malli/pull/1125">only assume string interning in cljs</a></li>
</ul>
</li>
<li>wip
<ul>
<li><a href="https://github.com/frenchy64/malli/pull/23/files">reliable <code>:and</code> generator</a>
<ul>
<li>includes new namespace <code>malli.solver</code> which turns schemas in to maps describing values they represent</li>
<li>includes three demonstrated usages:
<ul>
<li><code>malli.generator</code>: new <code>:and</code> generator that never guesses
<ul>
<li>e.g., these always succeed to generate values
<ul>
<li><code>[:and [:&gt;= 2] [:&lt;= 2]]</code></li>
<li><code>[:and [:&lt;= 3] [:fn {:gen/schema :int} int?]]</code></li>
</ul>
</li>
<li>better error message for unsolvable schemas:
<ul>
<li>e.g., <code>[:and :int [:&gt;= 1.5] [:&lt;= 1.5]]</code> =&gt; <code>Exception: :malli.generator/unsatisfiable-schema</code></li>
</ul>
</li>
</ul>
</li>
<li><code>malli.optimize</code>: faster version of <code>m/validate</code>
<ul>
<li>e.g., checks <code>[:map [:a :int] [::m/default [:map-of :int :int]]]</code> in single pass, checks <code>map?</code> once</li>
</ul>
</li>
<li><code>malli.simplify</code>: simplifies schemas
<ul>
<li>e.g., <code>[:and number? [:&lt;= 10] [:&lt;= 20] [:&lt;= 30]]</code> =&gt; [:and number? [:&lt;= 10]])</li>
</ul>
</li>
</ul>
</li>
<li>includes new schema <code>[:contains k]</code> that checks if <code>:k</code> key exists
<ul>
<li>next: connect with generator to reliably generate schemas like:
<ul>
<li><code>[:and [:map] [:or [:contains :secret] [:and [:contains :user] [:contains :password]]]]</code></li>
</ul>
</li>
<li>next: humanizer for <code>[:not [:contains k]]</code> (pr below)</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/frenchy64/malli/pull/26">rewrite <code>malli.generator</code> and fix bugs</a>
<ul>
<li>~20% shorter</li>
</ul>
</li>
</ul>
</li>
<li>proposed pr&rsquo;s
<ul>
<li><a href="https://github.com/metosin/malli/pull/1138"><code>:not</code> humanizer</a>
<ul>
<li>relevant so <code>[:not [:contains k]]</code> can be explained</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="next">Next</h3>
<p>I&rsquo;m going to see if <a href="https://github.com/frenchy64/malli/pull/23/files">decomplecting the constraints solution</a>
is actually usable in practice and propose various smaller improvements to malli based on my experience so far.  <br></p>
<hr>
<h2 id="scicloj-daniel-slutsky">SciCloj: Daniel Slutsky</h2>
<p>Q3 2024 Report No. 2, Published Nov. 3, 2024</p>
<p>The <a href="https://www.clojuriststogether.org/">Clojurists Together</a> organisation has decided <a href="https://www.clojuriststogether.org/news/q3-2024-funding-announcement/">to sponsor</a> Scicloj community building for Q3 2024, as a project by Daniel Slutsky. This is the second time the project is selected this year. Here is Daniel&rsquo;s update for October. and a <a href="https://www.youtube.com/watch?v=STnFMpIZlkk">video providing insights on the project.</a>. Comments and ideas would help. :pray:</p>
<h3 id="update-for-october-2024">Update for October 2024</h3>
<p><a href="https://scicloj.github.io/">Scicloj</a> is a Clojure group developing a stack of tools and libraries for data science. Alongside the technical challenges, community building has been an essential part of its efforts since the beginning of 2019. Our current main community-oriented goal is making the existing data-science stack easy to use through the maturing of the Noj library, mentioned below. In particular, we are working on example-based documentation, easy setup, and recommended workflows for common tasks.</p>
<p>All these, and the tools to support them, grow organically, driven by real-world use cases.</p>
<p>I serve as a community organizer at Scicloj, and this project was accepted for Clojurists Together funding in 2024 Q1 &amp; Q3. I also receive regular funding through Github Sponsors, mostly from Nubank.</p>
<p>In this post, I am reporting on my involvement during October 2024, as well as the proposed goals for October.  I had 57 meetings during September. Most of them were one-on-one meetings for open-source mentoring or similar contexts.  All the projects mentioned below are done in collaboration with others. I will mention at least a few of the people involved. For consistency, I use people&rsquo;s github handles when mentioning their work on the projects, and their full names when mentioning public talks.</p>
<h3 id="october-2024-highlights">October 2024 highlights</h3>
<h3 id="scicloj-open-source-mentoringhttpssciclojgithubiodocscommunitygroupsopen-source-mentoring"><a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">Scicloj open-source mentoring</a></h3>
<p>This month, we contined working with mentees under the open-source mentoring program.</p>
<p>@generatme, @phronmophobic, @jeaye, and myself have been active as mentors this month. Since the program&rsquo;s beginning at the middle of August, 62 people have applied &ndash; 15 of them during the last month. 39 are still actively exploring various topics, and out of them, 15 have already made important contributions.</p>
<p>One notable change happened during the last few months: we started working with a few mentees who are completely new to Clojure, some even to programming. This is part of Scicloj&rsquo;s gradual process of opening up to broader audiences.</p>
<p>Some of the recent experiences and insights on this project were discussed in our recent <a href="https://www.youtube.com/watch?v=STnFMpIZlkk">video report</a> (2024-10-25).</p>
<h3 id="nojhttpssciclojgithubionoj"><a href="https://scicloj.github.io/noj/">Noj</a></h3>
<p>The Noj library is the entry point to data science with Clojure, collecting a stack of relevant libraries. This month, we worked towards its release into Beta stage, which is almost complete.</p>
<p>At <a href="https://scicloj.github.io/docs/community/chat/">the Zulip chat</a>, we had quite a few insightful discussions with important feedback by community members about the scope and the organization of the project.</p>
<p>Most of our efforts in this project have been into writing additional tutorials. A broad group of people are working on these, and a few promosing tutorials are currently in draft stage. See some details below in the Tutorials section.</p>
<p>@behrica has made additional improvements to the automation and whole workflow of Noj in Github Pages.</p>
<p>I worked on clarifying many details and improving the main documentation pages.</p>
<h3 id="tableplothttpssciclojgithubiotableplot-previously-called-hanamicloth"><a href="https://scicloj.github.io/tableplot/">Tableplot</a> (previously called Hanamicloth)</h3>
<p>Towards reaching Beta stage, our acively-developed plotting library recieved a new name: Tableplot.</p>
<p>I continued working on extending its features, adding flexibility to the way data can be specified throughout the pipelines, and integrating <a href="https://github.com/scicloj/metamorph.ml">metamorph.ml</a> to allow for a more flexible smoothing functionality, where the user can specify the model details and the design matrix.</p>
<h3 id="composing-fastmathhttpsgithubcomgeneratemefastmath-with-tableclothhttpssciclojgithubiotablecloth">Composing <a href="https://github.com/generateme/fastmath">Fastmath</a> with <a href="https://scicloj.github.io/tablecloth">Tablecloth</a></h3>
<p>During this month, a few substantial design discussions took place in the Zulip chat, with quite a few community members helping with their insights. One of the important realizations was that we should integrate Fastmath (the math library) into Tablecloth (the user-friendly table-processing library). This will allow for better composability, ergonomics, and performance in various cases where data processing meets math and statistics.</p>
<h3 id="scittlehttpsgithubcombabashkascittle-emmy-viewershttpsgithubcommentat-collectiveemmy-viewers-plugin"><a href="https://github.com/babashka/scittle">Scittle</a> <a href="https://github.com/mentat-collective/emmy-viewers">Emmy-viewers</a> plugin</h3>
<p>Recently, @reedho has made some progress in the Scittle plugin that supports Emmy-viewers data visualizations. I was helping in testing and figuring out some of the details. This progress is expected to extend the reach of Emmy-viewers to a broader set of use cases and integrate it better into Scicloj workflows.</p>
<h3 id="clayhttpssciclojgithubioclay"><a href="https://scicloj.github.io/clay/">Clay</a></h3>
<p>Clay, the REPL-friendly notebook and data visualation tool, recieved a few new features:</p>
<ul>
<li>initial Emmy-viewers support</li>
<li>support for nesting of special visualization kinds</li>
<li>support for live-reload on file save by @whatacold</li>
</ul>
<p>Additionally, @a13 and I are working on improving the process of reading Clojure code, building on previous work by @timothypratley at the <a href="https://github.com/scicloj/read-kinds">read-kinds</a> project.</p>
<h3 id="kindly-advicehttpssciclojgithubiokindly-notedkindly_advice"><a href="https://scicloj.github.io/kindly-noted/kindly_advice">Kindly-advice</a></h3>
<p>Kindly-advice is a small library that helps tools know how certain values should be visualized.</p>
<p>Following the developments with Emmy-viewers, it can now recognize these automatically, so that tools can handle them appropriately.</p>
<h3 id="kindly-renderhttpsgithubcomsciclojkindly-render"><a href="https://github.com/scicloj/kindly-render">Kindly-render</a></h3>
<p>Kindly-render is a tool-agnosic implementation of the <a href="https://scicloj.github.io/kindly/">Kindly</a> standard.</p>
<p>During October, @timothypratley and @kpassapk kept working on this project. I started exploring its intergation into Clay.</p>
<h3 id="tutorials">Tutorials</h3>
<p>Documenting and demonstrating the use of the Scicloj stack is one of the main goals at the moment, and quite a few of us are working on various tutorials. This is often a slow process that involved introspection and discussion of the recommended ways to explain certain notions and perform certain tasks.</p>
<p>I was involved in writing some tutorials and in reviewing a few others.</p>
<p>A few of the current drafts people have been working on can already be shared:</p>
<ul>
<li><a href="https://mavbozo.github.io/clj-probstat-tutorial/">intro to probability and statistics</a> by @mavbozo</li>
<li><a href="https://scicloj.github.io/noj/noj_book.linear_algebra_intro.html">intro to linear algebra with Fastmath</a> by @radovanne</li>
<li><a href="https://scicloj.github.io/noj/noj_book.fastmath_vector_geom2d3d.html">2d and 3d geometry with Fastmath</a> by @radovanne and @Epidiah</li>
<li><a href="https://scicloj.github.io/noj/noj_book.echarts">intro to datavis with Apache Echarts</a> by @zuzhi and @whatacold</li>
<li><a href="https://scicloj.github.io/noj/noj_book.chicago_bike_times.html">analysing Chicago bike times</a> by myself</li>
<li><a href="https://scicloj.github.io/clojure-data-tutorials/projects/stats/pymc/intro.html">Bayesian statistics with PyMC</a> by myself</li>
</ul>
<h3 id="website">Website</h3>
<p>This month has been a usual month in terms of website maintenance.</p>
<h3 id="real-world-data-group">real-world-data group</h3>
<p>The <a href="https://scicloj.github.io/docs/community/groups/real-world-data/">real-world-data group</a> is a space for Clojure data practitioners to share their experiences. During October, the group had two meetings. We decided to share some parts of the recordings publicly:</p>
<ul>
<li>Oct 4th 2024 - meeting 15:
<ul>
<li><a href="https://www.youtube.com/watch?v=mmOh5fYkX7Q">Kyle Passarelli: OAuth2 with Clojure and Temporal</a></li>
<li><a href="https://www.youtube.com/watch?v=G1vpz_43YpI">Adham Omram: Experience Conducting a Clojure Training</a></li>
</ul>
</li>
<li>Oct 16th 2024 - meeting 16:
<ul>
<li><a href="https://www.youtube.com/watch?v=nC86hEglyLQ">Jarkko Saltiola: tools for pipelines, bb-glitchtip</a></li>
</ul>
</li>
</ul>
<h3 id="scicloj-weekly-catchup">Scicloj weekly catchup</h3>
<p>During October, we tried the approach of weekly group meetings for the open-source-mentoring program, in addition to the small and 1-1 meetings.</p>
<p>We had four group meetings of this kind. A few people have shared their work, and we explored some topics as a group. Eventually, we realized that the timing and format were not optimal for most people, so this series is currently on hold.</p>
<h3 id="linear-algebra-meetings">Linear Algebra meetings</h3>
<p>A few of use are working on tutorials related to linear algebra and vector processing, and have started meeting weekly on these topics. We had four meetings of this kind.</p>
<h3 id="clojure-conj">Clojure Conj</h3>
<p>Eventually, we organized only one talk run before the Clojure Conj conference. This was an early run of the talk by Thomas Clark. The actual talk has already been published <a href="https://www.youtube.com/watch?v=_D5d6Ls6pBw">online</a>. It is a fantastic overview of the Clojure stack for scientific computing.</p>
<p>On my side, I helped a little bit in the preparations for the talk.</p>
<h3 id="november-2024-goals">November 2024 goals</h3>
<h4 id="noj">Noj</h4>
<ul>
<li>Annouce Beta stage.</li>
<li>Continue the current efforts on documenting the libraries.</li>
</ul>
<h4 id="fastmath">Fastmath</h4>
<ul>
<li>Continue the documetation effort.</li>
</ul>
<h4 id="tablecloth">Tablecloth</h4>
<ul>
<li>Start working on drafts integrating Fastmath-related functionality.</li>
</ul>
<h4 id="tableplot">Tableplot</h4>
<ul>
<li>Annouce Beta stage after a minor changes.</li>
<li>Keep extending and documenting the library.</li>
</ul>
<h4 id="tooling">Tooling</h4>
<ul>
<li>Return to the work on kindly-render.</li>
<li>Explore improving the support of various tools for scientific Clojure. Most importantly: VSCode, Quarto, and Jupyter.</li>
<li>Continue Clay maintenance.  <br></li>
</ul>
<hr>
<h2 id="standard-clojure-style-chris-oakman">Standard Clojure Style: Chris Oakman</h2>
<p>Q3 2024 Report No. 2 (final), Published Dec. 3, 2024</p>
<blockquote>
<p>Standard Clojure Style is a project to create a &ldquo;follows simple rules, no config, runs everywhere&rdquo; formatter for Clojure code.</p>
</blockquote>
<h3 id="tldr">tl;dr</h3>
<ul>
<li>[Clojure/conj talk] was well received</li>
<li>[Standard Clojure Style is available in Lua] 🌙</li>
<li>several bugs found and fixed - thank you testers!</li>
<li><a href="https://tinyurl.com/43abayj2">try it online here</a></li>
</ul>
<h3 id="update">Update</h3>
<ul>
<li>
<p>I gave a 10-minute introduction and demo of Standard Clojure Style at Clojure/conj 2024</p>
<ul>
<li>you can <a href="https://www.youtube.com/watch?v=VhjxvEabOX0">watch the talk online here</a></li>
<li>the talk and project were well-received</li>
<li>thank you to everyone who said Hello and shared feedback 😁</li>
</ul>
</li>
<li>
<p>Standard Clojure Style is available as a <a href="https://github.com/oakmac/standard-clojure-style-lua">single-file Lua library</a></p>
<ul>
<li>hopefully this opens the door for more editor integrations</li>
<li>I am seeking an aspirational Neovim user to help make a Standard Clojure Style plugin 🤓</li>
</ul>
</li>
<li>
<p>As of [v0.18.0], Standard Clojure Style is ready for most codebases</p>
<ul>
<li>you can <a href="https://tinyurl.com/43abayj2">try it online here</a> (no purchase necessary 😜)</li>
<li>Give it a try on your codebase!</li>
</ul>
</li>
<li>
<p>Thank you to all the testers who ran Standard Clojure Style on your codebase and reported bugs 🙌</p>
<ul>
<li>If you want to help test, please see the instructions [in the README]</li>
</ul>
</li>
</ul>
<h3 id="next-up">Next Up</h3>
<ul>
<li>
<p>road to 1.0.0</p>
<ul>
<li>I want to stabilize the algorithm and release a v1.0.0</li>
<li>the target goal for this is in the next few months</li>
<li>here is the [punchlist of issues] currently blocking that release</li>
</ul>
</li>
<li>
<p>documentation and website are still needed</p>
<ul>
<li>I would like to create a website for the project in order to socialize the idea
and be a reference for teams who are deciding to to adopt a formatter tool</li>
</ul>
</li>
</ul>
<h3 id="thank-you">Thank you!</h3>
<p>Thank you to Clojurists Together for the funding and everyone who has contributed
kind words and encouragement for this project. Your support is greatly appreciated ♥️</p>
<p>More resources:
<a href="https://www.youtube.com/watch?v=VhjxvEabOX0">Clojure/conj talk</a><br>
<a href="https://github.com/oakmac/standard-clojure-style-lua">Standard Clojure Style is available in Lua</a><br>
<a href="https://github.com/oakmac/standard-clojure-style-js">in the README</a><br>
<a href="https://www.npmjs.com/package/@chrisoakman/standard-clojure-style">v0.18.0</a>
<a href="https://github.com/oakmac/standard-clojure-style-js/issues?q=is%3Aissue+is%3Aopen+label%3A%22v1+blocker%22">punchlist of issues</a>
<br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Vote on 2025 Long-Term Funding Applications</title>
      <link>https://www.clojuriststogether.org/news/vote-on-2025-long-term-funding-applications/</link>
      <pubDate>Mon, 25 Nov 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/vote-on-2025-long-term-funding-applications/</guid>
      <description>It Is Up To You to Decide Who Will Receive Funding.</description>
      <content:encoded><![CDATA[<p>Greetings Clojurists Together Members! This year, we are trying a new process to determine who will receive a monthly stipend of $1,500 to support their development work.</p>
<p>We put out the call  - and we received 18 thoughtful applications for you to consider. You can also review past long-term project updates on our <a href="https://www.clojuriststogether.org/news/">website</a> to get an idea of what past long-term grant recipients have been able to accomplish with your past support (pretty amazing!)</p>
<p>Please review the applications below and select 5 developers to receive funding in 2025. Be on the lookout for an email that contains the link to your Ranked Vote ballot. Here we go ..in alphabetical order (by last name)&hellip;.</p>
<h3 id="deadline-for-your-vote-to-be-counted-december-4-2024-midnight-pacific-time">Deadline for your vote to be counted: December 4, 2024 Midnight Pacific Time</h3>
<p>-<a href="#michiel-borkent">Michiel Borkent</a><br>
-<a href="#thomas-clark">Thomas Clark</a><br>
-<a href="#jeremiah-coyle">Jeremiah Coyle</a><br>
-<a href="#toby-crawley">Toby Crawley</a><br>
-<a href="#eric-dallo">Eric Dallo</a><br>
-<a href="#rafal-dittwald">Rafal Dittwald</a><br>
-<a href="#dragan-djuric">Dragan Djuric</a><br>
-<a href="#robert-gersak">Robert Gersak</a><br>
-<a href="#kira-howe-mclean">Kira Howe</a> (McLean)<br>
-<a href="#roman-liutikov">Roman Liutikov</a><br>
-<a href="#mateusz-mazurczak-and-anthony-caumond">Mateusz Mazurczak and Anthony Caumond</a><br>
-<a href="#jack-rusher">Jack Rusher</a><br>
-<a href="#daniel-slutsky">Daniel Slutsky</a><br>
-<a href="#adrian-smith">Adrian Smith</a><br>
-<a href="#peter-str%C3%B6mberg">Peter Strömberg</a><br>
-<a href="#dan-sutton">Dan Sutton</a><br>
-<a href="#peter-taoussanis">Peter Taoussanis</a><br>
-<a href="#oleksandr-yakushev">Oleksandr Yakushev</a>   <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p><a href="https://github.com/borkdude">https://github.com/borkdude</a></p>
<p><strong>What do you plan to work on throughout the year?</strong>
My main projects are clj-kondo, babashka / SCI, and squint/cherry. I will develop new features, specified below per project. As usual I&rsquo;ll also work on ongoing maintenance and offering support on Slack and Github.</p>
<p>Links:
<a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>, <a href="https://github.com/babashka/babashka">babashka</a>, <a href="https://github.com/babashka/sci">SCI</a>, <a href="https://github.com/squint-cljs/squint">squint</a></p>
<h4 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h4>
<ul>
<li>Linter for partially extended protocols</li>
<li>Extend :discouraged-var to allow specifying arities</li>
<li>Ongoing maintenance, there&rsquo;s always plenty to do! See the project board and see here for a list of most upvoted issues</li>
<li>Experiment with adding the notion of a project classpath such that command line linting becomes easier. Possibly configurations could be read from the classpath as well.</li>
<li>As clj-kondo is the foundation for the static analysis in clojure-lsp: improvements in the interaction between the two, most specifically the analysis data.</li>
</ul>
<h4 id="babashka--scihttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka / SCI</a></h4>
<ul>
<li>Maintenance of included bb libraries: SCI, babashka.fs, babashka.process, deps.clj, babashka.http-client, edamame</li>
<li>Babashka tasks: prefix parallel prcoess output such that you can distuingish tasks</li>
<li>Better error locations for clojure.test output (<a href="https://github.com/babashka/babashka/issues/1518">https://github.com/babashka/babashka/issues/1518</a>)</li>
<li>Report exception causes in console error report (<a href="https://github.com/babashka/babashka/issues/1515">https://github.com/babashka/babashka/issues/1515</a>)</li>
<li>Several other issues: <a href="https://github.com/babashka/babashka/issues">https://github.com/babashka/babashka/issues</a></li>
</ul>
<h4 id="squint-and-cherryhttpsgithubcomsquint-cljssquint"><a href="https://github.com/squint-cljs/squint">Squint (and cherry)</a></h4>
<ul>
<li>Browser REPL support</li>
<li>Source map support (some work has been done, but far from finished)</li>
<li>Increase overall compatibility with CLJS</li>
<li>Support dependencies from the ClojureScript ecosystem from clojars and git depsAll other related projects</li>
<li>Nbb, jet, scittle, neil, edamame, rewrite-edn, carve</li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong>
Babashka is used by 90% of Clojure Survey respondents as shown in Alex Miller&rsquo;s Conj 2024 talk. Babashka and clj-kondo have 4.1k and 1.7k stars on Github respectively, their slack channel on Clojurians have almost 1800 + 1000 users. Clj-kondo and babashka are used by a large portion of the community. I think it&rsquo;s fair to say they are established project.</p>
<p><strong>Is there anything else you would like us to know?</strong> Thank you so much for Clojurists Together and keeping the Clojure OSS ecosystem sustainable!  <br></p>
<hr>
<h2 id="thomas-clark">Thomas Clark</h2>
<p><a href="https://clojurians.zulipchat.com/#user/386018">https://clojurians.zulipchat.com/#user/386018</a></p>
<p><strong>What do you plan to work on throughout the year?</strong>
In a nutshell, my plan would be to help expand <a href="https://www.youtube.com/watch?v=_D5d6Ls6pBw">Clojure&rsquo;s scientific ecosystem</a>, particularly in regards to the mathematical sciences. This would take the form of developing and creating libraries, continuing and creating documentation and to initiate a serious attempt at academic outreach.</p>
<h4 id="libraries">Libraries</h4>
<h4 id="wolframite">Wolframite</h4>
<p>Last year, CT supported Jakub Holy and I for a quarter in our attempt to resurrect and document the Wofram-Clojure bridge. We&rsquo;re very happy with the progress we made in this time, but of course there are many other things that could (and should?) be done - we really feel like we&rsquo;re just getting started. In particular, a key feature of Wolframite, that is missing in Wolfram itself, is the REPL experience.</p>
<p>In this, we want to fully integrate Wolframite with Clojure&rsquo;s visual tools for all manner of datatypes that Wolfram supports. And in particular, to make data passing and memory management efficient. More functionally, we want to create a special viewer for symbolic expressions, that not only allows the user to copy and switch between maths in Wolfram, LisP and TeX forms but that automatically generates sliders for each parameter for exploration, as inspired by <a href="https://reference.wolfram.com/language/ref/Manipulate.html">Wolfram&rsquo;s Manipulate function</a>.</p>
<h4 id="exp-name-to-be-decided">exp (name to be decided)</h4>
<p>In Clojure, there are now two libraries to interact with symbolic expressions and this new project would seek to integrate them: both Wolframite and Emmy. This would be powerful because although Emmy brings symbolic manipulation to Clojure and Clojurescript simultaneously, it is still missing many key features and algorithms that only Wolfram can provide. One can then imagine a situation where mathematical problems could be defined and explored in the browser (Emmy), passed to the server to be simplified algebraically (Wolframite) and then crunched numerically (Emmy).</p>
<p>Not only would this bridge two existing libraries but it might even lay the foundation for developing a standard for representing equations more generally.</p>
<h4 id="scicloj">SciCloj</h4>
<p>More generally, there are many SciCloj libraries that I have been involved with and so with funding I would happily step up my contributions.</p>
<p>I can particularly see a lot of scope in the further development of <code>Clay</code>. I have particular notions regarding it&rsquo;s use for generating presentations and can imagine creating a specific API around this purpose. I can also imagine it being the first visual tool with which I could create the special equation viewer mentioned above.</p>
<p>Also in regards to <code>tableplot</code>. Specifically, I would like to be involved in its generalization to deal with 3D plotting as I have a lot of specific use cases in this area.</p>
<p>Another area of interest at the moment is in improving the SciCloj API for working with common matrix operations (specifically the generation and manipulation of Hadamard-like matrices). This is an open area and it&rsquo;s not clear whether this will be abstracted into a separate library or wheter this would be an extension of dtype-next.</p>
<h4 id="documentation">Documentation</h4>
<p>Another big area of focus would be improving SciCloj documentation, at both the library and project level.</p>
<h4 id="libraries-1">Libraries</h4>
<p>Putting aside the libraries that I have contributed code to, there are many SciCloj libraries that I use that I would be happy to contribute documentation. A bridging example would be regarding a Clojure-Blender bridge. Although I started to develop a new library for this, basilisp-blender has emerged as potentially a stronger candidate and so I would like to make detailed tutorial examples of creating &lsquo;scientific&rsquo; outputs using this.</p>
<h4 id="projects">Projects</h4>
<p>As discovered while writing the <a href="https://scicloj.github.io/wolframite/for_scientists.index.html">Wolframite documentation</a> what is often needed is not so much a manual but examples of how to use the tool (or how to integrate many tools) in a real project. With this in mind, I would like to document the overall process of how to use the ecosystem to solve real problems, supplying both real problems and real solutions, e.g. the source and details behind my <a href="https://www.youtube.com/watch?v=SE5Ge4QP4oY">past talk</a> and large contributions to <a href="https://github.com/scicloj/noj">noj</a>.</p>
<h4 id="outreach">Outreach</h4>
<p>Outside of building library bridges to Clojure for specialist academic projects as well as collecting SciCloj talk sources in a centralised location, I would make a concerted effort to reach out to non-Clojure scientists about the benefits of Clojure.</p>
<p>Where I might have an advantage here is that I am a scientist before I am a programmer and so have direct connections into a world where very few people have heard of the language. With funding (see the biases section for why) I could potentially give department seminars at different institutions as well as international and online conferences: using existing academic contacts.</p>
<p>Furthermore, something that I am particularly excited about, I have started to initiate a grouping of research-minded Clojurians to consider publishing papers in the field. With the right support, I think this could really help raise awareness.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I guess I should really have checked the following questions before filling up the previous box&hellip; :)</p>
<p>In regards to library creation and expansion, I think that scientific computing is an exciting growth area for Clojure. It is an area that really benefits from Clojure&rsquo;s key principles and one that already has a growing number of users: users who will benefit from the changes. It is also an area that is at a tipping point in regards to reaching practical parity with other key languages and the tools that I would like to focus on are not so much now about matching competitors, but rather about providing new features and features that lead towards a completely integrated ecosystem: something that I would like to find, no matter which language provided it!</p>
<p>The Emmy system in particular is bringing open-source symbolic computation to both the back- and front-ends but it is missing key features and advanced libraries. A Wolfram-Emmy bridge could serve as a sure foundation and help create the real possibility of an almost unique physics programming space.</p>
<p>This work would also be important in regards to expanding the community itself. Following on from above, there is a large section of the numerical scientific community who are not programmers but who rely on tools like Mathematica and Matlab and so interop in these areas will be crucial for community cross-over in the future. Generalized language interop is particularly important for safe onboarding of new users and experience suggests that there is a willing &lsquo;market&rsquo; for integrating specialist tools within more comfortable general languages like Clojure.</p>
<p>Beyond this however, the interactive development and documentation experience that is available now is a solution that simply needs to be shown to scientists' problems. The proposal to organise academic publishing and presentation of what the Clojure experience is like feels like an important stepping stone to the future.</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong><br>
Depending on what you mean by &lsquo;systemic bias&rsquo;, my disadvantage is a classical one. Living in eastern Europe and working in the public sector, I suspect my Clojure friends would be shocked at what is paid to scientists here. I don&rsquo;t pretend that Hungary is as cash-strapped as some other continental countries, but compared to most other countries in &lsquo;the west&rsquo;, even those a two hour drive away, the salaries are low. If it helps, I can be more specific, but suffice it to say that this funding would go much further here and would enable a much bigger shift in what I&rsquo;m able to contribute than it would for many other applicants.<br></p>
<hr>
<h2 id="jeremiah-coyle">Jeremiah Coyle</h2>
<p><a href="https://github.com/paintparty">https://github.com/paintparty</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
These are the 5 projects that I am planning to work on throughout the year :)
All are fairly mature alpha-stage projects.  Kushi and Fireworks have already been announced. I plan to announce the  latest Fireworks release, and the other 3, over the next few weeks.</p>
<h4 id="1---kushi">#1 - Kushi</h4>
<p><a href="https://kushi.design/">Kushi</a> is a base for building web UI with ClojureScript.</p>
<p><strong>Goals for Kushi in 2025:</strong></p>
<ul>
<li>Universal transpiler for kushi UI components to automatically generate components for established ClojureScript UI Rendering frameworks such as Uix, Helix, Biff, shadow-grove, etc.</li>
<li>Add a quickstart repo for each supported framework Uix, Helix, Biff, shadow-grove etc., with a deluxe todo-mvp/kitchen sink example set to make it very easy to cut and paste working UI.</li>
<li>Browser-based interactive design tweaking, with round trip to file system.</li>
<li>Add more functionality, docs, and examples for working with the <code>kushi.playground</code> namespace. This gives the user a very elegant way to build their own white-labeled interactive documentation site that features Kushi’s components as well as any custom components specific to their project. It is similar to Storybook.js or Portfolio (cjohansen/portfolio). The playground namespace was used to create the current project website at kushi.design.</li>
<li>Design and implement 4-5 global themes, using a variety of styles. In order to show off the power of the new theming system, I would like to add at least a couple very playful themes (sci-fi, fantasy-rpg) and incorporate them via a theme switcher into the kushi.design site.</li>
<li>Add additional ui library components. Components followed by an asterisk are internally complete and just need to be turned into public functions with documentation:
<ul>
<li>Avatar*</li>
<li>Tabs*</li>
<li>Blockquote</li>
<li>Treeviewer</li>
<li>Carousel</li>
<li>Dropdown menu</li>
<li>Context menu (right-click)</li>
<li>Table</li>
<li>Data List</li>
<li>More card layouts (with inset margins)</li>
<li>Keyboard input / hotkey e.g. <code>⌘ C</code> styled as button</li>
<li>Aspect Ratio (displays content within a desired ratio)</li>
<li>Wrapper for native color picker input</li>
</ul>
</li>
</ul>
<h4 id="2-domo">#2 Domo</h4>
<p><a href="https://github.com/kushidesign/domo">Domo</a> is a modern ClojureScript DOM utility library.</p>
<p><strong>Goals for Domo in 2025:</strong></p>
<ul>
<li>Curate the current API of approximately 75 public functions</li>
<li>Write docstrings for all public functions</li>
<li>Add simple validation and dev-time warnings for all public functions</li>
<li>Figure out best approach for automated test suite</li>
<li>Leverage kushi.playground to create interactive documentation</li>
</ul>
<h4 id="3---fireworks">#3 - Fireworks</h4>
<p><a href="https://github.com/paintparty/fireworks">Fireworks</a> is a themeable tapping library and color pretty-printing engine.</p>
<p><strong>Goals for Fireworks in 2025:</strong></p>
<ul>
<li>Solidify current public API</li>
<li>Address all 12 current issues (mostly enhancements)</li>
<li>Publish editor plugins/extensions for Emacs and VS Code. These are fairly simple extensions that just involve some basic clj-rewrite functionality for wrapping/unwrapping forms. I&rsquo;ve already created initial working versions of both (emacs and VSCode) locally.</li>
<li>Produce written and/or video documentation of my current live hot-reloading dev environment for JVM Clojure, with versions for both Leiningen and Deps. I recently issued a PR to add this to <a href="https://github.com/jakemcc/test-refresh/pull/91">test-refresh</a>. This sort of thing could also potentially be incorporated into other similar projects such as metabase/hawk and tonsky/clj-reload.</li>
<li>For ClojureScript developers using Fireworks in a browser dev console, I went off the deep-end and made a dedicated Chrome extension to enable the setting of the Chrome DevTools console background and foreground color with a very nice GUI interface. Would be cool to get this working in most other Chromium-based browsers, and potentially Firefox, if there is any demand for it.</li>
<li><a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#setting-the-background-color-and-font-in-chrome-devtools-clojurescript">https://github.com/paintparty/fireworks?tab=readme-ov-file#setting-the-background-color-and-font-in-chrome-devtools-clojurescript</a></li>
</ul>
<h4 id="4---bling">#4 - Bling</h4>
<p><a href="https://github.com/paintparty/bling">Bling</a> is a library for rich text in the console</p>
<p><strong>Goals for Bling in 2025:</strong></p>
<ul>
<li>Support automatic detection of the 3 levels of color support (16-color, 256-color, or Truecolor), using an approach similar to <a href="https://github.com/chalk/supports-color">https://github.com/chalk/supports-color</a></li>
<li>Support arbitrary hex colors, and their conversion, if necessary, to 256. I’ve already created an efficient Manhattan distance algorithm for doing <a href="https://github.com/paintparty/fireworks/blob/035ec4cb048db05f4cca3691f946931b3a87f624/src/fireworks/color.cljc#L26">this conversion in Fireworks</a></li>
<li>Create more formatting templates for callouts, headers, and points-of-interest</li>
<li>Add documentation about how to leverage Bling to create great-looking warnings and errors in any project. Example of using bling&rsquo;s templates to create nice warnings can be <a href="https://github.com/paintparty/fireworks?tab=readme-ov-file#helpful-warnings-for-bad-option-values">found here:</a></li>
<li>Add documentation about using Bling in conjunction with existing libraries which format Spec and Malli messages into human readable form.</li>
<li>Although lower priority, it would be fun to explore enhancing the flexibility and utility of bling.core/stack-trace-preview, and exposing it as a public function, as it may be a cheap way to get give some additional context to many kinds of error messages.</li>
</ul>
<h4 id="5-lasertag">#5 Lasertag</h4>
<p><a href="https://github.com/paintparty/lasertag">Lasertag</a> is a utility for categorizing types of values in Clojure, ClojureScript, and Babaskha.</p>
<p><strong>Goals for Lasertag in 2025:</strong></p>
<ul>
<li>Solidify current public API</li>
<li>Extensive coverage for all Java and Javascript types/classes</li>
<li>Extensive test suite for all types and classes</li>
<li>Leverage kushi.playground to make cool demo for usage in ClojureScript</li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I believe work on these projects could benefit the Clojure community for the following reasons (listed out project-by-project):</p>
<p><a href="https://kushi.design/"><strong>#1 - Kushi</strong></a> <br>
Kushi aims to provide a complete solution to the design layer of web UI projects.</p>
<p>It is an ambitious project, but I believe there is an opportunity for Kushi to offer a UI dev experience that is unique and more compelling than any equivalent in any other language. This could lead to increased organizational awareness and consideration of ClojureScript as an attractive choice for building mission-critical UI. If more companies used ClojureScript to build UI, I think it would be very beneficial for the community.</p>
<p><a href="https://github.com/kushidesign/domo"><strong>#2 - Domo</strong></a> <br>
This lib has been slow-cooking over a couple years to serve various web projects, including Kushi.</p>
<p>The syntax is very Clojure-y, and feels much nicer than writing gnarly JS interop code.
To my knowledge, there are only a few ClojureScript DOM libs (Dommy, Enlive, Enfocus), and all were written 9-10 years ago.</p>
<p>Compared to these libs, Domo offers even more specific functionality such as:</p>
<ul>
<li>copy-to-clipboard</li>
<li>Getting viewport information</li>
<li>Geometry for elements</li>
<li>Getting screen quadrant for element or event</li>
<li>Attribute querying and manipulation</li>
<li>Computed styles of elements</li>
<li>Adding, removing, and toggling attributes and classes</li>
<li>Optional zipper-like syntax for selecting elements</li>
<li>matches-media? helpers</li>
<li>a11y-friendly on-mouse-down helper (faster alternative to on-click)</li>
<li>Helper for keyboard-based tab navigation</li>
<li>&amp; much more!</li>
</ul>
<p><a href="https://github.com/paintparty/fireworks"><strong>#3 - Fireworks</strong></a></p>
<p>Fireworks is the only lib to provide a colorizing and themeable pretty-printer that works beautifully in both Clojure and ClojureScript (and Babashka).</p>
<p>The output is, arguably, orders of magnitude faster and easier to read than equivalent output from clojure.pprint/pprint. This is especially true in the case of maps with data-structures as keys, or any kind of collection that features metadata.</p>
<p>The library also provides very powerful debugging and tapping macros. These macros provide a lightweight complement to discovery-centric, UI-heavy data exploration tools such as Portal and Flowstorm. With a simple hot-reloading setup (in clj or cljs), and minimal editor integration, Fireworks can drive an extremely compelling live-feedback dev experience without any reliance on a repl connection, or repl-related concepts. I think the continued codification, documentation, and demonstration of such a workflow could make a difference in bringing new people to Clojure. The maturation of this kind of workflow could also benefit existing users of community tools such as playback, debux, hashp, telemere, ken, spyscope, omni-trace, postmortem, and sayid.</p>
<p><a href="https://github.com/paintparty/bling"><strong>#4 - Bling</strong></a></p>
<p>Many mature language communities have a library for rich text printing in the terminal, for example Rich (Python), Chalk (JS), LipGloss (Go), etc.</p>
<p>With Clojure, the main existing option seems to be org.clj-commons/pretty. The original impetus for creating Bling came out of my experience of trying to use this lib extensively for formatting error and warning messages.</p>
<p>The most unique thing that Bling offers is a carefully curated palette of 11 basic colors which are readable on both light and dark backgrounds. Because these colors are located in the 16-255 ansi range, they are guaranteed to look the same on almost any terminal, regardless of the user&rsquo;s theme. Most libraries leave the colorizing up to the user&rsquo;s emulator profile/theme, which often leads to wildly different colorized output in the user space.</p>
<p>Bling also offers two simple functions for creating blocks of text in the console. Check out the readme for exhaustive visual examples. These can be semantically colored (errors, warnings, info). Bling also offers a simple function for constructing a point-of-interest diagram, like when you want to call out the namespace, line, column and show some source code with a red squiggly underline. I think the Clojure community would benefit from more library authors adding neatly-formatted, actionable warning and error messages to their codebases. It would also be great if such warnings and messages where formatted in a way that loosely followed some set of conventions. Perhaps Bling could play a small role in fostering this within the Clojure community.</p>
<p><a href="https://github.com/paintparty/lasertag"><strong>#5 - Lasertag</strong></a></p>
<p>Lasertag is a utility library that was spun out of Fireworks. I believe it to be quite unique in the current landscape of cljc libraries that deal with reflection and categorization of values.<br>
Lasertag makes it easy to get detailed information about values, particularly in the context of interop with <a href="https://github.com/paintparty/lasertag?tab=readme-ov-file#instance-methods-on-javascript-built-ins">Java or JavaScript. See this section of the readme for an example</a>.</p>
<p>I think that Lasertag could potentially offer great utility to rich-tooling projects developed in the Clojure community of the present and future.</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong> Although I did not study computer science,  I do think of myself as an individual with a unique perspective and something to offer.  <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<p>tobias</p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
<a href="https://github.com/clojars/">https://github.com/clojars/</a></p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Clojars provides critical infrastructure to the Clojure community. This funding would cover routine maintenance and adding new features as needed.  <br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>@ericdallo</p>
<p><strong>What do you plan to work on throughout the year?</strong>
I want to dedicate more time on big features for anything related to the Clojure LSP ecosystem, this includes: clojure-lsp and all integrations with editors, intellij, calva, lsp-mode, and so on.
Also, I want to improve the IntelliJ experience to be as good as Cursive, improving clojure-repl-intellij and clojure-lsp-intellij projects so we can have good options for LSP in any editors.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Because with that everyone coding Clojure will be using the same features improving dev xp.  <br></p>
<hr>
<h2 id="rafal-dittwald">Rafal Dittwald</h2>
<p><a href="https://github.com/clojure-camp/">https://github.com/clojure-camp/</a></p>
<p><strong>What do you plan to work on throughout the year?</strong></p>
<h4 id="clojure-camp">Clojure Camp</h4>
<p>My primary focus will be on our <a href="https://map.clojure.camp">topic map</a>, particularly, creating an interface to add Clojure resources from around the web and link them to learning outcomes. Later, crowd-sourcing submissions and doing some of that linking manually. Also exploring using LLMs to automate of that process.</p>
<p>Additionally, I would like to mentor community contributions to other resources at Clojure Camp: developing faded example / parson&rsquo;s problems for our library of <a href="https://exercises.clojure.camp">exercises</a>; a badge system; and improvements to our pairing scheduling tool and mob programming tool. I will offer up some of the  funding as bounties for our community members.</p>
<p>And of course, I will continue to run regular mob sessions and stewarding the community.</p>
<p>I maintain a list of &ldquo;TODOs&rdquo; in this <a href="https://docs.google.com/spreadsheets/d/1XTuw3E5Eu28hX3jtuDeI0bS5PhNRNl5z0mpZ9KEtGFk/edit?gid=0#gid=0">spreadsheet:</a></p>
<p><a href="https://www.youtube.com/watch?v=xOPoYHxZjdc&amp;t=5s">Jordan and I presented</a> a Clojure Camp update at the Conj.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Clojure has sustained itself, so far, as a language (and community) &ldquo;for experts, by experts.&rdquo; But for long term sustainability, we should be open to exploring other avenues for people to enter the Clojure-verse.</p>
<p>Clojure Camp aims to offer a learning experience to support would-be Clojure developers currently under-served by existing offerings. We achieve this by:</p>
<ul>
<li>translating best practices of pedagogical research of teaching programming to Clojure</li>
<li>fostering a welcoming community of learners and mentors</li>
<li>providing supportive infrastructure to motivate learning  <br></li>
</ul>
<hr>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p><a href="https://dragan.rocks/">https://dragan.rocks/</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
My goal with this funding in 2025 is to support Apple silicon (M cpu) in Neanderthal
(and other Uncomplicate libraries where that makes sense and where it&rsquo;s possible).</p>
<p>This will hugely streamline user experience regarding high performance computing in Clojure for Apple macOS users, which is a considerable chunk of Clojure community. They ask for it all the time, and I am always sorry to tell them that I still don&rsquo;t have a solution. Once upon a time, Neanderthal worked on Mac too, but then Apple did one of their complete turnarounds with M1&hellip; This basically broke all number crunching software on macs, and the world is slow to catch up.</p>
<p>Several Clojure developers started exploring high performance computing on Apple, but didn&rsquo;t get too far; it&rsquo;s LOTS of functionality. So, having Neandeathal support Apple would enable several Clojure data processing communities to leapfrog the whole milestone
and concentrate on more high-level tasks.</p>
<p>This affects Neanderthal (matrices &amp; vectors), and Deep Diamond (tensors &amp; deep learning) the most. Nvidia&rsquo;s CUDA is not physically available on Macs at all, while OpenCL is discontinued in favor of Apple&rsquo;s proprietary Metal (and who knows what else they&rsquo;ve came up with since).</p>
<p><strong>Neanderthal</strong> is a Clojure library for fast matrix computations based on the highly optimized native libraries and computation routines for both CPU and GPU. It is a lean, high performance, infrastructure for working with vectors and matrices in Clojure, which is the foundation for implementing high performance computing related tasks, including, but not limited to, machine learning and artificial intelligence.</p>
<p>Deep Diamond is a tensor and deep learning Clojure library that uses Neanderthal and ClojureCUDA under the hood (among other things).</p>
<p>So, what are the missing parts for Apple silicon?</p>
<ol>
<li>A good C++/native interop. That is more or less solved by JavaCPP, but their ARM support is still in its infancy, especially regarding distribution. But it is improving.</li>
<li>A good BLAS/LAPACK alternative. There&rsquo;s OpenBLAS, and there&rsquo;s Apple&rsquo;s Accelerate. Both support only a part of Intel&rsquo;s MKL functionality. But, if we don&rsquo;t insist on 100% coverage (we&rsquo;re not) and are willing to accept missing operations to be slower, I could implement the most important ones in Clojure if nothing else is available.</li>
<li>A good GPU computing alternative. CUDA is not supported on Apple, and OpenCL has been discontinued by Apple. So that leaves us with Apple&rsquo;s Metal, which is a mess (or so I hear). So I wouldn&rsquo;t put too much hope on GPU, at the moment. Maybe much, much, later, with much, much, more experience&hellip;</li>
<li>Assorted auxiliary operations that are not in BLAS/LAPACK/Apple Accelerate, which are usually programmed in C++ in native-land. I&rsquo;d have to see how many appear, and what I have to do with them.</li>
<li>Explore what&rsquo;s the situation related to tensors and deep learning on Apple. I doubt that Intel&rsquo;s DNNL can cover this, but who knows. Also, Apple certainly supports something, but how compatible it is with cuDNN and DNNL, is a complete unknown to me&hellip;</li>
<li>Who knows which roadblocks can pop up.</li>
</ol>
<p>So, there&rsquo;s a lots of functionality to be implemented, and there&rsquo;s a lots of unknowns.</p>
<p>I propose to * Implement an Apple M engine for Neanderthal.* This involves:</p>
<ul>
<li>buying an Apple M2/3 Mac since I don&rsquo;t have it (the cheapest M3 in Serbia is almost 3000 USD with VAT).</li>
<li>learning enough macOS tools (Xcode was terrible back in the days) to be able to do anything.</li>
<li>exploring JavaCPP support for ARM and macOS.</li>
<li>exploring relevant libraries (OpenBLAS may even work through JavaCPP).</li>
<li>exploring Apple Accelerate.</li>
<li>learning enough JavaCPP tooling to be able to see whether it is realistic that I build Accelerate wrapper (and if I can&rsquo;t, at least to know how much I don&rsquo;t know).</li>
<li>I forgot even little C/C++ that I did know back in the day. This may also give me some headaches, as I&rsquo;ll have to quickly pick up whatever is needed.</li>
<li>writing articles about relevant topics so Clojurians can pick this functionality as it arrives.</li>
</ul>
<p>It may include implementing Tensor &amp; Deep Learning support for Apple in Deep Diamond, but
that depends on how far I get with Neanderthal. I hope that I can do it, but can&rsquo;t promise it.</p>
<p>By the end of 2025, I am fairly sure that I can provide Apple support for Neanderthal (and ClojureCPP) and I hope that I can  even add it for Deep Diamond.</p>
<p>Projects directly involved:
<a href="https://github.com/uncomplicate/neanderthal">https://github.com/uncomplicate/neanderthal</a><br>
<a href="https://github.com/uncomplicate/deep-diamond">https://github.com/uncomplicate/deep-diamond</a><br>
<a href="https://github.com/uncomplicate/clojure-cpp">https://github.com/uncomplicate/clojure-cpp</a></p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
This will hugely streamline user experience regarding high performance computing in Clojure for Apple macOS users, which is a considerable chunk of Clojure community. They ask for it all the time, and I am always sorry to tell them that I still don&rsquo;t have a solution since I don&rsquo;t have a recent Mac hardware. Once upon a time, Neanderthal worked on Mac too, but then Apple did one of their
complete turnarounds with M1&hellip; This basically broke all number crunching software on macs, and the world is slow to catch up.</p>
<p>Several Clojure developers started exploring high performance computing on Apple, but didn&rsquo;t get too far; it&rsquo;s LOTS of functionality. So, having Neandeathal support Apple would enable several Clojure data processing communities to leapfrog the whole milestone
and concentrate on more high-level tasks.</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong><br>
The major obstacle that I have is that I live in a country outside USA and EU, so most work opportunities are unavailable from here (Serbia is a small country with poor economy that is still recovering from civil wars and whatnot, and the local IT market is mostly based on outrourcing). Other than that, I guess I&rsquo;m in a similar position like everyone else.<br></p>
<hr>
<h2 id="robert-gersak">Robert Gersak</h2>
<p><a href="https://github.com/gersak">https://github.com/gersak</a></p>
<p><strong>What do you plan to work on throughout the year?</strong>
<a href="https://github.com/neyho/eywa-core">https://github.com/neyho/eywa-core</a></p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
This project is about providing sane approach to identity access management based on OAuth2.1 specification and OpenID connect, specification that is common standard for identity management across professional services. ( it is important for everyone)</p>
<p>In addition, this project provides Data Modelling with out of the box GraphQL generic API exposure, that can be managed and controlled through UI. In terms of modelling entities and relations and what role can read, write, delete or own some entity or relation.</p>
<p>Currently this is applicable to PostgreSQL DB, but in future more similar DB will be covered.</p>
<p>Summary would be that this project is well suited for rapid development as well as for minimizing maintenance and change cost. It is fusion of IAM, Data Modelling and replacement for CRUD approach.</p>
<p><strong>Is there anything else you would like us to know?</strong> I would like to share that IAM has been one of important subjects when working on enterprise level projects. Project applied above helped us in many ways to overcome enterprise level presence and onboard people towards common goal through usage of Data Modeling <br></p>
<hr>
<h2 id="kira-howe-mclean">Kira Howe (McLean)</h2>
<p><a href="http://github.com/kirahowe">http://github.com/kirahowe</a></p>
<p><strong>What do you plan to work on throughout the year?</strong>
I would like to continue working on stewarding Clojure&rsquo;s data science ecosystem into a state of maturity. This would include specifically working on developing ggclj (a grammar of graphics implementation in Clojure &ndash; <a href="https://github.com/kirahowe/ggclj">https://github.com/kirahowe/ggclj</a>) guides and tutorials for Clojure&rsquo;s data science stack (including the Clojure data cookbook and Clojure Tidy Tuesdays,https://github.com/scicloj/clojure-data-cookbook or <a href="https://github.com/kirahowe/clojure-tidy-tuesdays">https://github.com/kirahowe/clojure-tidy-tuesdays</a> and conference talks. I would like to pitch some talks to broader data-focused conferences in 2025 outside the Clojure community in hopes of reaching a broader audience. These would include at least PyData Global, Fossdem, Open Data Science Conference, and Lambda world.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
I think this work will help expand Clojure&rsquo;s user base and reach new audiences who can benefit from the unique tools and approaches Clojure brings to some of the biggest problems in data science today.</p>
<p><strong>Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?</strong>  I&rsquo;m female and feel women are underrepresented in tech and especially in open source.  <br></p>
<hr>
<h2 id="roman-liutikov">Roman Liutikov</h2>
<p><a href="https://github.com/roman01la">https://github.com/roman01la</a></p>
<p><strong>What do you plan to work on throughout the year?</strong> <a href="https://github.com/pitch-io/uix">https://github.com/pitch-io/uix</a></p>
<p><strong>Why is this work important to the Clojure community?</strong> UIx is one of the most dev friendly React wrappers, currently used by a number of companies known in Clojure community, including Pitch, Metosin and Cognician. UIx builds on  modern React and encourages to rely more on existing React ecosystem in JS world. The library was in particular developed to be beginner friendly and close to React conceptually so that Clojure companies could onboard JavaScript developers quicker, allowing them to reuse most of their experience from JS/React world. I think UIx succeeded at this, at least judging based on feedback from companies mentioned above.</p>
<p>Both Pitch and Cognician hired frontend folks from JS community and they were able to pick up UIx relatively quickly. I also gave a talk on UIx at <a href="https://youtu.be/4vgrLHsD0-I?si=RPs7AS4IVDA56WWo">London Clojurians</a><br>
I have a couple of ideas on improving the library further, preparing for React v19, also documentation needs more work and interactive examples. In general today after some years UIx is pretty stable, now I want to invest more in learning materials and templates for various types of projects, to make the library more accessible to devs. <br></p>
<hr>
<h2 id="mateusz-mazurczak-and-anthony-caumond">Mateusz Mazurczak and Anthony Caumond</h2>
<p><a href="https://github.com/Kaspazza">https://github.com/Kaspazza</a><br>
<a href="https://caumond.com/#/">https://caumond.com/#/</a></p>
<p><strong>What do you plan to work on throughout the year?</strong>
We are planning to work on discrete event simulation and discrete optimization.<br>
Planning to add:</p>
<ul>
<li>A data oriented language to be able to model simulation by non-technical people.</li>
<li>Add scenario management for creating multiple simulations.</li>
<li>Add rendering module to give the highest possible quality insights to the modeler about the behavior of a model</li>
</ul>
<p>Project name: Automaton simulation discrete event<br>
Link: <a href="https://github.com/hephaistox/automaton-simulation-de">https://github.com/hephaistox/automaton-simulation-de</a></p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
First, as a little introduction:<br>
We have over two decades of expertise in the supply chain on board and a decade of software development with software craftsmanship in our hearts. We plan to create it as an open-source alternative to existing solutions (like Rockwell Arena <a href="https://www.rockwellautomation.com/en-us/products/software/arena-simulation.html">https://www.rockwellautomation.com/en-us/products/software/arena-simulation.html</a> or <a href="https://www.anylogic.com/">https://www.anylogic.com/</a></p>
<p>With the difference, that thanks to Clojure and data-centric approach our software will be at much higher flexibility.<br>
This is crucial for this kind of software, as each supply-chain industry&rsquo;s needs for simulation are different. So current off-the-shelf software is either not flexible enough for their usage or to expensive to adapt (ranging in millions of euro).</p>
<p>Future development of this library can bring more interest in Clojure for supply-chain-related projects (especially since we are putting related topics to separate libraries, e.g., <a href="https://github.com/hephaistox/automaton-optimization">https://github.com/hephaistox/automaton-optimization</a></p>
<p>By being highly flexible in architecture, other people can extend this library to meet their needs. This can benefit college students of the supply chain and people working in supply-chain (e.g. warehouses, factories). Especially when their company or revenue is too small to require consultants and high-cost software.</p>
<p>This will be also a great showcase for clojure data-oriented approach, as this kind of scheduling systems are much harder to create to be so flexible using classical languages (java, c++) while keeping costs small (small team).</p>
<p><strong>Is there anything else you would like us to know?</strong> As automaton-simulation-de is built with a non-monolith approach, each of its parts could be seen, on its own as a product providing value to the community.</p>
<p>For example:</p>
<ul>
<li>PRNG and probabilistic distribution clojure / clojurescript lib</li>
<li>Technology agnostic discrete optimization library (random walk, descent, genetic algorithm, &hellip;)</li>
<li>Scenario management,</li>
<li>Scheduler engine</li>
<li>Data-oriented UI components library (separating well the HTML+css part, behavior, and where the setup data comes from).</li>
<li>Or other libraries that are already separated as a side-effect of the main work e.g. <a href="https://github.com/hephaistox/automaton-build">https://github.com/hephaistox/automaton-build</a> for working with monorepo  <br></li>
</ul>
<hr>
<h2 id="jack-rusher">Jack Rusher</h2>
<p><a href="https://github.com/jackrusher">https://github.com/jackrusher</a></p>
<p><strong>What do you plan to work on throughout the year?</strong> I would like to devote a certain number of hours every month in 2025 to work on Clerk.</p>
<p><strong>Why is this work important to the Clojure community?</strong>  Clerk is used by a large number of community members for literate programming, data analysis and visualization, &amp;c. <br></p>
<hr>
<h2 id="daniel-slutsky">Daniel Slutsky</h2>
<p><a href="https://github.com/daslu">https://github.com/daslu</a></p>
<p><strong>What do you plan to work on throughout the year?</strong> Scicloj    <a href="https://github.com/scicloj/">https://github.com/scicloj/</a><br>
Scicloj community building and open-source projects</p>
<p><strong>Why is this work important to the Clojure community?</strong> Clojure can be a fantastic fit for many kinds of scientific and data-intensive projects. Fulfilling that potential is a years-long effort, on the technical as well as the community side.</p>
<p>Since early 2019, we, the Scicloj group, have been working on creating a stack of tools and libraries for data and science in Clojure. <a href="https://scicloj.github.io/">https://scicloj.github.io/</a></p>
<p>The stack we are building is addressing many needs which are useful non only in scientific context. High-performance computing, data processing, data visualization, literate programming, and literate testing are a few examples.</p>
<p>You may find more details about current developments in a few recent talks by Scicloj members:<br>
<a href="https://www.youtube.com/watch?v=eUFf3-og_-Y">Kira Howe (McLean) at London Clojurians</a><br>
<a href="https://www.youtube.com/watch?v=ckQllKUw3b4">Sami Kallinen at Heart of Clojure</a><br>
<a href="https://www.youtube.com/watch?v=_D5d6Ls6pBw">Thomas Clark at Clojure Conj</a></p>
<p>We have also been continuously working on building the Clojure community: running workshops, meetup groups, study groups and dev groups, and helping with the organization of a couple of conference. We have been mentoring many Clojurians in becoming involved in open-source and in expanding their use of Clojure to new contexts.</p>
<p>Based on that experience, we recently initiated the <a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">Scicloj open-source-mentorship program.</a><br>
63 people have applied, and 34 of them are currently active in looking into projects and meeting regularly.
The program was discussed in our <a href="https://www.youtube.com/watch?v=STnFMpIZlkk">recent status report (2024-10-25):</a></p>
<p>A few project mentees are new to Clojure and sometimes new to programming. We meet regularly and help them in their learning process.</p>
<p>We have been persistently exploring the expansion of Clojure to new fields of application and research, such as biology, linguistics, physics, statistics, and geography. We are actively working with practitioners in various fields (some new to programming and some experienced) to help them out and learn from their use cases.</p>
<p><strong>Is there anything else you would like us to know?</strong> My role in Scicloj is both in community building and as an open-source maintainer of a few tools and libraries. I have been involved since the beginning (2019). Since I left my day job in 2023, Scicloj has been my main focus.  <br></p>
<hr>
<h2 id="adrian-smith">Adrian Smith</h2>
<p><a href="https://github.com/phronmophobic/">https://github.com/phronmophobic/</a></p>
<p><strong>What do you plan to work on throughout the year?</strong></p>
<ul>
<li><a href="https://github.com/phronmophobic/grease">Grease</a>: The goal for this year is to make a free, open source app similar to pythonista (<a href="http://www.omz-software.com/pythonista/">http://www.omz-software.com/pythonista/</a>) but for clojure. This project is already in-progress. More info at <a href="https://clojurians.slack.com/archives/C0260KHN0Q0">https://clojurians.slack.com/archives/C0260KHN0Q0</a> on the clojurians slack.</li>
<li>AI tools like <a href="https://github.com/phronmophobic/llama.clj">llama.clj</a>: llama.clj is a library that allows running open source LLMs directly from the JVM with a clojure-friendly API.</li>
<li><a href="https://github.com/phronmophobic/dewey">Dewey</a>: Dewey is a public dataset that scans and analyzes clojure github repos weekly. These datasets are currently being used by tools like tutkain and clojure-lsp. The goal is to improve access to ecosystem data in order to be even more useful for developer tooling.</li>
<li><a href="https://github.com/phronmophobic/membrane">Membrane</a>: A pure clojure, cross-platform UI library</li>
</ul>
<p><strong>Why is this work important to the Clojure community?</strong> The goal for the Grease project is to make a fully scriptable iOS app. This would allow any clojure developer to write apps for their iPhone without requiring developers to jump through hoops like the Apple submission process. The app (currently code named LearnLisp) is compiled using graalvm&rsquo;s native-image and scripts are executed using an embedded sci interpreter. A subgoal for this project is to make the app approachable to any developer that might be interested in learning a Lisp while also having fun making something useful for their phone. In principle, the same approach can be used to target android. A stretch goal is to also release an android app with the same features.</p>
<p>Many of the latest AI tools are written in python and c++. I have 15 years of experience writing python and c++. One of the goals for the next year is to continue writing clojure libraries like llama.clj that make the best AI tools available to clojure. Some examples of similar libraries are whisper.clj, usearch.clj, and clip.  clj.</p>
<p>One of the challenges commonly cited by new clojure users is finding libraries. Dewey collects and indexes information about the clojure open source ecosystem. The dewey frontends are already quite capable of finding the right library for a particular task, but the UX needs to be improved.</p>
<p>The current dewey frontends:</p>
<ul>
<li><a href="https://phronmophobic.github.io/dewey/search.html">Library Search</a> - Search for clojure libraries by keyword, name, author, and description.</li>
<li><a href="https://cloogle.phronemophobic.com/doc-search.html">Cloogle</a> - Search for any clojure function by its doc string. Queries are indexed by semantic meaning using a vector db.</li>
</ul>
<p>The goals for this year:</p>
<ul>
<li>Consolidate frontends into a single, unified frontend</li>
<li>Make the UI prettier</li>
<li>Create an API to support developer tools</li>
<li>Extract the semantic search code into its own standalone library</li>
</ul>
<p>Membrane is a UI library written in pure clojure aimed at building complex, interactive UI applications in a functional style. One pitfall I&rsquo;m trying to avoid with membrane is to solve the easy problems, but ignore the hard problems. The most recent work on membrane has been about solving some of the hard problems facing desktop UIs so that membrane can be a real alternative to the browser for complex desktop applications. These projects include clj-media (video playback), clj-cef2 (an embedded web browser based on chromium), clj-webgpu (3d graphics), and membrane.term (terminal emulator). Now that I feel comfortable that I won&rsquo;t be leading users down a dead end, the goal for this year is to improve documentation and provide a good looking, high quality, component library. Membrane UIs aren&rsquo;t tied to any particular graphics library. This means that membrane UIs can be embedded in any UI library that can draw shapes, texts, and rectangles.  <br></p>
<hr>
<h2 id="peter-strömberg">Peter Strömberg</h2>
<p><a href="https://github.com/PEZ">https://github.com/PEZ</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
Calva - <a href="https://calva.io">https://calva.io</a> - I&rsquo;d like to tackle repl session management, technical and ux debt and integration with CoPilot.</p>
<p><strong>Why is this work important to the Clojure community?</strong>
Calva runs on the important VS Code platform, which includes editors like Cursor. The uptake of Calva increases steadily and is now close to 25% of Clojurians. Especially the lacking session management and the technical debt are increasingly problematic.<br>
<br></p>
<hr>
<h2 id="dan-sutton">Dan Sutton</h2>
<p><a href="https://github.com/dpsutton/">https://github.com/dpsutton/</a></p>
<p><strong>What do you plan to work on throughout the year?</strong>
inf-clojure</p>
<p><strong>Why is this work important to the Clojure community?</strong> The Clojure Community always benefits from editor integrations. I think the socket repl is the underused super power of Clojure. It is the great equalizer of development environments and is built into the language.</p>
<p>I would want to do two things:</p>
<ol>
<li>
<p>Work on inf-clojure to make it more robust and accessible to both beginners and experienced devs alike. NREPL does lots of amazing and convenient stuff. But it can leave developers unable to run tests without a UI. It requires lots of configuration and takes over your main entrypoint. The socket repl is incredibly helpful. A REPL based on source is almost completely indistinguishable from one based on an AOT&rsquo;ed, production jar.</p>
</li>
<li>
<p>To complement this, I will also write tutorials and create videos showcasing how easy it is to (a) start repls, (b) work with repls, and (c) lots of helpful additions that make it so powerful and flexible.<br>
I&rsquo;ve got lots of local functions that I need to package up and get into the inf-clojure repo. Some examples:</p>
</li>
</ol>
<ul>
<li>starting a repl: <code>clj -J&quot;$(socket-repl 6000)&quot;</code> which expands out to the command line args required for a socket repl</li>
<li><code>m-x personal/repl [RET] 6000</code> will connect to a socket repl running on port 6000 and wire up a sub repl in it that shortens the displayed prompt to the last segment of the namespace and hook up clojure.pprint/pprint as the pretty printer</li>
<li>save-to/eval-from registers. Using registers in emacs is <em>lovely</em>. Throwing different snippets into registers (t for run all tests, i for individual test, etc) is an amazing way to run. I&rsquo;ve used this system for years now and it&rsquo;s time it made it back into inf-clojure.</li>
<li>a hotkey to require the repl-requires: <code>(inf-clojure--send-string inf-proc &quot;(apply require clojure.main/repl-requires)&quot;)</code></li>
<li>a helpful debugging REPL. We have macros that create temporary things during testing. It&rsquo;s often the easiest way to create some complicated state to exercise and inspect a bug. But the tests run so quickly that I can&rsquo;t play around. I wanted something that would be blocking and still allow me to play around with the state: THIS IS A REPL. Using subrepls to pause the world is an amazing super power that is fundamentally incompatible with nrepl. But it&rsquo;s transparently powerful with socket repls. I wrote a macro that throws all locals into a namespace and lets you introspect it.</li>
<li>using a remote repl is amazing with a bit of ssh tunneling. The loveliest usecase is a failing test in Circle CI, rerunning with ssh and then connecting your REPL to your CI instance! This is straightforward with a socket repl.</li>
</ul>
<p>I also want to highlight how <em>queryable</em> the Clojure runtime is. The repl helpers: source, apropos, dir, pst, doc, find-doc, add-libs, etc are INCREDIBLE. Learning to use the tools built into the language and not built into the IDE is a super power. Every Clojure REPL is an amazingly helpful repl.</p>
<p>I don&rsquo;t want this to appear as it would be tutorial focused. I would hope that is 40% or less of my output. I want to contribute to inf-clojure, watch it grow, and share videos and articles about how it can unlock so much productivity.</p>
<p><strong>Is there anything else you would like us to know?</strong> If this project sounds interesting, I&rsquo;m also open to doing a shorter commitment. I wonder if there are others who have just a few months of work and we could combine to have several smaller projects.<br>
But I could also improve this over 12 months as well. I think the clojurescript story is a bit underdeveloped. Shadow-cljs provides a socket repl that can easily upgrade. Using cljs.main is a bit harder but achieved with a different &ldquo;accept&rdquo; function. The documentation should be much easier.</p>
<p>I also want an easy way for it to just use a terminal repl easier. Using ssh tunneling is one thing, but it would be amazing to have a vterm window open and easily sending forms over to the repl.</p>
<p>In short, I think this tooling is a super power. I would love to build this out over a few months or the full year and share the knowledge and improve the tools.  <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p><a href="https://www.taoensso.com">https://www.taoensso.com</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
Multiple projects, incl. further work on Telemere, Tufte, Tempel, and more</p>
<p><strong>Why is this work important to the Clojure community?</strong>
Have been trying to focus recent work on practical areas where Clojure either doesn&rsquo;t already have great solution/s, or where Clojure might be able to offer something uniquely advantageous over other languages/platforms. There&rsquo;s still a lot of low-hanging fruit re: both observability and data security for example. Beyond that, just focusing on practical tools that work at scale while being approachable for beginners.</p>
<p><strong>Is there anything else you would like us to know?</strong><br>
Mostly, just thank you! I&rsquo;ve been lucky and grateful to already receive long-term funding from Clojurists Together for 2023 and 2024.</p>
<p>I&rsquo;d definitely be up for continuing this way if there&rsquo;s interest from the community. It&rsquo;s been awesome to dedicate more time to my open source, and Clojurists Together funding has undoubtedly helped with that (esp. for the more complex / high-effort stuff).</p>
<p>Have a lot of exciting things that I&rsquo;d love to still expand on or explore in 2025. But I also understand that I&rsquo;ve already received a couple years of funding now - and that there&rsquo;s probably many great and deserving applicants with exciting proposals :-)</p>
<p>Whatever the outcome for 2025, I plan to continue to try contribute as much as I can.</p>
<p>Clojurists Together is a really awesome undertaking, and an inspiration. So thanks to everyone that&rsquo;s been involved in helping make it reality and in keeping it running so smoothly.</p>
<p>Cheers! :-) - Peter  <br></p>
<hr>
<h2 id="oleksandr-yakushev">Oleksandr Yakushev</h2>
<p><a href="https://github.com/alexander-yakushev">https://github.com/alexander-yakushev</a> <br>
<a href="https://github.com/clojure-goes-fast">https://github.com/clojure-goes-fast</a></p>
<p><strong>What do you plan to work on throughout the year?</strong><br>
I plan to continue working on Clojure Goes Fast tooling. During Q3 2024, I&rsquo;ve covered a lot of ground with new features and redesign of clj-async-profiler and the first release of Flamebin. This also opened a lot of ideas and opportunities for further improvement of those tools. I have a large backlog of tasks for:</p>
<ul>
<li>Flamebin – implement authorization and social login, client-side encrypted private flamegraphs, collaborative commenting, configuration editing and saving;</li>
<li>clj-async-profiler – unified configuration, configuration reuse between flamegraphs, automatic analysis and performance improvement suggestions;</li>
<li>Clojure Goes Fast knowledge base – populate the list of bad performance practices that can be later be linked to by the clj-async-profiler analyzer;</li>
<li>clj-java-decompiler – CIDER integration which I wished to do in Q3 but couldn&rsquo;t get to in this quarter.</li>
</ul>
<p>Also, in 2024 I&rsquo;ve once again become an active contributor and co-maintainer of CIDER, cider-nrepl, Orchard, and Compliment (250 total commits in 2024) and I want to continue doing this in 2025.</p>
<p><strong>Why is this work important to the Clojure community?</strong><br>
Clojure Goes Fast continues to be the primary spot of performance-related projects and guides about Clojure (1.1K stars, 1.1M total Clojars downloads, 7000 unique site visitors in 2024).</p>
<p>CIDER is used by 40% of Clojure developers according to State of Clojure 2024 survey.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Sept. and Oct. 2024  Long-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/sept.-and-oct.-2024-long-term-project-updates/</link>
      <pubDate>Sat, 16 Nov 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/sept.-and-oct.-2024-long-term-project-updates/</guid>
      <description>The latest from Bozhidar Batsov, Michiel Borkent, Toby Crawley, Thomas Heller, Kira McLean, Nikita Prokopov, Tommi Reiman, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Check out their latest project updates from our 2024 long-term developers! These reports just in for September and October. Thanks to all!</p>
<h2 id="long-term-project-updates">Long-Term Project Updates</h2>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER    <br>
<a href="#michiel-borkent">Michiel Borkent:</a> squint, babashka, neil, cherry, clj-kondo, and more<br>
<a href="#toby-crawley">Toby Crawley:</a> clojars-web <br>
<a href="#thomas-heller">Thomas Heller:</a> shadow-cljs, shadow-grove <br>
<a href="#kira-mclean">Kira McLean:</a> Scicloj Libraries. tcutils, Clojure Data Cookbook, and more<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Humble UI, Datascript, AlleKinos, Clj-reload, and more<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Reitit 7.0. Malli, jsonista, and more <br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Carmine, Nippy, Telemere, and more  <br></p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>The big news for the past couple of months was the release of CIDER 1.16 (&ldquo;Kherson&rdquo;).<br>
It was a fairly small release, mainly focused on adding support for nREPL 1.3 (which brought a lot of internal improvements). The other interesting bit about CIDER 1.16 was switching to an &ldquo;in-house&rdquo; tracing back-end that resulted in slightly nicer tracing output. Check the <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.16.0">release notes</a> for more details.</p>
<p>Other interesting things that happened in the realm of CIDER &amp; friends were:</p>
<ul>
<li>Orchard <a href="https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0280-2024-10-31">0.28</a> brought improvements to the inspector and simplified the Java parser codebase</li>
<li>We&rsquo;ve fixed the font-locking of CIDER results in the minibuffer</li>
<li>We&rsquo;ve revived the <code>cider</code> completion style (details <a href="https://github.com/clojure-emacs/cider/pull/3746">here</a>)</li>
<li>You can now display the available log frameworks with <code>cider-log-show-frameworks</code></li>
<li>A few bugs were fixed in <code>clojure-ts-mode</code> and we&rsquo;ve started to port <code>clojure-mode</code>&rsquo;s tests over there</li>
</ul>
<p>In other news - I turned 40 in October, which means I&rsquo;ve spent 30% of my life working on CIDER &amp; co! :D As usual - huge thanks for supporting my work!  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p><strong>Updates</strong>
In this post I&rsquo;ll give updates about open source I worked on during September and October 2024. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without <em>you</em>, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all.</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br/">Nubank</a></li>
</ul>
<h3 id="sponsor-info">Sponsor info</h3>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which aren&rsquo;t listed above, please get in touch. On to the projects that I&rsquo;ve been working on!</p>
<h3 id="updates">Updates</h3>
<p>In September I visited <a href="https://2024.heartofclojure.eu/">Heart of Clojure</a> where Christian, Teodor and I did a workshop on babashka. The first workshop was soon fully booked so we even did a second one and had a lot of fun doing so. It was so good to see familiar Clojure faces in real life again. Thanks Arne and Gaiwan team for organizing this amazing conference.</p>
<p>Although I didn&rsquo;t make it to the USA for the Clojure conj in October, Alex Miller did invite me to appear towards the end of his closing talk when he mentioned that 90% of survey respondents used babashka.</p>
<p><img src="https://github.com/user-attachments/assets/cba703f9-820e-4b22-a33f-eb4f3ff56957" alt="image"></p>
<p><img src="https://github.com/user-attachments/assets/5e0d873d-2211-478c-8ae8-c53dd5b456b8" alt="image"></p>
<p>If you are interested in a full stack web framework with babashka and squint, check out <a href="https://github.com/m3tti/borkweb">borkweb</a>.</p>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in the last two months.</p>
<ul>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy. \</p>
<ul>
<li>Unreleased</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1784">#1784</a>: detect <code>:redundant-do</code> in <code>catch</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2410">#2410</a>: add <code>--report-level</code> flag</li>
<li>2024.09.27</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2404">#2404</a>: fix regression with metadata on node in hook caused by <code>:redundant-ignore</code> linter</li>
<li>2024.09.26</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2366">#2366</a>: new linter: <code>:redundant-ignore</code>. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2386">#2386</a>: fix regression introduced in <a href="https://github.com/clj-kondo/clj-kondo/issues/2364">#2364</a> in <code>letfn</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2389">#2389</a>: add new <code>hooks-api/callstack</code> function</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2392">#2392</a>: don&rsquo;t skip jars that were analyzed with <code>--skip-lint</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2395">#2395</a>: enum constant call warnings</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2400">#2400</a>: <code>deftype</code> and <code>defrecord</code> constructors can be used with <code>Type/new</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2394">#2394</a>: add <code>:sort</code> option to <code>:unsorted-required-namespaces</code> linter to enable case-sensitive sort to match other tools</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2384">#2384</a>: recognize <code>gen/fmap</code> var in <code>cljs.spec.gen.alpha</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li><a href="https://github.com/babashka/babashka/issues/1752">#1752</a>: include <code>java.lang.SecurityException</code> for <code>java.net.http.HttpClient</code> support</li>
<li><a href="https://github.com/babashka/babashka/issues/1748">#1748</a>: add <code>clojure.core/ensure</code></li>
<li>Upgrade to <code>taoensso/timbre</code> <code>v6.6.0</code></li>
<li>Upgrade to GraalVM 23</li>
<li><a href="https://github.com/babashka/babashka/issues/1743">#1743</a>: fix new fully qualified instance method in call position with GraalVM 23</li>
<li>Clojure 1.12 interop: method thunks, FI coercion, array notation (see below)</li>
<li>Upgrade SCI reflector based on clojure 1.12 and remove specific workaround for <code>Thread/sleep</code> interop</li>
<li>Add <code>tools.reader.edn/read</code></li>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1741">#1741</a>: <code>(taoensso.timbre/spy)</code> now relies on macros from <code>taoensso.encore</code> previously not available in bb</li>
<li>Upgrade Clojure to <code>1.12.0</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1722">#1722</a>: add new clojure 1.12 vars</li>
<li><a href="https://github.com/babashka/babashka/issues/1720">#1720</a>: include new clojure 1.12&rsquo;s <code>clojure.java.process</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1719">#1719</a>: add new clojure 1.12 <code>clojure.repl.deps</code> namespace. Only calls with explicit versions are supported.</li>
<li><a href="https://github.com/babashka/babashka/issues/1598">#1598</a>: use Rosetta on CircleCI to build x64 images</li>
<li><a href="https://github.com/babashka/babashka/issues/1716">#1716</a>: expose <code>babashka.http-client.interceptors</code> namespace</li>
<li><a href="https://github.com/babashka/babashka/issues/1707">#1707</a>: support <code>aset</code> on primitive array</li>
<li><a href="https://github.com/babashka/babashka/issues/1676">#1676</a>: restore compatibility with newest <a href="https://github.com/overtone/at-at/">at-at</a> version (1.3.58)</li>
<li>Bump SCI</li>
<li>Bump <code>fs</code></li>
<li>Bump <code>process</code></li>
<li>Bump <code>deps.clj</code></li>
<li>Bump <code>http-client</code></li>
<li>Bump <code>clj-yaml</code></li>
<li>Bump <code>edamame</code></li>
<li>Bump <code>rewrite-clj</code></li>
<li>Add <code>java.io.LineNumberReader</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</p>
<ul>
<li>Fix <a href="https://github.com/babashka/sci/issues/942">#942</a>: improve error location of invalid destructuring</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/917">#917</a>: support new Clojure 1.12 Java interop: <code>String/new</code>, <code>String/.length</code> and <code>Integer/parseInt</code> as fns</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/925">#925</a>: support new Clojure 1.12 array notation: <code>String/1</code>, <code>byte/2</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/926">#926</a>: Support <code>add-watch</code> on vars in CLJS</li>
<li>Support <code>aset</code> on primitive array using reflection</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/928">#928</a>: record constructor supports optional meta + ext map</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/934">#934</a>: <code>:allow</code> may contain namespaced symbols</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/937">#937</a>: throw when copying non-existent namespace</li>
<li>Update <code>sci.impl.Reflector</code> (used for implementing JVM interop) to match Clojure 1.12</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li>Fix watcher and compiler not overriding <code>squint.edn</code> configurations with command line options.</li>
<li>Allow passing <code>--extension</code> and <code>--paths</code> via CLI</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/563">#563</a>: prioritize refer over core built-in</li>
<li>Update <code>chokidar</code> to v4 which reduces the number of dependencies</li>
<li>BREAKING: Dynamic CSS in <code>#html</code> must now be explicitly passed as map literal: <code>(let [m {:color :green}] #html [:div {:style {:&amp; m}}])</code>. Fixes issue when using <code>lit-html</code> in combination with <code>classMap</code>. See <a href="https://squint-cljs.github.io/squint/?src=KG5zIG15bGl0CiAgKDpyZXF1aXJlIFtzcXVpbnQuY29yZSA6cmVmZXIgW2RlZmNsYXNzIGpzLXRlbXBsYXRlXV0KICAgWyJodHRwczovL2VzbS5zaC9saXRAMy4wLjAiIDphcyBsaXRdCiAgIFsiaHR0cHM6Ly9lc20uc2gvbGl0QDMuMC4wL2RpcmVjdGl2ZXMvY2xhc3MtbWFwLmpzIiA6cmVmZXIgW2NsYXNzTWFwXV0pKQoKKGRlZmNsYXNzIE15RWxlbWVudAogIChleHRlbmRzIGxpdC9MaXRFbGVtZW50KQogICheOnN0YXRpYyBmaWVsZCBwcm9wZXJ0aWVzIHs6Y291bnQge319KQoKICAoY29uc3RydWN0b3IgW3RoaXNdCiAgICAoc3VwZXIpCiAgICAoc2V0ISB0aGlzLmNvdW50IDApCiAgICAoc2V0ISB0aGlzLm5hbWUgIkhlbGxvIikpCgogIE9iamVjdAogIChyZW5kZXIgW3RoaXNdCiAgICAjaHRtbCBebGl0L2h0bWwKICAgIFs6ZGl2CiAgICAgWzpoMSB7OmNsYXNzIChjbGFzc01hcCB7OmVuYWJsZWQgdHJ1ZX0pfQogICAgICB0aGlzLm5hbWVdCiAgICAgWzpidXR0b24geyJAY2xpY2siIHRoaXMub25DbGljawogICAgICAgICAgICAgICA6cGFydCAiYnV0dG9uIn0KICAgICAgIkNsaWNrIGNvdW50ICIgdGhpcy5jb3VudF1dKQoKICAob25DbGljayBbdGhpc10KICAgIChzZXQhIHRoaXMuY291bnQgKGluYyB0aGlzLmNvdW50KSkpKQoKKGRlZm9uY2UgZm9vCiAgKGRvCiAgICAoanMvd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSAibXktZWxlbWVudCIgTXlFbGVtZW50KQogICAgdHJ1ZSkpCgooZGVmIGFwcCAob3IgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNhcHAiKQogICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgKHNldCEgLWlkICJhcHAiKQogICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKSkKCihzZXQhICguLWlubmVySFRNTCBhcHApICNodG1sIFs6ZGl2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOm15LWVsZW1lbnRdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjX1s6bXktZWxlbWVudF1dKQ%3D%3D">demo</a></li>
<li><a href="https://github.com/squint-cljs/squint/issues/556">#556</a>: fix referring to var in other namespace via global object in REPL mode</li>
<li>Pass <code>--repl</code> opts to <code>watch</code> subcommand in CLI</li>
<li><a href="https://github.com/squint-cljs/squint/issues/552">#552</a>: fix REPL output with hyphen in ns name</li>
<li>Ongoing work on browser REPL. Stay tuned.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Fix referring to vars in other namespaces globally</li>
<li>Allow <code>defclass</code> to be referenced through other macros, e.g. as <code>cherry.core/defclass</code></li>
<li>Fix emitting keyword in HTML</li>
<li><a href="https://github.com/squint-cljs/cherry/issues/138">#138</a>: Support <code>#html</code> literals, ported from squint</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client \</p>
<ul>
<li><a href="https://github.com/babashka/http-client/issues/68">#68</a> Fix accidental URI path decoding in uri-with-query (<a href="https://github.com/hxtmdev">@hxtmdev</a>)</li>
<li><a href="https://github.com/babashka/http-client/issues/71">#71</a>: Link back to sources in release artifact (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/http-client/issues/71">#73</a>: Allow implicit ports when specifying the URL as a map (<a href="https://github.com/lvh">@lvh</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-server">http-server</a>: serve static assets</p>
<ul>
<li><a href="https://github.com/babashka/http-server/issues/16">#16</a>: support range requests (<a href="https://github.com/jmglov">jmglov</a>)</li>
<li><a href="https://github.com/babashka/http-server/issues/13">#13</a>: add an ending slash to the dir link, and don&rsquo;t encode the slashes (<a href="https://github.com/KDr2">@KDr2</a>)</li>
<li><a href="https://github.com/babashka/http-server/issues/12">#12</a>: Add headers to index page (rather than just file responses)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/bbin">bbin</a>: Install any Babashka script or project with one command \</p>
<ul>
<li>Fix #88: bbin ls with 0-length files doesn&rsquo;t crash</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</p>
<ul>
<li>Add <code>cljs.pprint/code-dispatch</code> and <code>cljs.pprint/with-pprint-dispatch</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/clojure/clojurescript">clojurescript</a></p>
<ul>
<li><a href="https://github.com/clojure/clojurescript/commit/f1fc819da94147411e353ecb17c751af6a18ce2e">Throw when calling ana-api/ns-publics on non-existing ns</a></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects. \</p>
<ul>
<li><a href="https://github.com/babashka/neil/issues/241">#241</a>: ignore missing deps file (instead of throwing) in <code>neil new</code> (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</p>
<ul>
<li>Added a configuration for <code>cljs.spec.alpha</code> and related namespaces</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>Include <code>cljs.spec.alpha</code>, <code>cljs.spec.gen.alpha</code>, <code>cljs.spec.test.alpha</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/qualify-methods">qualify-methods</a></p>
<ul>
<li>Initial release of experimental tool to rewrite instance calls to use fully qualified methods (Clojure 1.12 only0</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>Add support for <code>:require-cljs</code> which allows you to use <code>.cljs</code> files for render functions</li>
<li>Add support for nREPL for developing render functions</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Upgrade/sync with clojure CLI v1.12.0.1479</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</p>
<ul>
<li>Work has started to support prepending output (in support for babashka parallel tasks). Stay tuned.</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>There are many other projects I’m involved with but that had little to no activity in the past month. Check out the <strong>Other Projects</strong> section (more details) of <a href="https://blog.michielborkent.nl/oss-updates-sep-oct-2024.html">my blog here</a> to see a full list.<br>
Published: 2024-11-01<br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<h3 id="october-2024">October 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/4dc64513a676198f9971f1609246e92d83d6a110...7414339136d6ac3455525fd949ee8372ff15ea03"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/28a7362e772902241162ebcfdb6e8bc228c3b35c...e801cb297560b911c9b1ad01cd46c805d16eeed3"><code>infrastructure</code></a></p>
<ul>
<li><a href="https://github.com/clojars/infrastructure/commit/93724045d5afcebdce9819c9b7f0fbdd46221538">Increased max upload size from 20MB to 30MB</a> This is to allow larger artifacts
to be uploaded, now that we see native builds more often.</li>
<li><a href="https://github.com/clojars/clojars-web/commit/4c461c4b546350536b19988f9391d3fe9d27e822">Addressed CVEs</a></li>
</ul>
<h3 id="september-2024">September 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/2202a352e84c9eb63671d2163ae94bc96e4a331e...0537bc843a8ace13f7ff716410975949587ec7ae"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/6cf9c100e38408016cd979f1611602523766200e...28a7362e772902241162ebcfdb6e8bc228c3b35c"><code>infrastructure</code></a></p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/7760c34369f0d107bfa26a3703e1334f32f531e3">Upgraded to clojure 1.12.0</a></li>
<li><a href="https://github.com/clojars/infrastructure/commit/28a7362e772902241162ebcfdb6e8bc228c3b35c">Upgraded to java 21</a></li>
<li><a href="https://github.com/clojars/clojars-web/pull/886">Added hcaptcha to signup form</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/e644fcc9a414b628e8b5de8772f8ec2ccf95d7f5">Fixed status-message sending on validation failure</a>  <br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<h3 id="shadow-cljs-update">shadow-cljs Update</h3>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.28.18 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<h3 id="notable-updates">Notable Updates</h3>
<ul>
<li>Added support for package.json <code>&quot;imports&quot;</code></li>
</ul>
<h3 id="blog">Blog</h3>
<p>Wrote 2 new blog posts describing my personal REPL-based Workflow using shadow-cljs</p>
<ul>
<li><a href="https://code.thheller.com/blog/shadow-cljs/2024/10/18/fullstack-cljs-workflow-with-shadow-cljs.html">Fullstack Workflow with shadow-cljs</a></li>
<li><a href="https://code.thheller.com/blog/shadow-cljs/2024/10/30/supercharging-the-repl-workflow.html">Supercharging the REPL Workflow</a>  <br></li>
</ul>
<hr>
<h2 id="kira-mclean">Kira McLean</h2>
<p>This is a summary of the open source work I spent my time on throughout September and October 2024. This was a very busy period in my personal life and I didn&rsquo;t make much progress on my projects, but I did have more time than usual to think about things, which prompted many further thoughts. Keep reading for details :)</p>
<h3 id="sponsors-1">Sponsors</h3>
<p>I always start these posts with a sincere thank you to the generous ongoing support of my sponsors that make this work possible. I can&rsquo;t say how much I appreciate all of the support the community has given to my work and would like to give a special thanks to Clojurists Together and Nubank for providing incredibly generous grants that allowed me reduce my client work significantly and afford to spend more time on projects for the Clojure ecosystem for nearly a year.</p>
<p>If you find my work valuable, please share it with others and consider supporting it financially. There are details about how to do that on my <a href="https://github.com/sponsors/kirahowe">GitHub sponsors page</a>. On to the updates!</p>
<h3 id="personal-update">Personal update</h3>
<p>I&rsquo;ll save the long version for the end but there is one important personal update that&rsquo;s worth mentioning up front: I go by Kira Howe now. I used be known as Kira McLean, and all of my talks, writing, and commits up to this point use Kira McLean, but I&rsquo;m still the same person! Just with a new name. I even updated my <a href="https://github.com/kirahowe">GitHub handle</a>, which went remarkably smoothly.</p>
<h3 id="conj-2024">Conj 2024</h3>
<p>The main Clojure-related thing I did during this period was attend the Conj. It&rsquo;s always cool to meet people in person who you&rsquo;ve only ever worked with online, and I finally got to meet so many of the wonderful people from Clojure Camp and Scicloj who I&rsquo;ve had the pleasure of working with virtually. I also had the chance to meet some of my new co-workers, which was great. There were tons of amazing talks and as always insightful and inspiring conversations. I always leave conferences with tons of energy and ideas. Then get back to reality and realize there&rsquo;s no time to implement them all :) But still, below are some of the main ideas I&rsquo;m working through after a wonderful conference.</p>
<h3 id="svgs-for-visualizing-graphics">SVGs for visualizing graphics</h3>
<p>Tim Pratley and Chris Houser gave a fun talk about SVGs, among other things, that made me realize using SVGs might be the perfect way to implement the &ldquo;graphics&rdquo; side of a grammar of graphics.</p>
<p>Some of you may be following the development of <a href="https://github.com/scicloj/tableplot">tableplot</a> (formerly hanamicloth), in which Daniel Slutsky has been implementing an elegant, layered, grammar-of-graphics-inspired way to describe graphics in Clojure. This library takes this description of a graphic and translates it into a specification for one of the supported underlying Javascript visualization libraries (currently vega-lite or plotly, via hanami). Another way to think about it is as the &ldquo;grammar&rdquo; part of a grammar of graphics; a way to declaratively transform an arbitrary dataset into a standardized set of instructions that a generic visualization library can turn into a graphic. This is the first half of what we need for a pure Clojure implementation of a grammar of graphics.</p>
<p>The second key piece we need is a Clojure implementation of the actual graphics rendering. Whether we adopt a similar underlying representation for the data as vega-lite, plotly, or whatever else is less consequential at this stage. Currently we just &ldquo;translate&rdquo; our Clojure code into vega-lite or plotly specs and call it a day. What I want to implement is a Clojure library that can take some data and turn it into a visualization. There are many ways to implement such a thing, all with different trade-offs, but Tim and Chouser&rsquo;s talk made me realize SVGs might be a great tool for the job. They&rsquo;re fast, efficient, simple to style and edit, plus they offer potentially the most promising avenues toward making graphics accessible and interactive since they&rsquo;re really just XML, which is semantic, supports ARIA labels, and is easy to work with in JS.</p>
<p>Humble UI also came up in a few conversations, which is a totally tangential concern, but it was interesting to start thinking about how all of this could come together into a really elegant, fully Clojure-based data visualization tool for people who don&rsquo;t write code.</p>
<h3 id="a-clojurey-way-of-working-with-data">A Clojurey way of working with data</h3>
<p>I also had a super interesting conversation on my last night in Alexandria about Clojure&rsquo;s position in the broader data science ecosystem. It&rsquo;s fair to say that we have more or less achieved feature parity now for all the essential things a person working with data would need to do. Work is ongoing organizing these tools into a coherent and accessible stack (see <a href="https://scicloj.github.io/noj/">noj</a>), but the pieces are all there.</p>
<p>The main insight I left with, though, was that we shouldn&rsquo;t be aiming for mere feature parity. It&rsquo;s important, but if you&rsquo;re a working data scientist doing everything you already do just with Clojure is only a very marginal improvement and presents a very high switching cost for potentially not enough payoff. In short, it&rsquo;s a tough sell to someone who&rsquo;s doesn&rsquo;t already have some prior reason to prefer Clojure.</p>
<p>What we should do is leverage Clojure&rsquo;s strengths to build tools that could leapfrog the existing solutions, rather than just providing better implementations of them. I.e. think about new ways to solve the fundamental problems in data science, rather than just offering better tools to work within the current dominant paradigm.</p>
<p>For example, a fundamental problem in science is reproducibility. The current ways data is prepared and managed in most data (and regular) science workflows is madness, and versioning is virtually non-existent. If you pick up any given scientific paper that does some sort of data analysis, the chances that you will be able to reproduce the results are near zero, let alone using the same tools the author used. If you do manage to, you will have had to use a different implementation than the authors, re-inventing wheels and reverse-engineering their thought process. The problem isn&rsquo;t that scientists are bad at working with data, it&rsquo;s the fundamental chaos of the underlying ecosystem that&rsquo;s impossible to fight.</p>
<p>If you&rsquo;ve ever worked with Python code, you know that dependency management is a nightmare, never mind state management within a single program. Stateful objects are just a bad mental model for computing because they require us to hold more information in our heads in order to reason about a system than our brains can handle. And when your mental model for a small amount of local data is a stateful, mutable thing, the natural inclination is to scale that mental model to your entire system. Tracking data provenance, versions, and lineage at scale is impossible when you&rsquo;re thinking about your problem as one giant, mutable, interdependent pile of unorganized information.</p>
<p>Clojure allows for some really interesting ways of thinking about data that could offer novel solutions to problems like these, because we think of data as immutable and have the tools to make working with such data efficient. None of this is new. Somehow at this Conj between some really interesting talks focused on ways of working with immutable data and subsequent conversations it clicked for me, though. If we apply the same ways we think about data in the small, like in a given program, more broadly to an entire system or workflow, I think the benefits could be huge. It&rsquo;s basically implementing the ideas from <a href="https://www.youtube.com/watch?v=-6BsiVyC1kM">Rich Hickey&rsquo;s &ldquo;Value of values&rdquo;</a> talk over 10 years ago to a modern data science workflow.</p>
<p>Other problems that Clojure is well-placed to support are:</p>
<ul>
<li>Scalability &ndash; Current dominant data science tools are slow and inefficient. People try to work around it by implementing libraries in C, Rust, Java, etc. and using them from e.g. Python, but this can only get you so far and adds even more brittleness and dependency management problems to the mix.</li>
<li>Tracking data and model drift &ndash; This problem has a very similar underlying cause as the reproducibility issue, also fundamentally caused by a faulty mental model of data models as mutation machines.</li>
<li>Testing and validation &ndash; Software engineering practices have not really permeated the data science community and as such most pipelines are fragile. Bringing a values-first and data-driven paradigm to pipeline development could make them much more robust and reliable.</li>
</ul>
<p>Anyway I&rsquo;m not exactly sure what any of this will look like as software yet, but I know it will be written in Clojure and I know it will be super cool. It&rsquo;s what I&rsquo;m thinking about and experimenting with now. And I think the key point that thinking about higher-level problems and how Clojure can be applied to them is the right path toward introducing Clojure into the broader data science ecosystem.</p>
<h3 id="software-engineers-as-designers">Software engineers as designers</h3>
<p>Alex Miller&rsquo;s keynote was all about designing software and how they applied a process similar to the one described in <a href="https://www.youtube.com/watch?v=c5QF2HjHLSE">Rich Hickey&rsquo;s keynote from last year&rsquo;s conj</a> to Clojure 1.12 (among other things). The main thing I took away from it was that the best use of an experienced software engineer&rsquo;s time is not programming. I&rsquo;ve had the good fortune of working with a lot of really productive teams over the years, and this talk made me realize that one thing the best ones all had in common is that at least a couple of people with a lot of experience were not in the weeds writing code all the time. Conversely a common thread between all of the worst teams I&rsquo;ve been a part of is that team leads and managers were way too in the weeds, worrying too much about implementation details and not enough about what was being implemented.</p>
<p>I&rsquo;ve come to believe that it&rsquo;s not possible to reason about systems at both levels simultaneously. My brain at least just can&rsquo;t handle both the intense attention to detail and very concrete, specific steps required to write software that actually works and the abstract, general conceptual type of thinking that&rsquo;s required to build systems that work. The same person can do both things at different times, but not at the same time, and the cost of switching between both contexts is high.</p>
<p>Following the process described by Rich and then Alex is a really great way to add structure and coherence to what can otherwise come across as just &ldquo;thinking&rdquo;, but it requires that we admit that writing code is not always the best use of our time, which is a hard sell. I think if we let experienced software engineers spend more time thinking and less time coding we&rsquo;d end up with much better software, but this requires the industry to find better ways to measure productivity.</p>
<h3 id="long-version-of-personal-updates">Long version of personal updates</h3>
<p>As most of you know or will have inferred by now, I got married in September! It was the best day ever and the subsequent vacation was wonderful, but it did more or less cancel my productivity for over a month. If you&rsquo;re into weddings or just want a glimpse into my personal life, we had a reel made of our wedding day that&rsquo;s available <a href="https://www.instagram.com/reel/C__5_r9pAea/">here on instagram via our wedding coordinator</a>.</p>
<p>Immediately after I got back from my honeymoon I also started a new job at BroadPeak, which is going great so far, but also means I have far less time than I used for open source and community work. I&rsquo;m back to strictly evening and weekend availability, and sadly (or happily, depending how you see it) I&rsquo;m at a stage of my life where not all of that is free time I can spend programming anymore.</p>
<p>I appreciate everyone&rsquo;s patience and understanding as I took these last couple of months to focus on life priorities outside of this work. I&rsquo;m working on figuring out what my involvement in the community will look like going forward, but there are definitely tons of interesting things I want to work on. I&rsquo;m looking forward to rounding out this year with some progress on at least some of them, but no doubt the end of December will come before I know it and there will be an infinite list of things left to do.</p>
<p>Thanks for reading all of this. As always, feel free to reach out anytime, and hope to see you around the Clojureverse :)  <br></p>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hi, this is Niki Tonsky and past two month we made a huge progress on Humble UI, culminating in Heart of Clojure workshop. Clojure Sublimed also saw some love. Enjoy!</p>
<p><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a>, Clojure Desktop UI framework:</p>
<ul>
<li>Documentation is now part of Humble UI jar, can be opened from any app as a second window</li>
<li>Lots of components were documented</li>
<li>Declarative paints</li>
<li>Support oklch color model</li>
<li>More options for containers (column/row/grid)</li>
<li><code>hsplit</code> component</li>
<li>Button styles</li>
<li>Added user-facing <code>ui/measure</code> that only needs a component</li>
<li>Tuned measurement/sizing caching, still a bit buggy</li>
<li>Add bring-to-front to ui/window, cmd/ctrl+w to close docs, signal to ui namespace</li>
<li>Convenience: default focusable on top level</li>
<li>Convenience: allow ^{:stretch true} as a most common use case</li>
<li>Fixed: with-bounds, draggable, vscrollable after resize,</li>
<li>Fixed: crash on window close</li>
<li>Demo: <a href="https://github.com/HumbleUI/humble-file-picker/">humble-file-picker</a> demo as a separate application, with step-by-step progression</li>
<li>Demo: new <code>Sand</code> sandbox</li>
<li>Demo: new <code>Mirrors</code> demo, mirrored from Philippa Markovics</li>
</ul>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>, Clojure support for Sublime Text 4:</p>
<ul>
<li>Support Clojure 1.12 array type annotations</li>
<li>Pretty print selection #123</li>
<li>Toggle Comment command that uses <code>#_</code> instead of <code>;;</code></li>
<li>Execute code from inside top-level <code>; ...</code> and <code>#_...</code> #124</li>
<li>Handle eval of <code>#_</code> forms in nREPL JVM</li>
<li>Better handle socket close</li>
<li>Highlight namespace name as entity.name, same as defs</li>
<li>Simplified formatting rules: if list&rsquo;s first form is a symbol, indent 2, in other cases, indent to opening paren</li>
<li>Better handle selection after formatting with cljfmt</li>
<li>Tests for indentation, cljfmt default config</li>
<li>cljfmt correctly indents forms with custom rules</li>
<li>Tuned color scheme a bit</li>
</ul>
<p><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>, executable runner for Sublime Text:</p>
<ul>
<li>Fixed result_file_regex/result_line_regex, clear them on clear_output</li>
</ul>
<p><a href="https://github.com/nextjournal/clerk/">Clerk</a>, Moldable Live Programming for Clojure:</p>
<ul>
<li><a href="https://github.com/nextjournal/clerk/blob/main/src/nextjournal/clerk/walk.cljc">Better drop-in implementation of <code>clojure.walk</code></a> (should make it into a library) <br></li>
</ul>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>My planned Open Source Time got postponed due to small family crisis, so no big releases.</p>
<p>Had some time to help people, do PR reviews and small updates to <a href="https://github.com/metosin/viesti">viesti</a>, to be released later this year or early next.</p>
<p>Reserved OS time for December, to <code>(╯°□°)╯︵ LIBS</code> out!</p>
<h3 id="something-else">Something Else</h3>
<img width="1728" alt="woods" src="https://gist.githubusercontent.com/ikitommi/8c904bfaa17f3871f80d3e20ea84ebb7/raw/1c2b8c5b41c858a3cf39676c804ba82c9b51b71e/woods.jpg">  
<br>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<h3 id="recent-work">Recent work</h3>
<p>Hi folks! 👋 I&rsquo;m a bit crunched for time atm, so will keep this update short for a change :-) Hope everyone&rsquo;s well!</p>
<h4 id="telemere">Telemere</h4>
<blockquote>
<p><a href="https://www.taoensso.com/telemere">Telemere</a> is a modern rewrite of <a href="https://www.taoensso.com/timbre">Timbre</a> that offers an improved API to cover traditional logging, structured logging, tracing, basic performance measurement, and more.</p>
</blockquote>
<p><a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0-RC1">v1.0.0-RC1</a> is now available! 🎉</p>
<p>It&rsquo;s been a lot of work getting here, but I&rsquo;m happy with the results. Big thanks to everyone that&rsquo;s been testing the (many) betas and giving valuable feedback! 🙏</p>
<p>Have also recorded a new <a href="https://youtu.be/lOaZ0SgPVu4">lightning intro video</a> that gives a 7-min tour of what Telemere is and roughly what it can do. If you&rsquo;ve been curious but short on time, this might be a good way to get started.</p>
<h4 id="timbre">Timbre</h4>
<blockquote>
<p><a href="https://www.taoensso.com/timbre">Timbre</a> is a pure Clojure/Script logging library.</p>
</blockquote>
<p><a href="https://github.com/taoensso/timbre/releases/tag/v6.6.0">v6.6.0</a> was released, and <a href="https://github.com/taoensso/timbre/releases/tag/v6.6.1">v6.6.1</a> shortly after.</p>
<p>These mark the stable final release of the previous release candidate. Main highlight is Timbre&rsquo;s new out-the-box SLF4Jv2 support.</p>
<h4 id="nippy">Nippy</h4>
<blockquote>
<p><a href="https://www.taoensso.com/nippy">Nippy</a> is fast serialization library for Clojure.</p>
</blockquote>
<p><a href="https://github.com/taoensso/nippy/releases/tag/v3.5.0-RC1">v3.5.0-RC1</a> is out now, which updates dependencies and adds read support for some new primitive array types that&rsquo;ll follow shortly in a v3.6.</p>
<h4 id="sente">Sente</h4>
<blockquote>
<p><a href="https://www.taoensso.com/sente">Sente</a> is a realtime web comms library for Clojure/Script</p>
</blockquote>
<p><a href="https://github.com/taoensso/sente/releases/tag/v1.20.0-RC1">v1.20.0-RC1</a> is out now, and includes an experimental new Jetty adapter and a number of internal improvements.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>Can&rsquo;t believe it&rsquo;s almost the end of the year! It&rsquo;s been a productive one, and I&rsquo;d like to focus on wrapping up a few dangling ends before the year&rsquo;s out.</p>
<p>Plans include:</p>
<ul>
<li><a href="https://www.taoensso.com/telemere">Telemere</a> v1 final before year&rsquo;s end.</li>
<li><a href="https://www.taoensso.com/tempel">Tempel</a> v1 final before year&rsquo;s end.</li>
<li><a href="https://www.taoensso.com/tufte">Tufte</a> v3 pre-release (<em>hopefully</em>) before year&rsquo;s end. Have actually already invested quite a bit of time in this - but it&rsquo;s turned out to be a bigger job than expected, and I want to get it right.</li>
</ul>
<p>Also hoping to find some time for some <a href="https://www.taoensso.com/http-kit">http-kit</a> maintenance, and I have a couple talks I&rsquo;d like to record at some point - though those&rsquo;ll probably need to wait until next year.</p>
<p>On a background thread, I&rsquo;m continuing to make progress on <a href="https://www.taoensso.com/carmine">Carmine</a> v4. Just recently deployed my first production code using v4&rsquo;s alpha branch, so that&rsquo;ll be a good opportunity for testing.</p>
<p>Thanks everyone! Cheers 👋</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Applications Open for 2025 Long-Term Funding</title>
      <link>https://www.clojuriststogether.org/news/applications-open-for-2025-long-term-funding/</link>
      <pubDate>Thu, 31 Oct 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/applications-open-for-2025-long-term-funding/</guid>
      <description>Applications close Nov. 12. $18K USD Annual Funding to each of 6 Developers.</description>
      <content:encoded><![CDATA[<h3 id="6-developers-will-each-be-awarded-1500-usd-per-month-in-2025">6 Developers will each be awarded $1,500 USD per month in 2025.</h3>
<p>This is the 4th year we are awarding annual funding. We’ve received an unmanageable number of nominations in the past few years, so based on member input, we’ve decided to try a new approach for 2025.</p>
<p><strong>APPLY:</strong> Anyone interested in receiving annual funding submits an <a href="https://forms.gle/MaDL8ZiG7N7XyqVf8">APPLICATION</a> outlining  what they intend to work on and how that work will benefit the Clojure community.  The deadline for applications is Nov. 12th, 2024 midnight Pacific Time.<br>
<strong>BOARD REVIEW:</strong> The Clojurists Together board will review the applications and select finalists to present to the members.<br>
<strong>MEMBERS VOTE:</strong> Ballot will go out to members no later than Nov. 20th.  Members will vote on the finalists using <a href="https://www.rankedvote.co/guides/understanding-ranked-choice-voting/how-does-ranked-choice-voting-work">Ranked Voting</a>. Deadline Dec. 2. midnight Pacific Time.<br>
<strong>AWARDS:</strong> 6 developers will receive $1,500 USD per month in 2025. Awards will be announced no later than Dec. 9th, 2024.<br>
<strong>REPORTS:</strong> Developers submit bi-monthly reports to the membership.</p>
<p>In the past 3 years, we have seen that giving developers flexible, long-term funding gives them the space to do high-impact work. This might be continuing maintenance on existing projects, new feature development, or perhaps a brand-new project. We’ve been excited with what they came up with in the last few years and are looking forward to seeing more great work in 2025! Thanks all and good luck!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Sept. and Oct. 2024 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/sept.-and-oct.-2024-short-term-project-updates/</link>
      <pubDate>Sun, 27 Oct 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/sept.-and-oct.-2024-short-term-project-updates/</guid>
      <description>clj-Nix, Clojure Goes Fast, Jank, Kushi, Malli, Standard Clojure Style</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve got our first set of reports from developers working on short-term projects funded in Q3 2024. You&rsquo;ll find a brief description of each project at the top of the page to provide some context &ndash; followed by current project updates.</p>
<h3 id="clj-nix-josé-luis-lafuenteclj-nix-josé-luis-lafuente"><a href="#clj-nix-jos%C3%A9-luis-lafuente">clj-Nix: José Luis Lafuente</a></h3>
<ul>
<li>Develop an alternative builder for Nix that uses Babashka / SCI instead of Bash. It provides a way
for constructing complex Nix derivations using Babashka/SCI entirely, eliminating the need to
write any Bash code.</li>
<li>Also, will be adding a Babashka writer to nixpkgs. Nixpkgs supports creating self-contained scripts, called &ldquo;nix writers.&rdquo; Traditionally written in Bash, recent versions of nixpkgs include the ability to write these scripts in Python, Ruby, or Rust.</li>
</ul>
<h3 id="clojure-goes-fast-oleksandr-yakushevclojure-goes-fast-oleksandr-yakushev"><a href="#clojure-goes-fast-oleksandr-yakushev">Clojure Goes Fast: Oleksandr Yakushev</a></h3>
<ul>
<li>Create a new web application for clj-async-profiler that will allow users to host and share the generated flamegraphs. At the moment, even though flamegraphs are just self-contained HTML files, sending them to
somebody is a chore. The new service can make this much easier and offer extra features
like saving and sharing dynamic transforms on the fly. Additionally, I&rsquo;d like to focus on the UI
side of clj-async-profiler - add new dynamic transforms, improve aesthetics and the UX.</li>
<li>For clj-java-decompiler, expand its preprocessing abilities to present clearer results to the user and integrate it more tightly with established Clojure IDEs like CIDER and Calva, which requires some groundwork.</li>
<li>Adapting and updating benchmarking content in the <a href="https://clojure-goes-fast.com/kb/">Clojure Goes Fast knowledge base</a></li>
</ul>
<h3 id="jank-jeaye--wilkersonjank-jeaye--wilkerson"><a href="#jank-jeaye--wilkerson">Jank: Jeaye  Wilkerson</a></h3>
<p>Jank feels like Clojure now, with 92% syntax parity and nearly 40% clojure.core parity. But it only feels like Clojure to me because none of you are using it yet. My top priority is to change that.  I&rsquo;ll be working on building out jank&rsquo;s nREPL server, which involves implementing bencode support, <code>clojure.test</code>, improving native interop, supporting pre-compiled binary modules, and ultimately adding AOT compilation support.</p>
<h3 id="kushi-jeremiah-coylekushi-jeremiah-coyle"><a href="#kushi-jeremiah-coyle">Kushi: Jeremiah Coyle</a></h3>
<p>Continue development of Kushi, a foundation for building web UI with ClojureScript. Work this funding cycle will focus on finishing the new css transpilation pipeline, significant build system performance upgrades, and implementing a reimagined theming system.</p>
<h3 id="malli-ambrose-bonnaire-sergeantmalli-ambrose-bonnaire-sergeant"><a href="#malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</a></h3>
<p>This project (Constraints and Humanization) aims to drastically improve the expressivity of Malli schemas to help address current user feedback and enable future extensions. The basic idea is to add a constraint language to each schema to express fine-grained invariants and then make this constraint language compatible with validators/explainers/generators/etc so that Malli users can write high-level, precise schemas without resorting to partial workarounds. See prototype here: <a href="https://github.com/frenchy64/malli/pull/12">https://github.com/frenchy64/malli/pull/12</a></p>
<h3 id="scicloj-daniel-slutskyscicloj-daniel-slutsky"><a href="#scicloj-daniel-slutsky">SciCloj: Daniel Slutsky</a></h3>
<p>Check out Daniel&rsquo;s video: <a href="https://www.youtube.com/watch?v=WO6mVURUky4">https://www.youtube.com/watch?v=WO6mVURUky4</a>. Scicloj is a Clojure group developing a stack of tools &amp; libraries for data science.
Alongside the technical challenges, community building has been an essential part of its
efforts since the beginning of 2019. Our community-oriented goal is making the existing data-science stack easy to use through the maturing of the Noj library, mentioned below. In particular, we are working on
example-based documentation, easy setup, and recommended workflows for common tasks. All these, and the tools to support them, grow organically, driven by real-world use-cases. See updates for progress on Q3 projects and documentation.</p>
<h3 id="standard-clojure-stylechris-oakmanstandard-clojure-style-chris-oakman"><a href="#standard-clojure-style-chris-oakman">Standard Clojure Style:Chris Oakman</a></h3>
<p>Continue work on Standard Clojure Style - which is a &ldquo;no config, runs everywhere, follows simple rules&rdquo; formatter for Clojure code. More information about the genesis of the project can be found on Issue #1:
<a href="https://github.com/oakmac/standard-clojure-style-js/issues/1">https://github.com/oakmac/standard-clojure-style-js/issues/1</a><br>
<br></p>
<hr>
<h2 id="project-updates-sept-and-oct-2024--br">Project Updates: Sept. and Oct. 2024  <br></h2>
<hr>
<h3 id="clj-nix-josé-luis-lafuente">clj-Nix: José Luis Lafuente</h3>
<p>Q3 2024 Report No. 1, Published Oct. 13, 2024</p>
<p>In this first half of the funding round, I made progress on two fronts:</p>
<h4 id="babashka-writer-on-nixpkgs">Babashka writer on nixpkgs</h4>
<p>I added a new writer, <code>writeBabashka</code>, to nixpkgs. It&rsquo;s already merged and
currently available on the
<a href="https://nixpk.gs/pr-tracker.html?pr=343510">nixpkgs and nixos unstable branch</a>.</p>
<p>Documentation about this new helper function can be found here:
<a href="https://noogle.dev/q?term=writeBabashka">writeBabashka on Noogle</a></p>
<p>As you can see in the documentation, there are two versions, <code>writeBabashka</code> and
<code>writeBabashkaBin</code>. Both produce the same output script. The only difference is
that the latter places the script within a <code>bin</code> subdirectory. That&rsquo;s a common
pattern in nixpkgs, for consistency with the convention of software packages
placing executables under <code>bin</code>.</p>
<p>Something I still want to do is to create a repository with some examples about
how to use the Babashka writer.</p>
<h4 id="nix-derivation-builder-with-babashka">Nix Derivation Builder with Babashka</h4>
<p>The build step of a Nix derivation is defined by a Bash script. I want to
provide an alternative builder written in Clojure (using Babashka).</p>
<p>I have a working prototype, but the API is still under development and may
change in the future. You can find the initial version on the bbenv branch:
<a href="https://github.com/jlesquembre/clj-nix/tree/bb-env/extra-pkgs/bbenv">clj-nix/extra-pkgs/bbenv</a></p>
<p>A pull request for early feedback is available here:
<a href="https://github.com/jlesquembre/clj-nix/pull/147">clj-nix PR #147</a></p>
<p>Here&rsquo;s a glimpse of how it currently works. This example builds the
<a href="https://www.gnu.org/software/hello/">GNU Hello Project</a>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-nix" data-lang="nix">mkBabashkaDerivation {
  build <span style="color:#f92672">=</span> <span style="color:#e6db74">./my/build.clj</span>;
  deps-build <span style="color:#f92672">=</span> [ pkgs<span style="color:#f92672">.</span>gcc ];
}
</code></pre></div><div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[babashka.process <span style="color:#e6db74">:refer</span> [shell]])

(<span style="color:#66d9ef">defn </span>build
  [{<span style="color:#e6db74">:keys</span> [out src]}]
  (<span style="color:#a6e22e">shell</span> {<span style="color:#e6db74">:dir</span> src} (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;./configure --prefix=%s&#34;</span> out))
  (<span style="color:#a6e22e">shell</span> {<span style="color:#e6db74">:dir</span> src} <span style="color:#e6db74">&#34;make install&#34;</span>))

(<span style="color:#66d9ef">def </span>version  <span style="color:#e6db74">&#34;2.12.1&#34;</span>)<span style="color:#75715e">;</span>

(<span style="color:#66d9ef">def </span>pkg
  {<span style="color:#e6db74">:name</span> <span style="color:#e6db74">&#34;hello&#34;</span>
   <span style="color:#e6db74">:version</span> version
   <span style="color:#e6db74">:src</span> {<span style="color:#e6db74">:fetcher</span> <span style="color:#e6db74">:fetchurl</span>
         <span style="color:#e6db74">:url</span> (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;mirror://gnu/hello/hello-%s.tar.gz&#34;</span> version)
         <span style="color:#e6db74">:hash</span> <span style="color:#e6db74">&#34;sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=&#34;</span>}
   <span style="color:#e6db74">:build</span> build})
</code></pre></div><br>
<hr>
<h3 id="clojure-goes-fast-oleksandr-yakushev">Clojure Goes Fast: Oleksandr Yakushev</h3>
<p>Q3 2024 Report No. 1, Published Sept.30, 2024</p>
<p>I&rsquo;ve spent the first month of my Clojurists Together project polishing the user experience for clj-async-profiler. The profile viewer UI (the flamegraph renderer) received big improvements in navigation, ease of access, consistency, and overall look. As a bullet list:</p>
<ul>
<li>Published one big release of clj-async-profiler (1.3.0) and two small releases (1.3.1 and 1.3.2). Most important changes:
<ul>
<li>Completely redesigned collapsible sidebar.</li>
<li>Better rendering performance and responsiveness.</li>
<li>New custom on-hover tooltip.</li>
<li>Fewer configuration options for better out-of-the-box experience.</li>
</ul>
</li>
<li>Blogged about 1.3.0 release describing in detail and with demonstration what has changed: <a href="https://clojure-goes-fast.com/blog/clj-async-profiler-130/">https://clojure-goes-fast.com/blog/clj-async-profiler-130/</a></li>
<li>Prepared multiple UI mockups for the flamegraph sharing website that I&rsquo;m starting to work on in the second month.  <br></li>
</ul>
<hr>
<h3 id="jank-jeaye--wilkerson">Jank: Jeaye  Wilkerson</h3>
<p>Q3 2024 Report No. 1, Published Oct. 14, 2024</p>
<p>Hi everyone! It&rsquo;s been a few months since the last update and I&rsquo;m excited to
outline what&rsquo;s been going on and what&rsquo;s upcoming for jank, the native Clojure
dialect. Many thanks to Clojurists Together and my Github sponsors for the
support. Let&rsquo;s get into it!</p>
<h4 id="heart-of-clojure">Heart of Clojure</h4>
<p>In September, I flew from Seattle to Belgium to speak at Heart of Clojure. For
the talk, I wanted to dig deep into the jank details, so I created a walk-through
of implementing exception handling in jank. You can watch my talk <a href="https://www.youtube.com/watch?v=5ejOkeNCbXY">here</a>.</p>
<h4 id="announcement">Announcement</h4>
<p>Part of my Heart of Clojure talk was an announcement that, starting in January
2025, <strong>I&rsquo;ll be quitting my job at EA to focus on jank full-time</strong>. Two years ago, I
switched from full-time to part-time at EA in order to have more time for jank.
Now, with the momentum we have, the interest I&rsquo;ve gathered, and the motivation
backing this huge effort, I&rsquo;m taking things all the way.</p>
<p>I don&rsquo;t have funding figured out yet, though. It&rsquo;s hard for companies to invest
in jank now when they&rsquo;re not using it, when it&rsquo;s not providing them value. So my
goal is to get jank out there and start creating value in the native Clojure
space. If using jank interests you and you want white glove support for
onboarding jank once it&rsquo;s released, reach out to me.</p>
<h4 id="mentoring">Mentoring</h4>
<p>On top of working on jank full-time, next year, I have joined the
<a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">SciCloj mentorship program</a>
as a mentor and have two official mentees with whom I meet weekly (or at least
once every two weeks) in order to help them learn to be compiler hackers by
working on jank. This is in tandem with the other mentee I had prior to the
SciCloj program.</p>
<p>What&rsquo;s so inspiring is that there were half a dozen interested people, who
either reached out to me directly or went through the application process, and
we had to pare down the list to just two for the sake of time. Each of those
folks wants to push jank forward and learn something along the way.</p>
<h4 id="jit-compilation-speeds">JIT compilation speeds</h4>
<p>Now, jumping into the development work which has happened in the past few
months, it all starts with me looking into optimizing jank&rsquo;s startup time. You
might think this is a small issue, given that jank needs more development
tooling, improved error messages, better Clojure library support, etc. However,
this is the crux of the problem.</p>
<p>jank is generating C++ from its AST right now. This has some great benefits,
particularly since jank&rsquo;s runtime is implemented in C++. It allows us to take
advantage of C++&rsquo;s type inference, overloading, templates, and virtual dispatch,
whereas we&rsquo;d have none of those things if we were generating LLVM IR, machine
code, or even C.</p>
<p>However, JIT compiling C++ as our primary codegen comes with on big problem: C++
is one of the slowest to compile languages there is. As a concrete example, in
jank, <code>clojure.core</code> is about 4k (formatted) lines of jank code. This codegens
to around 80k (formatted) lines of C++ code. On my beefy desktop machine, it
takes 12 seconds to JIT compile all of that C++. This means that starting jank,
with no other dependencies than <code>clojure.core</code>, takes 12 seconds.</p>
<p>To be fair, all of this disappears in AOT builds, where startup time is more
like 50ms. But starting a REPL is something we do every day. If it takes 12
seconds now, how long will it take when you start a REPL for your company&rsquo;s
large jank project? What if your machine is not as beefy? A brave user who
recently compiled jank for WSL reported that it took a minute to JIT compile
<code>clojure.core</code> for them.</p>
<p>So, this leads us to look for solutions. jank is already using a pre-compiled
header to speed up JIT compilation. Before abandoning C++ codegen, I wanted to
explore how we could pre-compile modules like <code>clojure.core</code>, too. Very
pleasantly, the startup time improvements were great. jank went from 12 seconds
to 0.3 seconds to start up, when <code>clojure.core</code> is pre-compiled as a C++20
module and then loaded in as a shared library.</p>
<figure>
  <object type="image/svg+xml" data="https://jank-lang.org/img/blog/2024-10-14-llvm-ir/pcm.plot.svg" width="30%">
    <img src="https://jank-lang.org/img/blog/2024-10-14-llvm-ir/pcm.plot.svg" width="30%"></img>
  </object>
</figure>
<p>There&rsquo;s a catch, though. It takes 2 full minutes to AOT compile <code>clojure.core</code>
to a C++20 pre-compiled module. So, we&rsquo;re back to the same problem. jank could
compile all of your dependencies to pre-compiled modules, but it may take 30
minutes to do so, even on a reasonable machine. For non-dependency code, your
own source code, jank could use a compilation cache, but you&rsquo;ll still need to
pay the JIT compilation cost whenever you do a clean build, whenever you eval a
whole file from the REPL, etc.</p>
<p>Before digging deeper into this, I wanted to explore what things would look like
in a world where we don&rsquo;t codegen C++.</p>
<h4 id="llvm-ir">LLVM IR</h4>
<p>LLVM has support for JIT compiling its own intermediate representation (IR),
which is basically a high level assembly language. Compared to generating C++,
though, we run into some problems here:</p>
<ol>
<li>Calling into C++ is tough, since C++ uses name mangling and working C++ value
types involves non-trivial IR</li>
<li>We can&rsquo;t do things like instantiate C++ templates, since those don&rsquo;t exist
in IR land</li>
</ol>
<p>So we need to work with jank at a lower level. As I was designing this, in my
brain, I realized that we just need a C API. jank has a C++ API, which is what
we&rsquo;re currently using, but if we had a C API then we could just call into that
from assembly. Heck, if we can just write out the C we want, translating that to
assembly (or IR) is generally pretty easy. That&rsquo;s what I did. I took an example
bit of Clojure code and I wrote out some equivalent C-ish code, using a made-up
API:</p>
<h4 id="clojure">Clojure</h4>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defn </span>say-hi [who]
  (println <span style="color:#e6db74">&#34;hi &#34;</span> who <span style="color:#e6db74">&#34;!&#34;</span>))
</code></pre></div><h4 id="c">C</h4>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-c" data-lang="c"><span style="color:#66d9ef">static</span> jank_object_ptr const_1 <span style="color:#f92672">=</span> jank_create_string(<span style="color:#e6db74">&#34;hi &#34;</span>);   
<span style="color:#66d9ef">static</span> jank_object_ptr const_2 <span style="color:#f92672">=</span> jank_create_string(<span style="color:#e6db74">&#34;!&#34;</span>);  

jank_object_ptr <span style="color:#a6e22e">say_hi</span>(jank_object_ptr who)  
{
  jank_object_ptr println_var <span style="color:#f92672">=</span> jank_var_intern(<span style="color:#e6db74">&#34;clojure.core&#34;</span>, <span style="color:#e6db74">&#34;println&#34;</span>);  
  jank_object_ptr println <span style="color:#f92672">=</span> jank_deref(println_var);  
  <span style="color:#66d9ef">return</span> jank_call3(println, const_1, who, const_2);  
}  

<span style="color:#66d9ef">static</span> jank_object_ptr <span style="color:#a6e22e">fn_1</span>()  
{  
  jank_object_ptr say_hi_var <span style="color:#f92672">=</span> jank_var_intern(<span style="color:#e6db74">&#34;clojure.core&#34;</span>, <span style="color:#e6db74">&#34;say-hi&#34;</span>);  
  jank_object_ptr say_hi_obj <span style="color:#f92672">=</span> jank_create_function1(<span style="color:#f92672">&amp;</span>say_hi);  
  jank_var_bind_root(say_hi_var, say_hi_obj);  
  <span style="color:#66d9ef">return</span> say_hi_var;  
}  
</code></pre></div><p>This was motivating. Furthermore, <strong>after two weekends, I have the LLVM IR codegen almost entirely done!</strong><br>
The only thing missing is codegen for closures (functions with captures) and <code>try</code> expressions, since those involve some extra work. I&rsquo;ll give an example of how this looks, with exactly the IR we&rsquo;re generating, before
LLVM runs any optimization passes.</p>
<h4 id="clojure-1">Clojure</h4>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">let </span>[a <span style="color:#ae81ff">1</span>
      b <span style="color:#e6db74">&#34;meow&#34;</span>]
  (println b a))
</code></pre></div><h4 id="llvm-ir-1">LLVM IR</h4>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-llvm" data-lang="llvm"><span style="color:#75715e">; ModuleID = &#39;clojure.core-24&#39;
</span><span style="color:#75715e"></span><span style="color:#66d9ef">source_filename</span> = <span style="color:#e6db74">&#34;clojure.core-24&#34;</span>  

<span style="color:#75715e">; Each C function we reference gets declared.  
</span><span style="color:#75715e"></span><span style="color:#66d9ef">declare</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_create_integer(<span style="color:#960050;background-color:#1e0010">ptr</span>)
<span style="color:#66d9ef">declare</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_create_string(<span style="color:#960050;background-color:#1e0010">ptr</span>)
<span style="color:#66d9ef">declare</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_var_intern(<span style="color:#960050;background-color:#1e0010">ptr</span>, <span style="color:#960050;background-color:#1e0010">ptr</span>)
<span style="color:#66d9ef">declare</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_deref(<span style="color:#960050;background-color:#1e0010">ptr</span>)
<span style="color:#66d9ef">declare</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_call2(<span style="color:#960050;background-color:#1e0010">ptr</span>, <span style="color:#960050;background-color:#1e0010">ptr</span>, <span style="color:#960050;background-color:#1e0010">ptr</span>)

<span style="color:#75715e">; All constants and vars are lifted into internal  
</span><span style="color:#75715e">; globals and initialized once using a global ctor.
</span><span style="color:#75715e"></span>@int_1 = <span style="color:#66d9ef">internal</span> <span style="color:#66d9ef">global</span> <span style="color:#960050;background-color:#1e0010">ptr</span> <span style="color:#ae81ff">0</span>
@string_2025564121 = <span style="color:#66d9ef">internal</span> <span style="color:#66d9ef">global</span> <span style="color:#960050;background-color:#1e0010">ptr</span> <span style="color:#ae81ff">0</span>
@0 = <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">unnamed_addr</span> <span style="color:#66d9ef">constant</span> [<span style="color:#ae81ff">5</span> <span style="color:#66d9ef">x</span> <span style="color:#66d9ef">i8</span>] <span style="color:#66d9ef">c</span><span style="color:#e6db74">&#34;meow\00&#34;</span>, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">1</span>
@var_clojure.core_SLASH_println = <span style="color:#66d9ef">internal</span> <span style="color:#66d9ef">global</span> <span style="color:#960050;background-color:#1e0010">ptr</span> <span style="color:#ae81ff">0</span>
@string_4144411177 = <span style="color:#66d9ef">internal</span> <span style="color:#66d9ef">global</span> <span style="color:#960050;background-color:#1e0010">ptr</span> <span style="color:#ae81ff">0</span>
@1 = <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">unnamed_addr</span> <span style="color:#66d9ef">constant</span> [<span style="color:#ae81ff">13</span> <span style="color:#66d9ef">x</span> <span style="color:#66d9ef">i8</span>] <span style="color:#66d9ef">c</span><span style="color:#e6db74">&#34;clojure.core\00&#34;</span>, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">1</span>
@string_4052785392 = <span style="color:#66d9ef">internal</span> <span style="color:#66d9ef">global</span> <span style="color:#960050;background-color:#1e0010">ptr</span> <span style="color:#ae81ff">0</span>
@2 = <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">unnamed_addr</span> <span style="color:#66d9ef">constant</span> [<span style="color:#ae81ff">8</span> <span style="color:#66d9ef">x</span> <span style="color:#66d9ef">i8</span>] <span style="color:#66d9ef">c</span><span style="color:#e6db74">&#34;println\00&#34;</span>, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">1</span>  

<span style="color:#75715e">; Our global ctor function. It boxes all our
</span><span style="color:#75715e">; ints and strings while interning our vars.
</span><span style="color:#75715e"></span><span style="color:#66d9ef">define</span> <span style="color:#66d9ef">void</span> @jank_global_init_23() {
entry:  
  %0 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_create_integer(<span style="color:#66d9ef">i64</span> <span style="color:#ae81ff">1</span>)
  <span style="color:#66d9ef">store</span> <span style="color:#960050;background-color:#1e0010">ptr</span> %0, <span style="color:#960050;background-color:#1e0010">ptr</span> @int_1, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %1 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_create_string(<span style="color:#960050;background-color:#1e0010">ptr</span> @0)
  <span style="color:#66d9ef">store</span> <span style="color:#960050;background-color:#1e0010">ptr</span> %1, <span style="color:#960050;background-color:#1e0010">ptr</span> @string_2025564121, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %2 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_create_string(<span style="color:#960050;background-color:#1e0010">ptr</span> @1)
  <span style="color:#66d9ef">store</span> <span style="color:#960050;background-color:#1e0010">ptr</span> %2, <span style="color:#960050;background-color:#1e0010">ptr</span> @string_4144411177, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %3 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_create_string(<span style="color:#960050;background-color:#1e0010">ptr</span> @2)
  <span style="color:#66d9ef">store</span> <span style="color:#960050;background-color:#1e0010">ptr</span> %3, <span style="color:#960050;background-color:#1e0010">ptr</span> @string_4052785392, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %4 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_var_intern(<span style="color:#960050;background-color:#1e0010">ptr</span> %2, <span style="color:#960050;background-color:#1e0010">ptr</span> %3)
  <span style="color:#66d9ef">store</span> <span style="color:#960050;background-color:#1e0010">ptr</span> %4, <span style="color:#960050;background-color:#1e0010">ptr</span> @var_clojure.core_SLASH_println, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  <span style="color:#66d9ef">ret</span> <span style="color:#66d9ef">void</span>  
}
  
<span style="color:#75715e">; Our effecting fn which does the work of the actual code.
</span><span style="color:#75715e">; Here, that just means derefing the println var and calling it.
</span><span style="color:#75715e"></span><span style="color:#66d9ef">define</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @repl_fn_22() {
entry:
  %0 = <span style="color:#66d9ef">load</span> <span style="color:#960050;background-color:#1e0010">ptr</span>, <span style="color:#960050;background-color:#1e0010">ptr</span> @int_1, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %1 = <span style="color:#66d9ef">load</span> <span style="color:#960050;background-color:#1e0010">ptr</span>, <span style="color:#960050;background-color:#1e0010">ptr</span> @string_2025564121, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %2 = <span style="color:#66d9ef">load</span> <span style="color:#960050;background-color:#1e0010">ptr</span>, <span style="color:#960050;background-color:#1e0010">ptr</span> @var_clojure.core_SLASH_println, <span style="color:#66d9ef">align</span> <span style="color:#ae81ff">8</span>
  %3 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_deref(<span style="color:#960050;background-color:#1e0010">ptr</span> %2)
  %4 = <span style="color:#66d9ef">call</span> <span style="color:#960050;background-color:#1e0010">ptr</span> @jank_call2(<span style="color:#960050;background-color:#1e0010">ptr</span> %3, <span style="color:#960050;background-color:#1e0010">ptr</span> %1, <span style="color:#960050;background-color:#1e0010">ptr</span> %0)
  <span style="color:#66d9ef">ret</span> <span style="color:#960050;background-color:#1e0010">ptr</span> %4
}  
</code></pre></div><p>There&rsquo;s still more to do before I can get some real numbers for how long it
takes to JIT compile LLVM IR, compared to C++. However, I&rsquo;m very optimistic. By
using a C API, instead of our C++ API, handling codegen optimizations
like unboxing ends up being even more complex, but we also have even more power.</p>
<h4 id="how-this-affects-interop">How this affects interop</h4>
<p>Currently, jank has two forms of native interop (one in each direction):</p>
<ol>
<li>A special <code>native/raw</code> form which allows embedding C++ within your jank code</li>
<li>The ability to require a C++ as though it&rsquo;s a Clojure namespace, where that
C++ code then uses jank&rsquo;s runtime to register types/functions</li>
</ol>
<p>When we&rsquo;re generating C++, a <code>native/raw</code> just gets code-generated right into
place. However, when we&rsquo;re generating IR, we can&rsquo;t sanely do that without
involving a C++ compiler. This means that <code>native/raw</code> will need to go away, to
move forward with IR. However, I think this may be a good move. If we buy into
the second form of interop more strongly, we can rely on actual native source
files to reach into the jank runtime and register their types/functions. Then,
in the actual jank code, everything feels like Clojure.</p>
<p>This means that we still have a need for JIT compiling C++. Whenever you <code>require</code>
a module from your jank code, which is backed by a C++ file, that code is JIT
compiled. Generally, what the C++ code will do is register the necessary functions
into the jank runtime so that way you can then drive the rest of your program
with jank code. I think this is a happy medium, where we still have the full
power of C++ at our disposal, but all of our jank code will result in IR, which
will JIT compile much more quickly than C++.</p>
<p>This means the answer to the question of C++ or IR is: <strong>why not both?</strong></p>
<h4 id="jank-as-the-native-clojure-dialect">jank as THE native Clojure dialect</h4>
<p>There&rsquo;s another reason which leads me to explore LLVM IR within jank. While jank
is embracing modern C++, it doesn&rsquo;t need to be so tightly coupled to it. By
using just the C ABI as our runtime library, everything can talk to jank. You
could talk to jank from Ruby, Lua, Rust, and even Clojure JVM. Just as
importantly, jank can JIT compile any LLVM IR, which means any language which
compiles on the LLVM stack can then be JIT compiled into your jank program.</p>
<p>Just as jank can load C++ files as required namespaces, seamlessly, so too could
it do the same for Rust, in the future. Furthermore, as the public interface for
jank becomes C, the internal representation and implementation can change
opaquely, which would also open the door for more Rust within the jank compiler.</p>
<p>In short, <em>any native work you want to do in Clojure</em> should be suited for jank.
Your jank code can remain Clojure, but you can package C, C++, and later
languages like Rust inside your jank projects and require then from your jank
code. The jank compiler and runtime will handle JIT compilation and AOT
compilation for you.</p>
<h4 id="community-update">Community update</h4>
<p>This has been a long update which hopefully created some more excitement for
jank&rsquo;s direction. I want to wrap up with what the community has been up to
recently, though, since that alone warrants celebration.</p>
<h4 id="characters-scientific-notation-and-to_code_string">Characters, scientific notation, and to_code_string</h4>
<p><a href="https://github.com/Samy-33">Saket</a> has been improving jank&rsquo;s runtime character
objects, which he originally implemented, to be more efficient and support
Unicode. He also recently added scientific notation for floating point values,
as well as an extension of jank&rsquo;s object concept to support <code>to_code_string</code>,
which allows us to now implement <code>pr-str</code>.</p>
<p>At this point, Saket has the most knowledge of jank&rsquo;s internals, aside from me,
so I&rsquo;ve been giving him heftier tasks and he&rsquo;s been super helpful.</p>
<h4 id="more-robust-escape-sequences">More robust escape sequences</h4>
<p>One of my SciCloj mentees, <a href="https://github.com/jianlingzhong">Jianling</a>,
recently merged support for all of the ASCII escape sequences for jank&rsquo;s
strings. Previously, we only had rudimentary support. Now he&rsquo;s working on
support for hexadecimal, octal, and arbitrary radix literals, to further jank&rsquo;s
syntax parity with Clojure.</p>
<h4 id="nix-build">Nix build</h4>
<p>We have a newcomer to jank, <a href="https://github.com/haruki7049">Haruki</a>, helping to
rework the build system and dependencies to allow for easy building with Nix!
There&rsquo;s a draft PR <a href="https://github.com/jank-lang/jank/pull/94">here</a>. I&rsquo;m
excited for this, since I&rsquo;m currently using NixOS and I need to do a lot of jank
dev in a distrobox for easy building. This will also help with stable CI builds
and ultimately getting jank into nixpkgs (the central package repo for Nix).</p>
<h4 id="llvm-19-support">LLVM 19 support</h4>
<p>The last JIT hard crash fix in LLVM is being backported to the 19.x branch,
which means we should be able to start using Clang/LLVM binaries starting 19.2!
This is going to drastically simplify the developer experience and allow for
packaging jank using the system Clang/LLVM install. My
<a href="https://github.com/llvm/llvm-project/issues/111068">backport ticket</a>
has been closed as complete, though <a href="https://github.com/llvm/llvm-project/pull/111953">the PR</a>
into the 19.x branch is still open.</p>
<h4 id="summary">Summary</h4>
<p>More people are working on jank now than ever have; I expect this number to
keep growing in the coming year. I&rsquo;ll see you folks at the Conj and, after that,
in my next update during the holiday season, when I&rsquo;ll have some final numbers
comparing jank&rsquo;s startup times with LLVM IR vs C++, as well as some updates on
other things I&rsquo;ve been tackling.<br></p>
<hr>
<h3 id="kushi-jeremiah-coyle">Kushi: Jeremiah Coyle</h3>
<p>Q3 2024 Report No. 1, Published Oct. 15, 2024</p>
<h3 id="q3-milestones">Q3 Milestones</h3>
<p>Thanks to the funding from Clojurists Together, the Q3 development of Kushi is aimed at achieving the following 3 milestones:</p>
<ol>
<li>Finishing the new css transpilation API.</li>
<li>Reimplementing the build system for enhanced performance.</li>
<li>A reimagined theming system.</li>
</ol>
<h3 id="progress">Progress</h3>
<h4 id="milestone-1-finishing-the-new-css-transpilation-api">Milestone #1: Finishing the new css transpilation API.</h4>
<ul>
<li><strong>Goals</strong>
<ol>
<li>Solidify the API design and implementation of Kushi&rsquo;s CSS transpilation functionality.</li>
<li>Incorporate the use of lightingcss for CSS transformation (older browsers) and minification.</li>
<li>Refactor existing public functions for injecting stylesheets, google fonts, etc.</li>
</ol>
</li>
<li><strong>Progress:</strong> Complete. The majority of the time spent working on Kushi in the first half of the funding period was focused on implementing a new CSS transpilation pipeline. An updated set of public macros and supporting functions was designed and implemented around this. A broad test suite was written, which consists of 7 tests containing 54 assertions.</li>
<li><strong>Next steps:</strong> When the work on the new build system (milestone #2) is complete, test this new API by upgrading existing UI work (such as Kushi&rsquo;s interactive documentation site) that uses the current (soon to be previous) API, then adjust and refine implementation details as necessary.</li>
</ul>
<h4 id="milestone-2-reimplementing-the-build-system-for-enhanced-performance">Milestone #2: Reimplementing the build system for enhanced performance.</h4>
<ul>
<li><strong>Goal</strong>: Reimplement the build system for performance, and eliminate the use of side-effecting macros.</li>
<li><strong>Progress:</strong> 75% of the initial design, discovery, and experimentation phase is complete.</li>
<li><strong>Next steps:</strong> I anticipate moving it into the implementation phase by the last week of October. Roughly half of the the remaining 6 weeks of the Q3 period will be spent building this out.</li>
</ul>
<h4 id="milestone-3-a-reimagined-theming-system">Milestone #3: A reimagined theming system.</h4>
<ul>
<li>
<p><strong>Goal</strong>: Based on learnings from using Kushi to build a lot of production UI over that last 2-3 years, redesign and implement a new theming system. This will involve harmonizing 3 principled subsystems:</p>
<ol>
<li>Design tokens (a global system of CSS custom properties).</li>
<li>Utility classes.</li>
<li>Component-level data-attribute conventions.</li>
</ol>
</li>
<li>
<p><strong>Progress:</strong> 90% of the initial design, discovery, and experimentation phase is complete.</p>
</li>
<li>
<p><strong>Next steps:</strong> I am hoping that enough progress will be made on the build system so that I can focus Kushi dev time on this new theming system for the last 3 weeks of November.</p>
</li>
</ul>
<h3 id="details">Details</h3>
<p>All of the work related to Milestone #1 has been happening in <a href="https://github.com/kushidesign/kushi-css">a sandbox repo called kushi-css</a>. Additional in-depth detail and documentation around this work can be found <a href="https://github.com/kushidesign/kushi-css/blob/main/doc/towards-kushi-v1.md">here</a>. When all 3 of the above grated into the main kushi repo.<br></p>
<hr>
<h3 id="malli-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</h3>
<p>Q3 2024 Report No. 1, Published Oct. 18, 2024</p>
<h3 id="malli-constraints---report-1">Malli Constraints - Report 1</h3>
<p>This is the first report of three in the project to extend Malli with constraints.</p>
<p>tldr; I gave a <a href="https://www.youtube.com/live/28S96Ms8WOc">talk</a> and started <a href="https://github.com/frenchy64/malli/pull/20/files">implementation</a> and reflect its successes and failures below.</p>
<p>Thanks to Tommi (Malli lead dev) for working with me to propose the project, and the encouragement
I received from the Malli community and my friends.</p>
<p>This is a long update that really helps me get my thoughts in order for such a complex project. Thanks for reading and feel free to email me any questions or comments.</p>
<h4 id="background">Background</h4>
<p>In this project, I proposed to extend the runtime verification library
Malli with constraints with the goal of making the library more expressive
and powerful.</p>
<p>With this addition, schemas can be extended with extra invariants (constraints) that must be
satisfied for the schema to be satisfied. Anyone can add a constraint to a schema.
Crucially, these extensions should work as seamlessly as if the author of the schema
added it themselves.</p>
<p>Before the project started, I had completed an extensive prototype that generated many
ideas. The authors of Malli were interested in integrating these ideas in Malli and this
project aims to have their final forms fit with Malli in collaboration with the Malli devs.</p>
<h4 id="talk">Talk</h4>
<p>It had been several months since I had built the prototype of Malli constraints, so
I gave a talk at <a href="https://madclj.com">Madison Clojure</a> which I live-streamed.
You can watch it <a href="https://www.youtube.com/live/28S96Ms8WOc">here</a>.</p>
<p>It was well received and very enjoyable to give. I&rsquo;m thankful to the attendees for their
engagement and encouragement, and for checking in on my progress during the project.</p>
<p>In the talk, I motivate the need for more expressive yet reliable schemas, propose
a solution in the form of constraints, and sketch some of the design ideas for
making it extensible. I gave this talk a few days before the project started and I hit the ground running.</p>
<h4 id="design-goals-constraints">Design Goals (Constraints)</h4>
<p>I&rsquo;ve had many fruitful interactions with the Malli community its developers
and I have a good idea what the project values. If this constraints project is to be
successful, it must check all the boxes as if it came straight from
the brain of Tommi (well, that&rsquo;s my goal, Tommi is busy and has enjoyably
high standards). Given how deeply this project aims to integrate with
Malli, that attitude has definitely helped prune ideas (when was the
last time <code>:string</code> or <code>:int</code> changed it&rsquo;s implementation? We&rsquo;re
doing exactly that here).</p>
<p>There is a mundane but critical issue that Malli has been steadily
increasing its CLJS bundle size. I decided early on that my design
for constraints would be opt-in, so that the Malli devs can decide
whether its worth including by default. If adding constraints irreversibly
increased the CLJS bundle size to the point that Malli devs started worrying,
this project would be in jeopardy.</p>
<p>My prototype made constraints an entirely custom construct, unrelated
to the rest of Malli. It&rsquo;s helpful to look at a related project under
similar circumstances: extending Malli to add sequence expressions
like <code>:alt</code> and <code>:*</code>. Sequence expressions
are a different abstraction than schemas, and yet they share many implementation
concepts, both even implementing <code>m/Schema</code>. Sequence expressions then
implement additional protocols for their characterizing operations.
I wanted to take inspiration from this: constraints should be like
schemas in their overlapping concepts, introducing new abstractions
only for differences.</p>
<p>I would like the constraints framework be merged incrementally, starting
with very simple constraints on the count and size of collections
and numbers. However, the framework itself should be fully realized
and be able to support much more complex constraints.</p>
<p>The last few goals are easy to list, but maximizing them all simultaneously
might be difficult as seem in deep tension.
Constraints should be fast, extensible, and robust.
It should be possible to achieve equivalent performance to a &ldquo;hand-coded&rdquo;
implementation of the constraint. It should be possible to implement as
many kinds of constraints as possible without having to change the constraint
framework itself. Constraints should have predictable, reliable semantics
that are congruent to the rest of Malli&rsquo;s design.</p>
<p><strong>Summary of goals:</strong></p>
<ul>
<li>control bundle size</li>
<li>backwards compatibility</li>
<li>equivalent performance
<ul>
<li>in tension with extensibility and compilation</li>
</ul>
</li>
<li>extensibility
<ul>
<li>provide expressivity and power of primitives</li>
</ul>
</li>
<li>robustness
<ul>
<li>think about Malli&rsquo;s unwritten rules (properties round-trip)</li>
</ul>
</li>
<li>first iteration should be fully realized but minimal</li>
</ul>
<h3 id="development">Development</h3>
<p><a href="https://github.com/frenchy64/malli/pull/20/files">Diff</a></p>
<p><a href="https://github.com/frenchy64/malli/tree/min-max-constraints">Branch</a></p>
<p>My first attempt at an idiomatic implementation of schema constraints
was completed in the first half of September. Since then it&rsquo;s been
hammock-time pondering the results. I have surprisingly strong feelings
in both directions.</p>
<p>I go into more detail below.</p>
<h4 id="opt-in-for-cljs-bundle-size">Opt-in for CLJS Bundle size</h4>
<p>I was able to separate the constraints framework from
<code>malli.core</code> so it can be opt-in to control CLJS bundle size.
The main code path adds several functions and a couple of protocols,
but the constraints themselves are loaded separately via an atom
that also lives in <code>malli.core</code>. This atom <code>m/constraint-extensions</code>
can be empty which will disable constraints, kicking in a backwards-compatibility mode for schemas
that migrated their custom properties to constraints (like <code>:string</code>&rsquo;s <code>:min</code> and <code>:max</code>).</p>
<p>I went back and forth about whether to use a single global atom or
to add some internal mutable state to each schema that could be upgraded
to support constraints. In this implementation, I decided a global atom was
more appropriate for two reasons. First, registries can hold multiple copies
of the same schema but only one will &ldquo;win&rdquo;. We don&rsquo;t want situations where
we extend a schema with constraints and then it gets &ldquo;shadowed&rdquo; by another
instance of the same schema, since that is functionally equivalent in all
other situations. Second, we already have an established way of extending schemas
to new operations in the form of a multimethod dispatching on <code>m/type</code>. I wanted
a similar experience where an entire class of extension is self-contained in one
global mutable variable.</p>
<p>Extending schemas with constraints is subtly different to many other kinds of
schema extensions, in that it is much finer grained. <code>defmulti</code> is appropriate
for defining generators or JSON Schema transformers where a schema extension
maps precisely to a function (<code>defmethod</code>), but extending constraints
is more like having a separate atom for each schema containing a map where
each field can themselves be extended with namespaced keywords. A single global
atom containing a map from schemas to constraint configuration became the natural
choice (an atom of atoms is rarely a good idea).</p>
<p>Ultimately the constraint implementation is activated by calling
<code>(malli.constraint/activate-base-constraints!)</code>.</p>
<h4 id="reusing-existing-abstractions">Reusing existing abstractions</h4>
<p>Constraints implement <code>m/Schema</code> and their <code>m/IntoSchema</code>&rsquo;s live in the registry.
They differ from schemas in how they are constructed and print
(it depends which schema the constraint is attached to) so they have their own
equivalent to <code>m/schema</code> in <code>malli.constraint/constraint</code>.</p>
<p>As I outlined in my talk, it was important to have multiple ways to parse
the same constraint for maximum reuse. For example, <code>[:string {:min 10}]</code> and <code>[:vector {:min 10}]</code>
should yield equivalent constraints on <code>count</code>, while <code>[:int {:min 10}]</code> and <code>[:float {:min 10}]</code>
yield constraints on size. This is useful when solving constraints for generators
(malli.constraint.solver).</p>
<h4 id="extensibility">Extensibility</h4>
<p>The new implementation converts the <code>:min</code>, <code>:max</code>, <code>:gen/min</code>, and <code>:gen/max</code>
properties on the <code>:string</code> schema to constraints. They are implemented
separately from <code>:string</code> itself in a successful test of the extensibility
of constraints.</p>
<p><code>malli.constraint/base-constraint-extensions</code> contains the configuration
for these <code>:string</code> constraints, which consist of the <code>:true</code>, <code>:and</code>, and <code>:count</code>
constraints. There are several ways to attach <code>:count</code> constraints to a <code>:string</code>,
each of which has a corresponding parser. For example, a string with a count between
1 and 5 (inclusive) can be created via <code>[:string {:min 1 :max 5}]</code> or
<code>[:string {:and [:count 1 5]}]</code>. The <code>:string :parse-properties :{min,max}</code> configuration shows how
to parse the former and <code>:string :parse-constraint :count</code> the latter.</p>
<h4 id="performance">Performance</h4>
<p>Extensibility and performance are somewhat at odds here. While it&rsquo;s great that two
unrelated parties could define <code>:min</code> and <code>:max</code> in <code>[:string {:min 1 :max 5}]</code>,
we are left with a compound constraint <code>[:and [:count 1] [:count nil 5]]</code> (for the <code>:min</code>
and <code>:max</code> properties, respectively). To generate an efficient validator for the overall constraint we
must simplify the constraint to <code>[:count 1 5]</code>. The difference in validators before
and after intersecting are <code>#(and (&lt;= 1 (count %)) (&lt;= (count %) 5))</code> and #(&lt;= 1 (count %) 5)<code>. Depending on the performance of </code>count`, choosing incorrectly could be a large regression in performance.</p>
<p>Constraints have an <code>-intersect</code> method to merge with another constraint
which <code>:and</code> calls when generating a validator. While we regain the performance of validation,
we pay an extra cost in having to create multiple constraints and then simplify them.</p>
<h4 id="robustness">Robustness</h4>
<p>My main concern is a little esoteric but worth considering. Malli has specific
expectations about properties that constraints might break, specifically that properties
won&rsquo;t change if roundtripping a schema.</p>
<p>A constrained schema such as <code>[:string {:min 1}]</code> is really two schemas: <code>:string</code>
and <code>[:count 1]</code>, the latter the result of the new <code>-get-constraint</code> method on
<code>-simple-schema</code>&rsquo;s like <code>:string</code>. The problem comes when serializing this schema
back to the vector syntax: how do we know that <code>[:count 1]</code> should be serialized to
<code>[:string {:min 1}]</code> instead of <code>[:string {:and [:count 1]}]</code>? I don&rsquo;t think
this is a problem for simple constraints like <code>:min</code> since we can just return
the same properties as we started with. There are several odd cases I&rsquo;m not
sure what do with.</p>
<p>For instance, when the <code>:min</code> property is changed:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">-update-properties</span> [<span style="color:#e6db74">:string</span> {<span style="color:#e6db74">:min</span> <span style="color:#ae81ff">1</span>}] <span style="color:#e6db74">:min</span> inc)
<span style="color:#75715e">;=&gt; [:string {:min 2}]</span>
</code></pre></div><p>In this case, the <code>:string</code> schema is recreated along
with a new constraint <code>[:count 2]</code>.</p>
<p>Or, the constraint itself is updated with the new <code>-set-constraint</code>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">-set-constraint</span> [<span style="color:#e6db74">:string</span> {<span style="color:#e6db74">:min</span> <span style="color:#ae81ff">1</span>}] [<span style="color:#e6db74">:count</span> <span style="color:#ae81ff">2</span>])
<span style="color:#75715e">;=&gt; [:string {:min 2}] OR [:string {:and [:count 2]}] ?</span>
</code></pre></div><p>Here <code>-set-constraint</code> removes all properties related to constraints (since we&rsquo;re replacing
the entire constraint) and then must infer the properties to serialize the new constraint to.
In this case the constraint configuration in <code>:string :unparse-properties ::count-constraint</code>
chooses <code>[:string {:min 2}]</code>, but its resemblance to the initial schema is coincidental
and might yield surprises.</p>
<p>The big task here is thinking about (future) constraints that contain schemas. For example,
you could imagine a constraint <code>[:string {:edn :int}]</code> that describes strings that
<code>edn/read-string</code> to integers. This is very similar to <code>[:string {:registry {::a :int}}]</code>
in that the properties of the schema are actually different before and after parsing the
schema (in this case, <code>m/-property-registry</code> is used to parse and unparse the registry).</p>
<p>Part of the rationale of using <code>-get-constraint</code> as the external interface for extracting
a constraint from a schema is to treat each schema as having one constraint
instead of many small ones is for schema-walking purposes. Property registries don&rsquo;t play
well with schema walking and it takes a lot of work to ensure schemas are walked correctly
(for example, ensuring a particular OpenAPI property is set on every schema, even those in
local registries). Walking schemas inside constraints will be more straightforward. To support constraints,
a schema will extend their <code>-walk</code> algorithm to automatically walk constraints with a separate
&ldquo;constraint walker&rdquo;, and constraints like <code>:edn</code> will revert to the original &ldquo;schema walker&rdquo;
to walk <code>:int</code> in <code>[:string {:edn :int}]</code>. This logic lives in <code>malli.constraint/-walk-leaf+constraints</code>.</p>
<p>This walking setup is intended to cleanly handle refs inside schemas such as:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[<span style="color:#e6db74">:schema</span> {<span style="color:#e6db74">:registry</span> {<span style="color:#e6db74">::a</span> <span style="color:#e6db74">:int</span>}}
 [<span style="color:#e6db74">:string</span> {<span style="color:#e6db74">:edn</span> <span style="color:#e6db74">::a</span>}]]
</code></pre></div><p>Having schemas in properties leaves us in a fragile place in terms of the consistency of schema
serialization. For example, after walking
<code>[:string {:edn :int}]</code> to add an OpenAPI property on each schema, we might end up
with either</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[<span style="color:#e6db74">:string</span> {<span style="color:#e6db74">:edn</span> [<span style="color:#e6db74">:int</span> {<span style="color:#e6db74">:a/b</span> <span style="color:#e6db74">:c</span>}], <span style="color:#e6db74">:a/b</span> <span style="color:#e6db74">:c</span>}]
<span style="color:#75715e">;; or</span>
[<span style="color:#e6db74">:string</span> {<span style="color:#e6db74">:and</span> [<span style="color:#e6db74">:edn</span> [<span style="color:#e6db74">:int</span> {<span style="color:#e6db74">:a/b</span> <span style="color:#e6db74">:c</span>}]], <span style="color:#e6db74">:a/b</span> <span style="color:#e6db74">:c</span>}]
</code></pre></div><p>depending on the <code>:unparse-property</code> attached to <code>:edn</code> constraints under <code>:string</code>.</p>
<p>Or even more fundamentally, the properties of <code>[:string {:edn :int}]</code> become <code>{:edn (m/schema :int)}</code>
when parsed, but how do we figure out it was originally <code>{:edn :int}</code>? The current approach
(which is a consequence of treating each schema as having one constraint via <code>-{get,set}-constraint</code>)
depends on the unparser in <code>:string :unparse-properties ::edn-constraint</code> to guess correctly.</p>
<p>It is unclear how big of a problem this is. My fundamental worry is that schemas will not round-trip syntactically,
but is this lot of worry about nothing? Plenty of schemas don&rsquo;t round-trip syntactically at first, but stabilize
after the first trip, for example <code>[:string {}] =&gt; :string =&gt; :string</code>. The important
thing is that they are semantically identical. This is similar to what I propose for constraints:
deterministically attempt to find the smallest serialization for the constraint within
the properties. If inconsistencies occur, at best might annoy some users, or at worst
it could make constraints incomprehensible (to humans) be restating them in technically-equivalent ways.</p>
<h4 id="next">Next</h4>
<p>I need to resolve this roadblock of constraint serialization inconsistency. Is it a problem?
If it is, do I need to throw out the entire design and start again?  <br></p>
<hr>
<h2 id="scicloj-daniel-slutsky">SciCloj: Daniel Slutsky</h2>
<p>Q3 2024 Report No. 1, Published Oct. 3, 2024<br>
The <a href="https://www.clojuriststogether.org/">Clojurists Together</a> organisation has decided <a href="https://www.clojuriststogether.org/news/q3-2024-funding-announcement/">to sponsor</a> Scicloj community building for Q3 2024, as a project by Daniel Slutsky. This is the second time the project is selected this year. Here is Daniel&rsquo;s update for September.</p>
<p>Comments and ideas would help. :pray:</p>
<p><a href="https://scicloj.github.io/">Scicloj</a> is a Clojure group developing a stack of tools and libraries for data science. Alongside the technical challenges, community building has been an essential part of its efforts since the beginning of 2019. Our current main community-oriented goal is making the existing data-science stack easy to use through the maturing of the Noj library, mentioned below. In particular, we are working on example-based documentation, easy setup, and recommended workflows for common tasks.</p>
<p>All these, and the tools to support them, grow organically, driven by real-world use cases.</p>
<p>I serve as a community organizer at Scicloj, and this project was accepted for Clojurists Together funding in 2024 Q1 &amp; Q3. I also receive regular funding from Nubank.</p>
<p>In this post, I am reporting on my involvement during September 2024, as well as the proposed goals for October.</p>
<p>I had 77 meetings during September. Most of them were one-on-one meetings for open-source mentoring or similar contexts.</p>
<p>All the projects mentioned below are done in collaboration with others. I will mention at least a few of the main people involved.</p>
<h2 id="september-2024-highlights">September 2024 highlights</h2>
<h3 id="scicloj-open-source-mentoringhttpssciclojgithubiodocscommunitygroupsopen-source-mentoring"><a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">Scicloj open-source mentoring</a></h3>
<p>Scicloj is providing mentoring to Clojurians who wish to get involved in open-source. This initiative began in August and has been growing rapidly in September. This program is transforming Scicloj, and I believe it will influence the Clojure community as a whole.</p>
<p>We are meeting so many incredible people who are typically experienced, wise, and open-minded and have not been involved in the past. Making it all work is a special challenge. We have to embrace the uncertainty of working with people of varying availability and dynamically adapt to changes in the team. Building on our years-long experience in community building and open-source collaboration, we know we can support at least some of our new friends in finding impactful paths to contribute. We are already seeing some fruits of this work and still have a lot to improve.</p>
<p>47 people have applied so far. 34 are still active, and 10 have already made meaningful contributions to diverse projects.</p>
<p>I am coordinating the process, meeting all the participants, and serving as one of the mentors alongside generateme, Kira McLean, Adrian Smith, and Jeaye Wilkerson. The primary near-term goals are writing testable tutorials and docs for the <a href="https://github.com/generateme/fastmath">Fastmath</a> and <a href="https://scicloj.github.io/noj/">Noj</a> libraries. Quite a few participants will be working on parts of this core effort. A few other projects where people get involved are <a href="https://scicloj.github.io/clay/">Clay</a>, <a href="https://scicloj.github.io/kindly-noted/">Kindly</a>, <a href="https://jank-lang.org/">Jank</a>, and <a href="https://github.com/phronmophobic/ggml.clj">ggml.clj</a>.</p>
<p>A few notable contributions were by Avicenna (mavbozo), who added a lot to the Fastmath documentation and tutorials; Jacob Windle, who added printing functionality to Fastmath regression models; Muhammad Ridho, who started working on portability of <a href="https://github.com/mentat-collective/emmy-viewers">Emmy Viewers</a> data visualizations; Lin Zihao, who improved the Reagent support to the Kindly standard; Epidiah Ravachol, who worked on insightful tutorials for <a href="https://github.com/cnuernber/dtype-next">dtype-next</a> array-programming; Oleh Sedletskyi, who started working on statistics tutorials; Ken Huang, who&rsquo;ve made various contributions to Clay; and Prakash Balodi, who worked on <a href="https://scicloj.github.io/tablecloth/">Tablecloth</a> issues and started organizing the Scicloj weekly group (see below).</p>
<h4 id="nojhttpssciclojgithubionoj"><a href="https://scicloj.github.io/noj/">Noj</a></h4>
<p>Noj is an entry point to data and science. It integrates a set of underlying libraries through a set of testable tutorials. Here, there were great additions by generateme and Carsten Behering, and I helped a bit with the integration.</p>
<ul>
<li>generateme has made a big release of Fastmath version 3.0.0 alpha - a result of work in the last few months - which is affecting a few of the underlying libraries.</li>
<li>Carsten Behring has released new versions of a few of the machine learning libraries.</li>
<li>Carsten also made important changes to Noj in adding integration tests and automating the dev workflow.</li>
<li>I helped in gradually adapting and testing a few of the underlying libraries.</li>
<li>I helped initiate a few documentation chapters that are being written by new community members.</li>
</ul>
<h4 id="kindlyhttpssciclojgithubiokindly-noted"><a href="https://scicloj.github.io/kindly-noted/">Kindly</a></h4>
<p>Kindly is the standard of data visualizations used by Scicloj tutorials and docs.</p>
<ul>
<li>Timothy Pratley has improved the way the user controls various options.</li>
<li>I helped test and integrate the new features.</li>
<li>We collaborated in creating a kindly-dev team, and a few of the new friends have started contributing to the stack of libraries around Kindly.</li>
</ul>
<h4 id="kindly-renderhttpsgithubcomsciclojkindly-render"><a href="https://github.com/scicloj/kindly-render">Kindly-render</a></h4>
<p>Kindly-render is a general rendering library which serves as a foundation for tools to support Kindly.</p>
<ul>
<li>Timothy Pratley has reinitiating this project.</li>
<li>I joined in design discussions and testing.</li>
</ul>
<h4 id="clayhttpssciclojgithubioclay"><a href="https://scicloj.github.io/clay/">Clay</a></h4>
<p>Clay is a REPL-friendly tool for data visualization and literate programming.</p>
<ul>
<li>I worked on two new release versions. Each was a combination of bugfixes and feature requests.</li>
</ul>
<h4 id="real-world-data-grouphttpssciclojgithubiodocscommunitygroupsreal-world-data"><a href="https://scicloj.github.io/docs/community/groups/real-world-data/">real-world-data group</a></h4>
<p>The real-world-data group is a space for people to share updates on their data projects at work.</p>
<p>Meeting #13 was dedicated to talk runs and discussions preceding the Heart of Clojure conference.
Meeting #14 was an interactive coding session of a data science tutorial.</p>
<h4 id="scicloj-weekly">Scicloj weekly</h4>
<p>Together with Prakash Balodi, we initiated a new weekly meeting for new community members working on open-source projects.</p>
<p>Intentionally, we use a time slot which is more friendly to East and Central Asia time zones, unlike most Clojure meetups.</p>
<p>We have had three meetings so far, with 4, 15, and 6 participants.</p>
<h4 id="linear-algebra-meetings">Linear Algebra meetings</h4>
<p>We organized a new group that will collaborate on implementing and teaching applied linear algebra algorithms in Clojure.</p>
<p>The first meeting actually took place in October 2nd, so we will update more in the next month.</p>
<h4 id="heart-of-clojurehttps2024heartofclojureeu"><a href="https://2024.heartofclojure.eu/">Heart of Clojure</a></h4>
<p>Sami Kallinen represented Scicloj at Heart of Clojure with an incredbible <a href="https://2024.heartofclojure.eu/talks/sailing-with-scicloj-a-bayesian-adventure/">talk about data modelling</a>. The talk was extremely helpful in exploring and demonstrating a lot of the new additions to the Scicloj stack.</p>
<p>I collaborated with Sami on preparing the talk and improving the relevant tools and libraries to support the process.</p>
<h4 id="october-2024-goals">October 2024 goals</h4>
<p>This is the tentative plan. Comments and ideas would be welcome.</p>
<h4 id="noj-and-fastmath">Noj and Fastmath</h4>
<ul>
<li>Both these libraries will recieve lots of attention in the form of (testable) tutorials and docs. I will be working with a few people on vairous chapters of that effort.</li>
<li>We will keep working on stabilizing the set of libraries behind Noj and improving the integration tests.</li>
</ul>
<h4 id="open-source-mentoring">Open-source mentoring</h4>
<p>We are expecting more participants to join.</p>
<ul>
<li>I will keep working on supporting participants in new beginnings and ongoing projects.</li>
</ul>
<h4 id="tableplothttpssciclojgithubiotableplot"><a href="https://scicloj.github.io/tableplot/">Tableplot</a></h4>
<p>Tableplot is a layered grammar of graphics library.</p>
<ul>
<li>The goal for the coming few weeks is to bring it to beta stage and mostly improve the documentation.</li>
</ul>
<h4 id="tooling">Tooling</h4>
<ul>
<li>We will keep working on maturing kindly-render and refactoring Clay to use it internally.</li>
<li>Clay will be in active development for code quality, bugixes, and user requests.</li>
</ul>
<h4 id="clojure-conj">Clojure Conj</h4>
<p>The coming <a href="https://2024.clojure-conj.org/">Clojure Conj</a> conference will feature a few Scicloj-related talks. At Scicloj, we have a habit of helping each other in talk preparations. We will do that as much as the speakers will find it helpful. We will also organize a couple more pre-conference meetings with speakers, as we did in August.  <br></p>
<hr>
<h2 id="standard-clojure-style-chris-oakman">Standard Clojure Style: Chris Oakman</h2>
<p>Q3 2024 Report No. 1, Published Oct. 14, 2024</p>
<blockquote>
<p>Standard Clojure Style is a project to create a &ldquo;follows simple rules, no config, runs everywhere&rdquo; formatter for Clojure code.</p>
</blockquote>
<h3 id="tldr">tl;dr</h3>
<ul>
<li>project is usable for most codebases in its current state</li>
<li>many bugs fixed</li>
<li>I will be presenting Standard Clojure Style at Clojure/conj 2024</li>
<li>website is next</li>
</ul>
<h3 id="update">Update</h3>
<ul>
<li>
<p>As of <a href="https://www.npmjs.com/package/@chrisoakman/standard-clojure-style">v0.7.0</a>, Standard Clojure Style is ready for most codebases</p>
<ul>
<li>Give it a try!</li>
<li>Standard Clojure Style is <strong>fast</strong>: Shaun Lebron shared some benchmarking on <a href="https://github.com/oakmac/standard-clojure-style-js/issues/77">Issue #77</a></li>
</ul>
</li>
<li>
<p>Several adventurous Clojure developers have ran Standard Clojure Style against their codebases and found bugs.</p>
<ul>
<li>I have fixed most of the reported ones.</li>
<li>Seems like most new bugs are &ldquo;small edge cases&rdquo; as opposed to &ldquo;large, fundamentally broken&rdquo;</li>
<li>A big thank you to these developers and their helpful bug reports!</li>
<li>If you want to help test, please see the instructions <a href="https://github.com/oakmac/standard-clojure-style-js">in the README</a></li>
</ul>
</li>
<li>
<p>I will be presenting Standard Clojure Style next week at Clojure/conj 2024 :tada:</p>
<ul>
<li>Come say hello if you will be attending</li>
<li>I will also socialize the project at the conference</li>
</ul>
</li>
</ul>
<h3 id="next-up">Next Up</h3>
<ul>
<li>I will continue work to stabilize the library and algorithm</li>
<li>I will work on a website to explain the project
<ul>
<li>There should be a &ldquo;try it online&rdquo; demo</li>
<li>Explanation of the formatting rules (what are the rules? and why?)</li>
<li>Something that teams can reference when they are deciding to adopt a formatter tool for their Clojure project</li>
</ul>
</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>2024 Annual Members&#39; Meeting</title>
      <link>https://www.clojuriststogether.org/news/2024-annual-members-meeting/</link>
      <pubDate>Sat, 26 Oct 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2024-annual-members-meeting/</guid>
      <description>Reminder 2024 Annual Members&#39; Meeting Oct. 29th</description>
      <content:encoded><![CDATA[<h2 id="please-join-us-for-our-4th-annual-members-meeting">Please Join Us for our 4th Annual Members' Meeting</h2>
<p>Our annual meeting is fast-approaching. Just a reminder to join us for our 2024 update and discussion. If you are planning on dialing in, please contact me at <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a> and I will send you our Zoom link.</p>
<p>Meeting Details: <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=2024++Clojurists+Together+Annual+Member+Meeting&amp;iso=20241029T12&amp;p1=64&amp;ah=1">Oct. 29, 2024 - 10 am Pacific time</a></p>
<p><strong>Some select times to help you plan:</strong>
Auckland Wed., Oct 30, 6 am<br>
Chicago Tues., Oct 29. 12 pm (noon)<br>
New York, Tues., Oct 29, 1 pm<br>
São Paulo, Brazil, Tues., Oct 29, 2 pm<br>
London, Tues. Oct 29, 5 pm<br>
Amsterdam, Barcelona, Belgrade, Berlin, Paris Tues., Oct. 29, 6 pm</p>
<p>Looking forward to seeing you soon!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>July &amp; August 2024 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/july-august-2024-project-updates/</link>
      <pubDate>Sat, 14 Sep 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-august-2024-project-updates/</guid>
      <description>The latest from Bozhidar Batsov, Michiel Borkent, Janet Carr, Thomas Clark, Toby Crawley, Thomas Heller, Kira McLean, Nikita Prokopov, Tommi Reiman, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>This month we have reports from both our 2024 long-term developers as well as from two shorter-term projects. Thanks everyone for the great work!</p>
<h2 id="short-term-projects">Short-Term Projects</h2>
<p><a href="#janet-a-carr-enjure">Janet A. Carr: Enjure</a><br>
<a href="#thomas-clark-wolframite">Thomas Clark: Wolframite</a></p>
<h2 id="2024-long-term-projects">2024 Long Term Projects</h2>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER. Orchard    <br>
<a href="#michiel-borkent">Michiel Borkent:</a> squint, babashka, neil, cherry, clj-kondo, and more<br>
<a href="#toby-crawley">Toby Crawley:</a> clojars-web <br>
<a href="#thomas-heller">Thomas Heller:</a> shadow-cljs<br>
<a href="#kira-mclean">Kira McLean:</a> Scicloj Libraries. tcutils, Clojure Data Cookbook, Mentoring<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Humble UI, Clojure Sublimed<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Reitit 7.0. Malli<br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Tempel, Tufte, Telemere</p>
<h2 id="short-term-projects-1">Short-Term Projects</h2>
<h2 id="janet-a-carr-enjure">Janet A. Carr: Enjure</h2>
<p>Progress has been a bit slow in this latter half of the project. I haven&rsquo;t elaborated too much of the implementation of Enjure, rather I&rsquo;ve written some documentation in the github repository as well as deployed a website for the project over at <a href="https://enjure.org">enjure.org</a>. The website covers the basic philosophy and architecture as well as how to get started with Enjure by using the CLI. I&rsquo;m hoping to give both Enjure and it&rsquo;s website some more love in the future when I have time. However, for the couple month span of the project thus far, I think it&rsquo;s been relatively successful in flushing out some of the ideas I have for the project. A true OSS MVP, if you will.  <br></p>
<hr>
<h2 id="thomas-clark-wolframite">Thomas Clark: Wolframite</h2>
<h3 id="table-of-contents">Table of Contents</h3>
<ol>
<li><a href="#orgaa044d6">Overview (TL;DR)</a></li>
<li><a href="#org857f3f5">Initialization</a></li>
<li><a href="#orgfc8c659">Evaluation model</a></li>
<li><a href="#org9025375">Documentation, packaging and literate programming</a></li>
<li><a href="#org096ce99">Future outlook</a></li>
</ol>
<p><a id="orgaa044d6"></a></p>
<h3 id="overview-tldr">Overview (TL;DR)</h3>
<p>In a nutshell, our proposal was about reawakening and increasing the ease of Wolfram interop with Clojure. In this second part of the project we continued to fix some minor bugs across the board (<em>quelle surprise</em>), as well as some bigger ones that had crept in with respect to jlink setup and initialization. The main focus however, was on user experience, particularly in regards to customizability: we don&rsquo;t just want access to Wolfram, but to a user-configurable Wolfram! In this regard, we fundamentally changed the initialization system, such that the user can now pass options to the library at runtime: particularly in regard to user-defined function and symbol aliasing. In a similar vein of explicitness, we remodelled the evaluation system such that expressions are only computed on command. This, as described below, should not only make computations more efficient to run, but also expressions more efficient to write. Last, but certainly not least, we put effort into the otherwise Sisyphean task of documentation. Aside from the usual docs, we put significant effort into revamping demo namespaces and creating short and long-form tutorials: integrating everything into a literately-programmed quarto-based website. On top of this, we created (with new build script) our first clojars package. In fact, it&rsquo;s time to introduce Wolframite 1.0!</p>
<p><a id="org857f3f5"></a></p>
<h3 id="initialization">Initialization</h3>
<p>The initialization system has been rebuilt to avoid implicit background loading on namespace imports. Making this wholly explicit adds an extra line to a user&rsquo;s program, but clarifies that the operation is side-affecting, while givng the user control over how and when the Wolfram kernels are started and stopped. Most importantly, introducing a start function (with an options map) gives the user access to the internals of the bridge, such that user preferences can be delivered at runtime, on a document by document basis.</p>
<p>We hope that this will be increasingly useful in the future, but already allows the user to define their own aliases to Wolfram functions: greatly shortening and improving the readability of long expressions. Below, we can see what this looks like in practice. More than just giving the user the chance to rename symbols to their liking, the alias system (thanks to unicode support in clojure) allows the user to use real mathematical symbols in their analysis, rather than reverting to awkward function naming. Remember, Wolfram only allows lower- and upper-case latin and numbers!</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">    (<span style="color:#66d9ef">def </span>aliases
      <span style="color:#f92672">&#39;</span>{** Power
        ++ Conjugate
        ++&lt;-&gt; ComplexExpand
        &gt;&lt; Simplify
        &gt;&gt;&lt;&lt; FullSimplify
        <span style="color:#960050;background-color:#1e0010">⮾</span> NonCommutativeMultiply
        <span style="color:#960050;background-color:#1e0010">√</span> Sqrt
        <span style="color:#960050;background-color:#1e0010">∫</span> Integrate})
    
    (<span style="color:#a6e22e">wl/start</span> {<span style="color:#e6db74">:aliases</span> aliases})
    
    (<span style="color:#a6e22e">w/&gt;&gt;&lt;&lt;</span> (<span style="color:#a6e22e">w/</span><span style="color:#960050;background-color:#1e0010">∫</span> (<span style="color:#a6e22e">w/++&lt;-&gt;</span> (<span style="color:#a6e22e">w/+</span> (<span style="color:#a6e22e">w/**</span> <span style="color:#e6db74">&#39;x</span> <span style="color:#ae81ff">4</span>)
                               (<span style="color:#a6e22e">w/</span><span style="color:#960050;background-color:#1e0010">√</span> (<span style="color:#a6e22e">w/++</span> <span style="color:#e6db74">&#39;x</span>))
                               (<span style="color:#a6e22e">w/*</span> <span style="color:#ae81ff">3</span> <span style="color:#e6db74">&#39;x</span>)))))
</code></pre></div><p><a id="orgfc8c659"></a></p>
<h3 id="evaluation-model">Evaluation model</h3>
<p>A big part of this work has been rebuilding the evaluation model. It was not an easy decision, but was motivated by several factors. First of all, Wolfram expressions can be long and yet, previously, all loaded symbols became executable functions. This meant that every nested s-expression led to a separate call to the underlying kernel, which did not seem efficient. Similarly to the case of initialization, part of the solution was to drop auto-evaluation entirely and to require an explicit <code>eval</code> call. This adds a small step for the user, but gives back control. It also allows you to pass runtime options and preferences to the evaluation, such as last-minute aliasing.</p>
<p>Another problem was the ergonomics of mixing Clojure and Wolfram expressions. Previously, familiar numerical clojure operators were reused as Wolfram operators and so the first line below would run fine when evaluated with Wolfram. Unfortunately however, it was very easy to write the second line, which would fail. Also, when relying on the quoting of symbols, you quickly run into trouble with standard macros (third line). In general therefore, we want to separate Clojure and Wolfram functions and have as little raw symbol manipulation as possible (even though it&rsquo;s still useful to fall back on).</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">    <span style="color:#f92672">&#39;</span>(+ <span style="color:#ae81ff">2</span> (<span style="color:#a6e22e">Plus</span> <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">4</span>))
    
    (+ <span style="color:#ae81ff">2</span> <span style="color:#f92672">&#39;</span>(<span style="color:#a6e22e">Plus</span> <span style="color:#ae81ff">3</span> <span style="color:#ae81ff">4</span>))
    
    (-&gt; <span style="color:#e6db74">&#39;x</span>
        <span style="color:#f92672">&#39;</span>(<span style="color:#a6e22e">Integrate</span> x)
        wl/eval) <span style="color:#75715e">;; fails with error!</span>
</code></pre></div><p>A previous solution to these problems was to load Wolfram functions at runtime under a clojure symbol; this helped alleviate the situation, but,  as it wasn&rsquo;t a <em>real</em> namespace, then the functions could not be required and therefore not consistently used in a library: what if someone picked a different symbol next time? Instead, Wolframite comes with a pre-generated Wolfram symbol namespace that can then be updated and extended by the user using the provided function, as demonstrated below.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">    (comment (<span style="color:#a6e22e">write/write-ns!</span> <span style="color:#e6db74">&#34;src/wolframite/wolfram.clj&#34;</span>
                              {<span style="color:#e6db74">:aliases</span> <span style="color:#f92672">&#39;</span>{** Power
                                          badger Subtract}}))
    (<span style="color:#66d9ef">ns </span>physics.cavity.simple-PRs
      (<span style="color:#e6db74">:require</span> [wolframite.core <span style="color:#e6db74">:as</span> wl]
                [wolframite.impl.wolfram-syms.write-ns <span style="color:#e6db74">:as</span> write]
                [wolframite.wolfram <span style="color:#e6db74">:as</span> w]))
</code></pre></div><p>This system is slightly brittle at the moment, but so far provides a best of both worlds approach. Wolfram symbols are now loaded (not as executable functions) as a real namespace and this leads to more composable expressions:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">    (-&gt; <span style="color:#e6db74">&#39;x</span>
        (<span style="color:#a6e22e">w/Integrate</span> <span style="color:#e6db74">&#39;x</span>)
        wl/eval) <span style="color:#75715e">;; (* 1/2 (Power x 2))</span>
</code></pre></div><p>In general, it also removes the need to overload Clojure operators with Wolfram ones (different namespaces), allows you to treat aliases exactly the same as Wolfram functions and maintains editor autocompletion.</p>
<p><a id="org9025375"></a></p>
<h3 id="documentation-packaging-and-literate-programming">Documentation, packaging and literate programming</h3>
<p>With usability in mind, another big part of this project was documentation and code hygiene. We&rsquo;re still far from Knuth&rsquo;s idea that:</p>
<blockquote>
<p>Programs are meant to be read by humans and only incidentally for computers to execute.</p>
</blockquote>
<p>, but we&rsquo;re happy to have taken a significant steps in this direction. We moved the dial on API docstrings and the README; laid out a couple of substantial real-world physics examples and incorporated these into a website, along with updated versions of the introductory demos (where every page is a literate namespace). We also, with thanks to Daniel Slutsky, made Knuth happier by introducing a reliable method of displaying Wolfram expressions using TeX: particularly in the context of literate namespaces. Unfortunately, we have not yet got much feedback from the wider community (because we were late in launching and publicizing), but we have made a tentative start on integrating the library and maintainers with the data science community on <a href="https://clojurians.zulipchat.com/#narrow/stream/151924-data-science">zulip</a>. We realize however, that there is still much to do in this space. And so it is worth mentioning that we are strongly commited to the development of this library in the medium term, with ongoing tech. support (of the <em>IT</em>, rather than <em>Knuth</em> variety).</p>
<p><a id="org096ce99"></a></p>
<h3 id="future-outlook">Future outlook</h3>
<p>Some things took less time than expected (making a convenient package system); other things took more (the unexpected new evaluation model). Such is the case, and since we&rsquo;re currently waiting to hear back from the Wolfram staff, there are a couple of outlying goals that need more work. One of these is more explicit work on the underlying kernel parallelism. In principle, this hasn&rsquo;t been affected by our work but we are currently still missing the promised documentation. The other goal that was approached more implicitly was the laying of foundations for integration with <a href="https://github.com/mentat-collective/emmy">emmy</a>. The actual integration with emmy will take a lot of work, but the fundamentals are now here, with the advanced aliasing system now allowing for functional transforms, rather than simply 1-1 symbol replacements. The best parts of this project therefore, we hope, are still to come.  <br></p>
<hr>
<h2 id="2024-long-term-projects-1">2024 Long-Term Projects</h2>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>While the summer was a bit slower than the previous periods, we still made some solid progress on multiple fronts. The highlight of recent work is undoubtedly nREPL 1.3, which is one of the most ambitious nREPL releases in recent years. Most of the improvements are invisible to the users, but they improve the stability and predictability of nREPL. Here are the highlights:</p>
<ul>
<li>Stacktraces got drastically shorter. Where the previous versions of nREPL would add 26 frames to the stack, now they are a lot shorter. (like 20 frames shorter)</li>
<li><code>clojure.main/repl</code> has been replaced with a custom REPL implementation that is closer to how nREPL operates. This gave us more control over classloaders (which caused multiple issues in the past) and shortened the stack.</li>
<li>Support for sideloading has been removed. This experimental feature was not fully fleshed out and hasn&rsquo;t seen much use by nREPL clients. It might be revived in the future in a different form.</li>
<li>nREPL now uses custom threadpools instead of calling future for its internal asynchronous actions.</li>
</ul>
<p>CIDER&rsquo;s snapshot already makes use of it and we&rsquo;ve gotten reports that the big internal changes haven&rsquo;t caused any issues. Good stuff!</p>
<p>Some other highlights from the past couple of months:</p>
<ul>
<li>CIDER (and <code>cider-nrepl</code>) now support the new way of calling Java methods introduced in Clojure 1.11 (see <a href="https://github.com/clojure-emacs/cider-nrepl/pull/889">https://github.com/clojure-emacs/cider-nrepl/pull/889</a>)</li>
<li>Orchard now features its own implementation of tracing that replaces the use of <code>tools.trace</code> (see <a href="https://github.com/clojure-emacs/orchard/pull/284">https://github.com/clojure-emacs/orchard/pull/284</a>)</li>
<li>The CI setup for Orchard and cider-nrepl was reworked and now it takes a lot less time to run the tests there</li>
<li>Support for sideloading was removed from CIDER (following its removal from nREPL)</li>
<li>Several bug-fixes here and there</li>
</ul>
<p>You can play with all of this in the current snapshot version of CIDER. I expect we&rsquo;ll cut a new CIDER release in the next couple of weeks. Cheers!  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p><strong>Updates</strong>
In this post I&rsquo;ll give updates about open source I worked on during July and August 2024. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without <em>you</em>, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all.</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br/">Nubank</a></li>
</ul>
<h3 id="sponsor-info">Sponsor info</h3>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which aren&rsquo;t listed above, please get in touch. On to the projects that I&rsquo;ve been working on!</p>
<h3 id="updates">Updates</h3>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in July and August.</p>
<ul>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.</p>
<ul>
<li>Unreleased:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2386">#2386</a>: fix regression introduced in <a href="https://github.com/clj-kondo/clj-kondo/issues/2364">#2364</a> in <code>letfn</code> (unreleased)</li>
<li>v2024.08.29:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2303">#2303</a>: Support array class notation of Clojure 1.12 (<code>byte/1</code>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/916">#916</a>: New linter: <code>:destructured-or-binding-of-same-map</code> which warns about <code>:or</code> defaults referring to bindings of same map, which is undefined and may result in broken behavior</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2362">#2362</a>: turn min-version warning into lint warning</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1603">#1603</a>: Support Java classes in <code>:analyze-call</code> hook</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2369">#2369</a>: false positive unused value in quoted list</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2374">#2374</a>: Detect misplaced return Schemas   (<a href="https://github.com/frenchy64">@frenchy64</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2364">#2364</a>: performance: code that analyzed fn arity is ran twice</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2355">#2355</a>: support <code>:as-alias</code> with current namespace without warning about self-requiring namespace</li>
<li>v2024.08.01:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2359">#2359</a>: <code>@x</code> should warn with type error about <code>x</code> not being an IDeref, e.g. with <code>@inc</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2345">#2345</a>: Fix SARIF output and some enhancements (<a href="https://github.com/nxvipin">@nxvipin</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2335">#2335</a>: read causes side effect, thus not an unused value</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2336">#2336</a>: <code>do</code> and <code>doto</code> type checking (<a href="https://github.com/yuhan0">@yuhan0</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2322">#2322</a>: report locations for more reader errors (<a href="https://github.com/yuhan0">@yuhan0</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2342">#2342</a>: report unused maps, vectors, sets, regexes, functions as <code>:unused-value</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2352">#2352</a>: type mismatch error for <code>or</code> without arguments</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2344">#2344</a>: copying configs and linting dependencies can now be done in one go with <code>--dependencies --copy-configs</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2357">#2357</a>: <code>:discouraged-namespace</code> can have <code>:level</code> per namespace</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Mostly bumped library dependencies and improvements in SCI</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</p>
<ul>
<li>Support new Clojure 1.12 array notation</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</p>
<ul>
<li>Fix <a href="https://github.com/babashka/sci/issues/923">#923</a>: check for duplicate keys in dynamic set or map literals</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/926">#926</a>: Support <code>add-watch</code> on vars in CLJS</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li><a href="https://github.com/squint-cljs/cherry/issues/135">#135</a>: Fix UMD build</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>Bump org.babashka/cli</li>
<li>Bump SCI</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</p>
<ul>
<li>Fix <a href="https://github.com/borkdude/quickdoc/issues/39">#39</a>: fix link when var is named multiple times in docstring</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-server">http-server</a>: serve static assets</p>
<ul>
<li><a href="https://github.com/babashka/http-server/issues/13">#13</a>: add an ending slash to the dir link, and don&rsquo;t encode the slashes (<a href="https://github.com/KDr2">@KDr2</a>)</li>
<li><a href="https://github.com/babashka/http-server/issues/16">#16</a>: support range requests</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs! \</p>
<ul>
<li>Fix <a href="https://github.com/babashka/cli/issues/102">#102</a>: <code>format-table</code> correctly pads cells containing ANSI escape codes</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Upgrade/sync with clojure CLI v1.11.4.1474</li>
<li>deps.clj is now available as <code>clojure.exe</code> via the <a href="https://github.com/casselc/clj-msi">clj-msi</a> installer and the official installation method on plain Windows!</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li><a href="https://github.com/babashka/fs/issues/132">#132</a>: add <code>read-link</code> to resolve symbolic link, without target of link needing to exist</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/tools">tools</a>: a set of <a href="https://github.com/babashka/bbin/">bbin</a> installable scripts</p>
<ul>
<li>Updated antq</li>
<li>Added <code>--minimize</code> option to the ddiff script</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client \</p>
<ul>
<li>Ensure that http-client works with Clojure 1.10 as the minimum supported Clojure version</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.nrepl">sci.nrepl</a>: nREPL server for SCI projects that run in the browser</p>
<ul>
<li>Mostly changes to accomodate running sci.nrepl with <a href="https://github.com/nextjournal/clerk">clerk</a> viewer functions</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a>: Moldable Live Programming for Clojure</p>
<ul>
<li>Mostly worked on making viewer functions available from <code>.cljs</code> files and allow working on them via a nREPL session</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li>Nikita Prokopov made the <a href="https://github.com/squint-cljs/squint/blob/main/logo/logo.svg">squint logo</a>!</li>
<li><a href="https://github.com/squint-cljs/squint/issues/542">#542</a>: fix <code>run</code> on Windows</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>There are many other projects I’m involved with but that had little to no activity in the past month. Check out the <strong>Other Projects</strong> section (more details) of <a href="https://blog.michielborkent.nl/oss-updates-jul-aug-2024.html">my blog here</a> to see a full list.<br>
Published: 2024-08-30 <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<h3 id="august-2024">August 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/0d6640ae647f8b075e74c1b3d20128dccbadebc5...fc00a38a5814dcea44522f91750e981df8893f7e"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/c4cfac16c9bbdd1cb6907a4a0daf3c775cd1ce14...6cf9c100e38408016cd979f1611602523766200e"><code>infrastructure</code></a></p>
<ul>
<li>Bug fix: <a href="https://github.com/clojars/clojars-web/commit/978eeab87928772c158fa454aeb9c8c1e630b8d2">Ensure jetty patch to send status message is always applied</a></li>
<li>Bug fix: <a href="https://github.com/clojars/clojars-web/commit/2df51fb53ed39fdd75e1637828b786015edce314">Properly rotate log files</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/ac9e6733a261ebb18d305379ef95f34d42fe3ef5">Upgrade to Clojure 1.12.0-rc1</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/78a7408d3b1f614c477b047a17c5938aa60687b8">Upgrade to clojure 1.12.0-rc2</a></li>
</ul>
<h3 id="july-2024">July 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/662e10febf1267b1e67c321b1aa337550f3d7a29...0d6640ae647f8b075e74c1b3d20128dccbadebc5"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/59cec6c2924811f07d5e231923e642f6306fee05...c4cfac16c9bbdd1cb6907a4a0daf3c775cd1ce14"><code>infrastructure</code></a></p>
<ul>
<li>Bug fix: <a href="https://github.com/clojars/clojars-web/commit/b7d7d99bacfb863ddc9139d895640b8bf9a7b3fa">Properly delete artifacts from S3</a></li>
<li>clj-kondo ugrade and linting cleanup</li>
<li><a href="https://github.com/clojars/clojars-web/commit/0d6640ae647f8b075e74c1b3d20128dccbadebc5">Upgrade to Clojure 1.12.0-beta2</a></li>
<li><a href="https://github.com/clojars/infrastructure/commit/ea1bfd2dbd3dd47fb48e849439a6072cfcb3032a">Use latest AL2023 AMI as base when building our AMI</a>  <br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.28.14 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<h3 id="notable-updates">Notable Updates</h3>
<ul>
<li>Updated nREPL Server to 1.3.0  <br></li>
</ul>
<hr>
<h2 id="kira-mclean">Kira McLean</h2>
<p>This is a summary of the open source work I&rsquo;ve spent my time on throughout July and August, 2024. There was a blog post, some library updates, and lots of community work.</p>
<h3 id="sponsors-1">Sponsors</h3>
<p>This work is made possible by the generous ongoing support of my sponsors. I appreciate all of the support the community has given to my work and would like to give a special thanks to Clojurists Together and Nubank for providing me with lucrative enough grants that I can reduce my client work significantly and afford to spend more time on these projects.</p>
<p>If you find my work valuable, please share it with others and consider supporting it financially. There are details about how to do that on my <a href="https://github.com/sponsors/kiramclean">GitHub sponsors page</a>. On to the updates!</p>
<h3 id="blog-post">Blog post</h3>
<p>At the beginning of the summer Daniel Slutsky and I were feeling very ambitious and thought we might be able to put together a course for data scientists coming to Clojure from other languages. For many reasons, this hasn&rsquo;t materialized yet, but in service of these plans I wrote a <a href="https://codewithkira.com/2024-07-18-tablecloth-dplyr-pandas-polars.html">blog post comparing tablecloth</a> to other common data processing tools, like <code>dplyr</code>, <code>pandas</code>, and <code>polars</code>. My goal was to put tablecloth in perspective, illustrating some of the key differences between it and other standard, more popular, data processing tools.</p>
<h3 id="tcutils"><code>tcutils</code></h3>
<p>I added a few more helpers to <code>tcutils</code>, like <code>between</code> and <code>duplicate-rows</code>, and also made a <a href="https://scicloj.github.io/tcutils/">docs website</a> for the project. I also had many interesting conversations with people in the community about how Clojure&rsquo;s data processing tools &ldquo;feel&rdquo; to work with, and how we might adopt APIs and conventions that are familiar to data scientists in the interest of making their transition to Clojure&rsquo;s ecosystem as smooth as possible.</p>
<h3 id="clojure-data-cookbook">Clojure Data Cookbook</h3>
<p>This month I added a chapter about working with data from databases, starting with SQL, and also continued to work on the end-to-end example for the introductory section. Working with real data is very difficult and interesting, and it&rsquo;s a fun challenge to try to figure out the right balance between getting into the weeds and compromising on the final result. So much of data science is just cleaning up messy data from the world, but surprisingly often you have to make some assumptions about how you&rsquo;re going to use the data in order to make decisions about how to do the cleaning. And there are tons of different ways to &ldquo;clean&rdquo; data, but the strategies you use depend on what information you&rsquo;re after.</p>
<p>In the particular example of the housing dataset I&rsquo;m working with there are many missing values to handle, and some questionable rows that look like duplicates but aren&rsquo;t <em>exactly</em> duplicates. There are also lots of illogical data points, like house sales from the future or multiple sales for the same property on a given date. Deciding how to handle these cases to build up a &ldquo;clean&rdquo; dataset to actually work with is a very interesting exercise in domain modelling and goal setting.</p>
<h3 id="scicloj-mentoring-program">Scicloj mentoring program</h3>
<p>This one is really mostly Daniel Slutsky&rsquo;s amazing work, but we collaborated on launching it and it&rsquo;s definitely worth mentioning. We put together a <a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">structured way for people to get involved</a> in contributing to Clojure&rsquo;s open source data science ecosystem, and got an overwhelmingly positive response. Over 25 people reached out to express an interest in contributing their time to Scicloj projects. The structured parts of the program include having some help choosing a meaningful and impactful project to work on, and up to an hour per week of one-on-one time with a mentor to help things progress. Daniel is doing all the heavy lifting coordinating the mentors, but it&rsquo;s been great so far participating as one and meeting some very keen and smart people who are willing to help us move things forward.</p>
<p>Another big part of this is thinking of the projects to work on. We came up with a list of projects that would deliver high value to the community but remain small enough to tackle by a single developer. We also tried to come up with ones that would require a wide range of skills and interests to try to accommodate as many people as possible. I am super excited to see how things go over the next few months with all of these projects.</p>
<h3 id="other-community-connections">Other community connections</h3>
<p>I&rsquo;m still doing my weekly data-science drop-in streaming with Clojure Camp. I really enjoy connecting with other people who are interested in Clojure for data science, and I often get great suggestions and tips, too.</p>
<p>I also met with a couple of groups of people who are presenting at the Conj this year to help brainstorm some ideas for how to make the most of the talks. Daniel has amazing vision for the community and organized these calls that I was lucky enough to join. The goal is to connect all of the people who are giving data-related talks to optimize the overall messaging, like minimizing duplication across talks or drawing examples from each other&rsquo;s presentations. I love conference speaking and hope to do more of it in future years when my personal commitments allow for it, but in the meantime it&rsquo;s really amazing getting to connect with such cool people in the community to learn about their talks and brainstorm ideas for making them the best they can be. I&rsquo;m hoping to attend the conference this year to see some of these great talks in person.</p>
<h3 id="personal-updates">Personal Updates</h3>
<p>This has been a really amazing year professionally, having had the opportunity to spend much more time than in the past on open source and public work for the Clojure community. I&rsquo;ve been trying to make the most of it and it&rsquo;s been really rewarding. Over the next couple of months, there are some other parts of my life that will be taking precedence, however.</p>
<p>The main one is my relationship. I&rsquo;m getting married in a couple of weeks and will be taking almost a month off between getting ready for the wedding, wrapping up all the loose ends afterward, and a nearly 3-week-long honeymoon. I&rsquo;ve never taken this long off of work in my life, so I&rsquo;m both excited and curious to see what it&rsquo;s like. For over a decade now my career has been taking up most of my time and energy. It&rsquo;s been well worth it and I&rsquo;m really happy with my work now, but I&rsquo;m also excited to be stepping into a new chapter of life where things can be more balanced.</p>
<p>Related to this, the other major update I have to share is that I&rsquo;ve accepted a full time job with a company called BroadPeak which I will be starting as soon as I&rsquo;m back from my honeymoon. It&rsquo;s a small fintech company built primarily with Clojure that handles trade data management, commodities transaction surveillance, regulatory compliance, and other things related to the behind-the-scenes of commodities trading. I think it&rsquo;s a perfect fit for my skills and interests, and I&rsquo;m hoping to have a chance to build some bridges between a really exciting, growing company that uses Clojure for real-world financial data processing and the Clojure open source community. Initial conversations about how the engineering team there feels about open source and community involvement have been really promising, so I&rsquo;m optimistic that it will work out well for everyone. I&rsquo;m not sure yet what exactly my open source work will look like once this job starts, but at a minimum I will still be working on the various side projects, like I always was before I tried giving it a go full time.</p>
<p>No matter how things go, I&rsquo;ll be back in two more months with another update. Thanks for reading. As always, feel free to reach out, and hopefully see some of you at the Conj! :)  <br></p>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hello dear sponsors, thank you all for your continous support. Last two months have been really heavy on Humble UI and Clojure Sublimed.</p>
<h3 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a></h3>
<p><strong>Clojure support for Sublime Text 4:</strong></p>
<ul>
<li>New syntax that can highlight reader comments <code>comment.reader</code> together with the following form,</li>
<li>Highlight <code>(comment ...)</code> blocks as <code>comment.form</code>,</li>
<li>Highlight namespaces in symbols as <code>meta.namespace.symbol</code>,</li>
<li>Highlight unused symbols as <code>source.symbol.unused</code>,</li>
<li>Properly highlight <code>entity.name</code> in <code>def*</code> forms only at second position, skipping all meta/comments,</li>
<li>Quote &amp; syntax quote highlight following form as <code>meta.quoted</code> and <code>meta.quoted.syntax</code>,</li>
<li>Metadata highlights following form as <code>meta.metadata</code>,</li>
<li>Octal &amp; arbitrary radix integers <a href="https://github.com/tonsky/Clojure-Sublimed/issues/71">71</a>,</li>
<li>Better keyword detection,</li>
<li>Built-in color scheme to utilize REPL and new syntax features,</li>
<li><code>clojure_sublimed_reindent</code> command that reindents entire buffer if selection is empty and only selected lines if not,</li>
<li>Option to use <code>cljfmt</code> for code formatting,</li>
<li>Removed separate EDN syntax, merged with main Clojure (Sublimed),</li>
<li>Settings can now be specified in main <code>Preferences.sublime-settings</code> as well. Just prepend <code>clojure_sublimed_</code> to each setting’s name,</li>
<li>REPL can detect namespaces with meta on ns form <a href="https://github.com/tonsky/Clojure-Sublimed/issues/116">116</a>,</li>
<li>Detect <code>.shadow-cljs/nrepl.port</code> and <code>.shadow-cljs/socket-repl.port</code> <a href="https://github.com/tonsky/Clojure-Sublimed/issues/114">114</a>,</li>
<li>Connect commands now accept <code>timeout</code> argument for automation scenarios like “start clojure, start trying to connect to REPL until port is available”,</li>
<li>Eval previous form at current level <a href="https://github.com/tonsky/Clojure-Sublimed/issues/118">118</a>,</li>
<li>Auto-detect UNIX sockets, support relative paths,</li>
<li>Correctly parse escaped comma <a href="https://github.com/tonsky/Clojure-Sublimed/pull/120">120</a> via <a href="https://github.com/oakmac">@oakmac</a></li>
</ul>
<h3 id="humble-uihttpsgithubcomhumbleuihumbleui"><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a></h3>
<p><strong>Clojure Desktop UI framework:</strong></p>
<ul>
<li>Renamings (halign/valing → align, width/height → size, rect → bounds, vscroll → vscrollable, vscrollbar → vscroll, use-size -&gt; with-bounds, rounded-rect → rect, clip-rrect → clip),</li>
<li>Normalized most of the components to have <code>opts</code> as first argument,</li>
<li>Declarative font management,</li>
<li>Viewport &amp; optimized rendering for components outside it,</li>
<li><code>.-parent</code> node field on all <code>ANodes</code>,</li>
<li><code>-reconcile-opts</code> to migrate props,</li>
<li>Built-in profiler,</li>
<li>Full-fledged demos &amp; source examples for some components,</li>
<li>New components: ui/link,</li>
<li>New demos: whiteboard,</li>
<li>Better code organization,</li>
<li>Fixed REPL reloading,</li>
<li>Fixed crash on scale change,</li>
<li>Removed <code>dynamic/with-context-classic</code>,</li>
<li>Simplified <code>memo-fn</code>,</li>
<li>Added <code>:window-scale-change</code> event</li>
</ul>
<h3 id="jwmhttpsgithubcomhumbleuijwm"><a href="https://github.com/HumbleUI/JWM/">JWM</a></h3>
<p><strong>Cross-platform window management and OS integration library for Java:</strong></p>
<ul>
<li>macOS: Stable screen ids</li>
<li>macOS: Do not stop cvdisplaylink</li>
</ul>
<h3 id="datascripthttpsgithubcomtonskydatascript"><a href="https://github.com/tonsky/datascript">DataScript</a></h3>
<p><strong>immutable database and Datalog query engine for Clojure, ClojureScript, and JS:</strong></p>
<ul>
<li>Regression: transacting many ref value as a set of inline maps <a href="https://github.com/tonsky/datascript/issues/476">476</a></li>
<li>Fixed find-datom on empty DB <a href="https://github.com/tonsky/datascript/issues/477">477</a></li>
</ul>
<h3 id="clj-simple-routerhttpsgithubcomtonskyclj-simple-router"><a href="https://github.com/tonsky/clj-simple-router">Clj-Simple-Router</a></h3>
<p><strong>Simple order-independent Ring router:</strong></p>
<ul>
<li>Add a complete example to the README <a href="https://github.com/tonsky/clj-simple-router/issues/2">2</a></li>
<li>Added clj-kondo analyzer for routes macro <a href="https://github.com/tonsky/clj-simple-router/issues/3">3</a> with <a href="https://github.com/goshatch">goshatch</a></li>
</ul>
<h3 id="sublime-executorhttpsgithubcomtonskysublime-executor"><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a></h3>
<p><strong>Executable runner for Sublime Text:</strong></p>
<ul>
<li>1.5.1 Trim command name in status bar <a href="https://github.com/tonsky/Sublime-Executor/issues/7">7</a></li>
</ul>
<h3 id="uberdepshttpsgithubcomtonskyuberdeps"><a href="https://github.com/tonsky/uberdeps">Uberdeps</a></h3>
<p><strong>Uberjar builder for deps.edn:</strong></p>
<ul>
<li>merge :override-deps from :aliases <a href="https://github.com/tonsky/uberdeps/issues/49">49</a> <a href="https://github.com/tonsky/uberdeps/pull/53">53</a> via <a href="https://github.com/dkick">@dkick</a></li>
</ul>
<h3 id="blogging">Blogging:</h3>
<ul>
<li><a href="https://tonsky.me/blog/clojure-macros/">Clojure macros continue to surprise me</a></li>
<li><a href="https://tonsky.me/blog/diagrams/">Where Should Visual Programming Go?</a></li>
</ul>
<h3 id="designing">Designing:</h3>
<ul>
<li>A logo for <a href="https://github.com/squint-cljs/squint">squint</a>, a light-weight dialect of ClojureScript.  <br></li>
</ul>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Two big release of <a href="https://github.com/metosin/malli">malli</a> and lot&rsquo;s of WIP work. Explored existing and new Clojure-bindings (with Malli) with latest features of both Anthropic and OpenAIs APIs, one gist <a href="https://gist.github.com/ikitommi/e643713719c3620f943ef34086451c69">here</a>.</p>
<p>Added <a href="https://github.com/frenchy64">Ambrose Bonnaire-Sergeant</a> as a maintainer to malli. Lot&rsquo;s of good disucssions on how the library should go forward. Here&rsquo;s the <a href="https://www.clojuriststogether.org/news/q3-2024-funding-announcement/#malli-constraints-and-humanization-ambrose-bonnaire-sergeant">Q3 Clojureist Together funding announcement</a> for his work.</p>
<h3 id="library-releases">Library Releases</h3>
<h3 id="malli-0164">malli 0.16.4</h3>
<ul>
<li>Distribute <code>:merge</code> over <code>:multi</code> <a href="https://github.com/metosin/malli/pull/1086">#1086</a>, see <a href="README.md#distributive-schemas">documentation</a></li>
<li><code>:multi</code> with keyword <code>:dispatch</code> accumulates data to generated values <a href="https://github.com/metosin/malli/pull/1095">#1095</a></li>
<li>Allow <code>m/-proxy-schema</code> child to be a <code>delay</code> <a href="https://github.com/metosin/malli/pull/1090">#1090</a></li>
<li><code>json-transformer</code> decodes 123.0 into 123 for schemas like <code>:int</code>, <code>pos-int?</code> etc. <a href="https://github.com/metosin/malli/issues/986">#986</a></li>
<li>Fix <code>malli.dev.pretty</code> throws when explaining errors in nested maps <a href="https://github.com/metosin/malli/issues/1096">#1094</a></li>
<li>Fix ClojureScript <a href="https://github.com/metosin/malli/issues/1093">arithmetic warning</a></li>
<li>Fix <code>(-some-pred [])</code> should return <code>false</code> <a href="https://github.com/metosin/malli/pull/1101">#1101</a></li>
<li>Doc <code>mu/assoc</code> and <code>mu/dissoc</code> only handle one key at a time <a href="https://github.com/metosin/malli/pull/1099">#1099</a></li>
<li>Try to make <code>map-of-min-max-test</code> less flaky by fixing seed <a href="https://github.com/metosin/malli/pull/1098">#1098</a></li>
<li>Updated dependencies:</li>
</ul>
<pre><code>borkdude/edamame '1.4.25' to '1.4.27'
</code></pre><h3 id="malli-0163">malli 0.16.3</h3>
<ul>
<li><code>:-&gt;</code> added to default registry, see <a href="https://github.com/metosin/malli/blob/master/docs/function-schemas.md#flat-arrow-function-schemas">documentation</a>.</li>
<li>New <code>:seqable</code> and <code>:every</code> schemas <a href="https://github.com/metosin/malli/pull/1041">#1041</a>, see <a href="https://github.com/metosin/malli#seqable-schemas">docs</a></li>
<li>Fix OOM error with infinitely expanding schema <a href="https://github.com/metosin/malli/pull/1069">#1069</a></li>
<li>Correctly form prop-less schemas that have map/nil as first child <a href="https://github.com/metosin/malli/pull/1071">#1071</a></li>
<li>Support min/max on uncountables like eductions <a href="https://github.com/metosin/malli/pull/1075">#1075</a></li>
<li>Fix clj-kondo can&rsquo;t parse config.edn written by <code>(malli.dev/start!)</code> <a href="https://github.com/metosin/malli/issues/1083">#1083</a></li>
<li>unstrument before instrumenting <a href="https://github.com/metosin/malli/pull/1081">#1081</a></li>
<li>Replace <code>.entryAt</code> with <code>.valAt</code> during validation <a href="https://github.com/metosin/malli/pull/1079">#1079</a></li>
<li>Corrected DEPRECATED warning for <code>m/-simple-schema</code> <a href="https://github.com/metosin/malli/pull/1077">#1077</a></li>
</ul>
<h3 id="something-else">Something Else</h3>
<p>Back in the baltics, this time in Lithuania.<br>
<img width="1728" alt="vilna" src="https://gist.githubusercontent.com/ikitommi/8c904bfaa17f3871f80d3e20ea84ebb7/raw/88484414839a3e81984f730993b1bef95c29a5b6/vilna.jpg">  <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<h3 id="open-source-update">Open source update</h3>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏<br>
- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
<h3 id="recent-work">Recent work</h3>
<p>Hi folks! 👋 I hope those of you in summer are enjoying the nice weather ☀️<br>
Have some chonky updates for today!</p>
<h3 id="timbre">Timbre</h3>
<blockquote>
<p><a href="https://www.taoensso.com/timbre">Timbre</a> is a pure Clojure/Script logging library.</p>
</blockquote>
<p>Timbre <strong>v6.6.0-RC1</strong> is <a href="https://github.com/taoensso/timbre/releases/tag/v6.6.0-RC1">out now</a>. There&rsquo;s some internal improvements, but the highlight is added out-the-box support for <strong>Java logging interop</strong> via <a href="https://www.slf4j.org/">SLF4J</a>.</p>
<p>This is handled via a new SLF4J provider/backend dependency <a href="https://clojars.org/com.taoensso/timbre-slf4j">available on Clojars</a> - instructions <a href="https://github.com/taoensso/timbre/wiki/4-Interop#java-logging">here</a>.</p>
<p>The implementation is back-ported from <a href="https://www.taoensso.com/telemere">Telemere</a> and includes support for legacy and modern (&ldquo;fluent&rdquo;) SLF4J logging APIs, MDC (context key/vals), markers, etc.</p>
<p>This was one of the <a href="https://github.com/taoensso/roadmap/issues/11">upvoted</a> items on my <a href="https://www.taoensso.com/roadmap/vote">open source roadmap</a>, and definitely something nice to have officially supported.</p>
<p>Previously many Timbre users used the separate <a href="https://github.com/fzakaria/slf4j-timbre">slf4j-timbre</a> library for such interop - and I&rsquo;d like to say a warm thanks to that library&rsquo;s original author <a href="https://github.com/fzakaria">Farid Zakaria</a> and steward / maintainer <a href="https://github.com/rufoa">rufoa</a>.</p>
<p>Their job was a challenging one - needing to keep up with internal changes to Timbre over time, etc. With the new approach, Timbre’s SLF4J support will now always be automatically kept in sync and tested with Timbre’s latest release, which should help minimize future maintenance headaches.</p>
<h3 id="telemere">Telemere</h3>
<blockquote>
<p><a href="https://www.taoensso.com/telemere">Telemere</a> is a modern rewrite of <a href="https:/www.taoensso.com/timbre">Timbre</a> that offers an improved API to cover traditional logging, structured logging, tracing, basic performance measurement, and more.</p>
</blockquote>
<p>My big focus recently has been Telemere, with 8 new beta releases since June.</p>
<p>The latest as of this post is <a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0-beta22">v1.0.0-beta22</a> (2024-08-28).</p>
<p>The basic API has been stable, including re: <a href="https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-creators">signal creation</a> and <a href="https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-content">signal content</a> - but I&rsquo;ve been continuing to polish things in preparation for RC1 (expected next month).</p>
<h3 id="recent-improvements-include">Recent improvements include:</h3>
<h4 id="significantly-improved-opentelemetry-interop">Significantly improved OpenTelemetry interop</h4>
<p>This was another <a href="https://github.com/taoensso/roadmap/issues/16">upvoted item</a> from my <a href="https://www.taoensso.com/roadmap/vote">open source roadmap</a>, and quite a bit of work to get just right.</p>
<p>Telemere can now send signals as OpenTelemetry <a href="https://opentelemetry.io/docs/specs/otel/logs/data-model/"><code>LogRecords</code></a> with correlated tracing data to configured <a href="https://github.com/open-telemetry/opentelemetry-java">OpenTelemetry Java</a> <a href="https://opentelemetry.io/docs/languages/java/exporters/">exporters</a>.</p>
<p>This allows output to go (via configured exporters) to a wide variety of targets like <a href="https://www.jaegertracing.io/">Jaeger</a>, <a href="https://zipkin.io/">Zipkin</a>, <a href="https://aws.amazon.com/xray/">AWS X-Ray</a>, <a href="https://aws.amazon.com/cloudwatch/">AWS CloudWatch</a>, etc.</p>
<p>See <a href="https://github.com/taoensso/telemere/wiki/3-Config#opentelemetry">here</a> for instructions.</p>
<p>A couple nice properties of the way Telemere handles OpenTelemetry interop:</p>
<ol>
<li>
<p>Aside from configuring OpenTelemetry Java itself, Telemere&rsquo;s OpenTelemetry interop <strong>doesn&rsquo;t require any use of or familiarity with the OpenTelemetry Java API or concepts</strong>. So if you&rsquo;re like me, you&rsquo;ll be pleased to know that you can basically avoid all the usual OpenTelemetry API nonsense. You just use Telemere as you normally would, and it&rsquo;ll act as your interface to OTel.</p>
</li>
<li>
<p>Creating OpenTelemetry tracing spans and attaching attributes can be expensive, which violates a unique <a href="https://github.com/taoensso/telemere?tab=readme-ov-file#next-gen-observability">design goal</a> of Telemere - to make it possible to <strong>dynamically filter costs as you filter signals</strong>. Telemere works around this by creating only <em>minimal</em> spans at first (to enable full interop with auto-instrumentation and other OTel tools), and saving all the expensive work for the post-filter signal handlers. Basically this gives you best of both worlds: full auto interop, but also lazy costs well-suited to Telemere&rsquo;s rich filtering architecture.</p>
</li>
</ol>
<p>For feedback and/or experience reports, please feel free to ping me on the <a href="https://www.taoensso.com/telemere/slack">Slack channel</a> or <a href="https://www.taoensso.com/telemere">GitHub</a>.</p>
<h4 id="significant-doc-improvements">Significant doc improvements</h4>
<p>A major focus for Telemere has been the docs and examples.<br>
My hope is to build something friendly enough for <strong>complete beginners</strong>.</p>
<p>If you haven&rsquo;t looked at them yet (or recently), it might be worth checking out the <a href="https://www.taoensso.com/telemere">README</a>, <a href="https://www.taoensso.com/telemere/wiki">Wiki</a>, or <a href="https://www.taoensso.com/telemere/api">API docs</a>.</p>
<p>Some good starting points:</p>
<ol>
<li><a href="https://github.com/taoensso/telemere/wiki/1-Getting-started#introduction">Introduction</a> (concepts, terminology)</li>
<li><a href="https://github.com/taoensso/telemere/wiki/1-Getting-started#creating-signals">Creating signals</a> (how to log stuff)</li>
<li><a href="https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-content">Signal content</a> (what gets logged)</li>
<li><a href="https://github.com/taoensso/telemere/wiki/3-Config#filtering">Filtering signals</a> (decide what does/not get logged)</li>
<li><a href="https://www.youtube.com/watch?v=-L9irDG8ysM">Video demo</a> (concepts, usage - 24 mins)</li>
</ol>
<h4 id="facade-api-for-library-authors">Facade API for library authors</h4>
<p>Telemere now offers <a href="https://github.com/taoensso/telemere/wiki/9-Authors">guidance</a> for library authors/maintainers that might like to use Telemere in their own library, and offers a new super lightweight <a href="https://clojars.org/com.taoensso/telemere-api">Facade API</a>.</p>
<p>For a library using the facade:</p>
<ul>
<li>If end users <strong>already have</strong> Telemere, then they’ll get Telemere signals out of the library. (And full filtering capabilities, etc.).</li>
<li>If end users <strong>don’t have</strong> Telemere, then the library can instead log using something like <code>tools.logging</code>.</li>
</ul>
<h4 id="general-comments--status">General comments / status</h4>
<p>Telemere may seem a bit of an odd animal at first since it looks like a logging library that&rsquo;s hesitating to call itself a logging library. As it took shape, I struggled with how to describe it.</p>
<p>What I&rsquo;d say today: Telemere&rsquo;s basically meant to be a one-stop API for all the most common observability needs. These include traditional (string-oriented) logging, structured logging (arb nested Clojure data), events, tracing, and basic performance monitoring.</p>
<p>What I realised thinking about this problem space over the years - is that all of the above share fundamental ideas and needs:</p>
<ul>
<li>We want to capture info in our systems at some point</li>
<li>We want to do it conditionally</li>
<li>We want to do something useful with that info</li>
</ul>
<p>I suspected that a single API would do - but I wasn&rsquo;t sure until I tried. When I did try, what I ended up with was actually a <em>single macro</em> (<a href="https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#signal!"><code>signal!</code></a>) that handles all of the above through a handful of <a href="https://cljdoc.org/d/com.taoensso/telemere/CURRENT/api/taoensso.telemere#help:signal-options">options</a>.</p>
<p>I&rsquo;m honestly very happy with the result - I find it elegant, easy to use and to understand, and deeply flexible. And I&rsquo;m proud of the particular combination of ease-of-use and power - since these goals are often in conflict.</p>
<p>I&rsquo;ll note that Telemere&rsquo;s approach is possible <strong>only in a Lisp</strong>. And certain aspects of its implementation (esp. re: interop) are possible <strong>only in Clojure</strong>. So the value proposition here is unique.</p>
<p>At the risk of being overly blunt: observability matters, and in my opinion Telemere offers a code-side observability story that&rsquo;s competitive with anything else I&rsquo;m aware of in any language.</p>
<p>Part of my motivation in pursuing this particular project has been to try to <strong>use Clojure&rsquo;s unique strengths</strong> to offer a unique and compelling <em><strong>advantage</strong></em> to Clojure projects/businesses/teams. Clojure enables Telemere, Telemere helps enable inexpensive and effective observability, observability helps enable more <strong>robust and debuggable systems</strong>. And used wisely, robustness and debugability can help enable <strong>successful projects</strong>.</p>
<p>So the idea (hope) is to be both a <strong>practical tool</strong>, and a reference example of one of the kinds of <strong>real-world advantages</strong> made possible by Clojure.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<blockquote>
<p>As always please do help <a href="https://www.taoensso.com/roadmap/vote">vote</a> on what you&rsquo;d like to see me working on!</p>
</blockquote>
<h3 id="telemere-1">Telemere</h3>
<p>My aim is to release v1 RC1 in September, then v1 final before the end of 2024.</p>
<p>The big stuff is all done, what remains is to give folks the opportunity to kick tyres and report issues or request changes before locking down the API.</p>
<p>Please also <a href="https://github.com/taoensso/roadmap/issues/12">vote</a> on which signal handlers would be most useful.</p>
<p>After that, my hope will be for Telemere to basically be stable - and to redirect future efforts toward education and promotion. Telemere enables a lot of powerful but non-obvious stuff, which I&rsquo;ll need to do more work to explain.</p>
<h3 id="tempel">Tempel</h3>
<blockquote>
<p><a href="https://www.taoensso.com/tempel">Tempel</a> is a new data security framework for Clojure.</p>
</blockquote>
<p>I&rsquo;d like to release v1 final before the end of 2024. Still have some last features to think through and design (<a href="https://github.com/taoensso/roadmap/issues/17">multi-factor authentication</a>, etc.).</p>
<h3 id="tufte">Tufte</h3>
<blockquote>
<p><a href="https://www.taoensso.com/tufte">Tufte</a> offers simple performance monitoring for Clojure/Script.</p>
</blockquote>
<p>Once Telemere v1 RC1 is out, I&rsquo;ll be ready to prepare Tufte v3 - which&rsquo;ll include a move to the exact same signal architecture powering Telemere.</p>
<p>Tufte and Telemere will then share identical terminology, capabilities, and API for filtering, handlers, etc.</p>
<p>The two already <a href="https://github.com/taoensso/telemere/wiki/6-FAQ#does-telemere-replace-tufte">work well together</a>, but interop will be even smoother after v3. The aim is to offer Telemere and Tufte as partner (complementary) libraries to enable unique <a href="https://github.com/taoensso/telemere?tab=readme-ov-file#next-gen-observability">next-gen observability</a> capabilities for Clojure and ClojureScript applications.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2024 Board Nominations and Our Annual Meeting</title>
      <link>https://www.clojuriststogether.org/news/2024-board-nominations-and-our-annual-meeting/</link>
      <pubDate>Mon, 02 Sep 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2024-board-nominations-and-our-annual-meeting/</guid>
      <description>Stand for our 2024 elections and attend the Annual Meeting</description>
      <content:encoded><![CDATA[<p>Clojurists Together is having our fourth board elections, and our fourth annual members meeting.</p>
<h3 id="key-dates">Key dates</h3>
<p>(All dates are EOD, in Pacific Time)</p>
<p><strong>Board nominations close:</strong> Sept. 23, 2024<br>
<strong>Voting opens:</strong> a few days after submissions close and the board has nominated candidates<br>
<strong>Voting closes:</strong> October 14, 2024<br>
<strong>Annual members meeting:</strong> <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=2024++Clojurists+Together+Annual+Member+Meeting&amp;iso=20241029T12&amp;p1=64&amp;ah=1">Oct. 29, 2024 - 10 am Pacific time</a></p>
<h3 id="board-elections">Board Elections</h3>
<p>As part of our commitment to <a href="https://www.clojuriststogether.org/transparency/">transparency</a> and community governance, Clojurists Together holds elections for board members. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors.</p>
<p>Committee members are elected for a two-year term. Each election cycle, half of our board seats come up for re-election. This year there are three seats available.</p>
<p>If you are interested in standing for election, please fill out this <a href="https://forms.gle/U9KYdBsnRtz5iwYP9">form</a> by Sept. 23rd, 2024 -  5 pm Pacific Time. If you can’t access the form, <a href="https://www.clojuriststogether.org/contact">contact us</a>, and we can accept your nomination by email. Nominations are open to anyone, you don’t have to be a Clojurists Together member to stand for election. Our bylaws do require you to be a member if elected to the board, though we provide a stipend that offsets the cost of your membership.</p>
<p>You don’t have to have lots of experience with Clojure to apply. We want a committee made up of a cross-section of the Clojure community so that we have a wide range of perspectives when making decisions on which projects to fund.</p>
<p>As part of the nomination, if we get more than 12 candidates for board membership, the board will nominate no more than 12 candidates. Our bylaws state:</p>
<blockquote>
<p>The Board shall nominate no more than 12 candidates seeking board membership in any given election. In nominating candidates for Director positions and in choosing the number of candidates to nominate overall, the Board shall use reasonable efforts to maintain a Board composition consisting of at least: (1) 25% female Directors, (2) 25% non-Caucasian Directors, and (3) 35% from any category(ies) of persons (e.g., race, gender, ability) commonly considered to have suffered from discrimination at some time and then-currently under-represented in the technology industry, in each case as determined by the Board in its reasonable discretion.</p>
</blockquote>
<p><strong>The main responsibilities of a committee member are:</strong></p>
<ul>
<li>Participate in the general discussions of the month-to-month running of the program</li>
<li>Evaluate and vote on which open source projects to fund</li>
<li>Help in decision-making for the future plans of Clojurists Together</li>
<li>These responsibilities take roughly one hour/month, though there are peaks and troughs of activity as we go through our quarterly funding cycle. If you have more time to offer, there are lots more things that need developing, automating, designing, e.t.c. It would be great to have you help out with those things, but we don’t want to exclude people from standing because they don’t have a lot of spare time.</li>
</ul>
<p>Our bylaws requires that we do not have more than two committee members from any one company. More than two people from a company can stand for election, but if more than two of these people were to be elected, only the top two ranked candidates would be elected and the other seats would go to the next most highly ranked candidates from other companies. If you have any questions about this, please get in touch.</p>
<p>Elections will be held once the candidates are announced, and all Clojurists Together members will be eligible to vote.</p>
<h3 id="annual-members-meeting">Annual Members Meeting</h3>
<p>We are also holding our third members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=2024++Clojurists+Together+Annual+Member+Meeting&amp;iso=20241029T12&amp;p1=64&amp;ah=1">10 am Pacific time, October 29, 2024</a>. This will be an opportunity for Clojurists Together to share information about 2023 to date and discuss future plans, present the new board members, and most importantly take questions from and engage with members.</p>
<p><strong>More details on this will follow including a videoconferencing link.</strong></p>
<p>Please share this with anyone you think would be able to represent the interests of the Clojure community and Clojurists Together members. Thanks for your support of Clojurists Together, we appreciate it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2024 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2024-funding-announcement/</link>
      <pubDate>Tue, 27 Aug 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2024-funding-announcement/</guid>
      <description>We are funding 7 projects for a total of $35K USD in Q3 2024.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce that  we will be funding 7 projects in Q3 2024 for a total of $35K USD (3 for $9K and 4 shorter or more experimental projects for $2K). To date in 2024, we have or are funding 30 projects or developers for a total of $258,000 USD. This includes the 8 long-term developers whose project work we are supporting for the year. Thanks to all our members for making this happen!</p>
<p>Based on your input on our last two surveys, we know that our members and larger Clojure community rely on this work on a regular (most on a daily) basis.  If we are able to engage more companies or individual developer members, we could support even more important work - so please get the word out.</p>
<p>As usual, we received a LOT of great proposals - so the decision-making was not easy. However, proposals are returned to the pool for another 2 rounds for consideration. Here is a general overview of what each developer plans to work on. We&rsquo;re looking forward to their regular updates as the projects progress!</p>
<h3 id="9k-projects">$9K Projects</h3>
<p><a href="#clojure-goes-fast-oleksandr-yakushev">Clojure Goes Fast: Oleksandr Yakushev</a><br>
<a href="#malli-constraints-and-humanization-ambrose-bonnaire-sergeant">Malli: Ambrose Bonnaire-Sergeant</a><br>
<a href="#scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</a></p>
<h3 id="2k-projects">$2K Projects</h3>
<p><a href="#clj-nix-nixpkgs-jose-luis-lafuente">Clj-nix, nixpkgs: Jose Luis Lafuente</a><br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
<a href="#kushi-jeremiah-coyle">Kushi: Jeremiah Coyle</a><br>
<a href="#standard-clojure-style-chris-oakman">Standard Clojure Style: Chris Oakman</a></p>
<h2 id="9k-projects-1">$9K Projects</h2>
<h3 id="clojure-goes-fast-oleksandr-yakushev">Clojure Goes Fast: Oleksandr Yakushev</h3>
<p>I plan to spend these three months improving different tools under the Clojure Goes Fast umbrella.</p>
<p>For clj-async-profiler, the most accurate performance profiler for Clojure, I want to create a brand new web application that will allow users to host and share the generated flamegraphs. At the moment, even though flamegraphs are just self-contained HTML files, sending them to somebody is a chore. The new service can make this much easier and offer extra features like saving and sharing dynamic transforms on the fly. Additionally, I&rsquo;d like to focus on the UI side of clj-async-profiler - add new dynamic transforms, improve aesthetics and the UX.</p>
<p>For clj-java-decompiler, I have some ideas to expand its preprocessing abilities to present clearer results to the user. I also want to eventually integrate it more tightly with established Clojure IDEs like CIDER and Calva, which requires some groundwork.</p>
<p>Another focus of mine is populating the Clojure Goes Fast knowledge base (<a href="https://clojure-goes-fast.com/kb/">https://clojure-goes-fast.com/kb/</a>) with more articles. I have several topics I want to cover in the knowledge base regarding different types of benchmarking and some fresh ones, and some are written as blog posts and require adapting and bringing the information up to date.</p>
<h3 id="malli-constraints-and-humanization-ambrose-bonnaire-sergeant">Malli (Constraints and Humanization): Ambrose Bonnaire-Sergeant</h3>
<p>This project aims to drastically improve the expressivity of Malli schemas to help address current user feedback and enable future extensions.<br>
The basic idea is to add a constraint language to each schema to express fine-grained invariants and then make this constraint language compatible with validators/explainers/generators/etc so that Malli users can write high-level, precise schemas without resorting to partial workarounds.<br>
A real-world frequent user request on #malli Clojurians is the ability for Malli :map schemas to express constraints about keysets, such as two keys being both present or both absent. Specs/keys supports this using a limited constraint language consisting of (or (and ..)).</p>
<p>It is undesirable to work around this using :fn and :and because it breaks many features of Malli, usually generators and error messages. A better solution would be to support this directly by Malli for maximum compatibility. Unfortunately, this is usually the best and only
suggestion, even though it introduces other problems.</p>
<p>I have prototyped this project here: <a href="https://github.com/frenchy64/malli/pull/12">https://github.com/frenchy64/malli/pull/12</a>  I will collaborate with the Malli maintainers to extract and redevelop parts of the prototype. By the end of the project, I hope to have merged support for constraints in Malli along with documentation for its use.</p>
<h3 id="scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</h3>
<p>Scicloj is a Clojure group developing a stack of tools &amp; libraries for data science. Alongside the technical challenges, community building has been an essential part of its efforts since the beginning of 2019.</p>
<p>Our current main community-oriented goal is making the existing data-science stack easy to use through the maturing of the Noj library, mentioned below. In particular, we are working on example-based documentation, easy setup, and recommended workflows for common tasks.</p>
<p>All these, and the tools to support them, grow organically, driven by real-world use-cases.</p>
<p>Here is the current plan for the coming quarter. While the plan focuses on my tasks, many of these tasks are done in collaboration with others. The plan and priorities are frequently updated through discussions at the Scicloj group.  Daniel has also provided us a <a href="https://youtu.be/WO6mVURUky4?feature=shared">YouTube</a> video explaining more about Scicloj and the project - thanks for this Daniel - it is always fun to hear directly from the source!</p>
<h4 id="stabilize-the-noj-v2-project">Stabilize the Noj v2 project:</h4>
<p><a href="https://scicloj.github.io/noj">https://scicloj.github.io/noj</a>  Noj is an entry point for the main data and science libraries. Some parts are under active development and will be stabilized as a group effort in the coming quarter. Specifically, stabilization will involve the following main tasks:</p>
<ul>
<li>Help with the documentation effort of Fastmath (math &amp; stats) version 3.</li>
<li>Help develop current branches of Metamorph.ml (machine learning) and scicloj.ml.tribuo.</li>
<li>Help with issues in Tablecloth (dataset processing).</li>
<li>Stabilize and extend the API of Hanamicloth (data visualisation).</li>
</ul>
<h4 id="improve-the-noj-documentation">Improve the Noj documentation:</h4>
<p>The goal of the Noj documentation is to introduce the main libraries and explain how they can be composed in typical use cases.</p>
<h4 id="coordinate-the-scicloj-open-source-mentoring-program">Coordinate the Scicloj open-source mentoring program:</h4>
<p><a href="https://scicloj.github.io/docs/community/groups/open-source-mentoring/">https://scicloj.github.io/docs/community/groups/open-source-mentoring/</a></p>
<ul>
<li>Meet all people who apply to the program.</li>
<li>Coordinate the assignment of projects and mentors.</li>
<li>Take part in mentoring most participants.<br>
** Between Aug 10th to Aug 27th:**</li>
<li>21 people have applied and started meeting</li>
</ul>
<h4 id="run-dev-groups-and-study-groups">Run dev groups and study groups:</h4>
<p><a href="https://scicloj.github.io/docs/community/groups/">https://scicloj.github.io/docs/community/groups/</a> In the coming quarter, the following will be most active:</p>
<ul>
<li>real-world-data &ndash; a space to discuss data and science projects at work.</li>
<li>jointprob (restarting these days) &ndash; studying probability &amp; statistics together with other tech communities.</li>
<li>visual-tools &ndash; collaborations of tool-makers and discussion of literate programming, data visualization, and UI design.</li>
<li>data-recur &ndash; recurring updates &amp; discussions around building the emerging data stack.</li>
</ul>
<h4 id="work-on-tooling-for-data--science">Work on tooling for data &amp; science:</h4>
<ul>
<li>Kindly - a simple data-visualization standard to support compatibility across different tools.</li>
<li>Clay - a notebook tool for interactive data exploration and literate programming.</li>
</ul>
<h4 id="work-on-additional-libraries">Work on additional libraries:</h4>
<ul>
<li>Stabilize cmdstan-clj &ndash; a Clojure bridge to the Stan probabilistic programming language.</li>
<li>Initiate the development of a grammar-of-graphics library (ggplot-inspired), continuing our experience with Hanamicloth.</li>
</ul>
<h4 id="maintain-the-scicloj-website">Maintain the Scicloj website:</h4>
<p><a href="https://scicloj.github.io/">https://scicloj.github.io/</a>  <br></p>
<hr>
<h2 id="2k-projects-1">$2K Projects</h2>
<h3 id="clj-nix-nixpkgs-jose-luis-lafuente">Clj-nix, nixpkgs: Jose Luis Lafuente</h3>
<p>I plan to add an alternative builder for Nix that uses Babashka/SCI instead of Bash. It provides a way for constructing complex Nix derivations using Babashka/SCI entirely, eliminating the need to write any Bash code. My plan is to initially develop the builder under the clj-nix project, but if it gains enough traction I&rsquo;d consider extracting the new builder to its own project, or even upstreaming it to nixpkgs.</p>
<p>I also plan to add a Babashka writer to nixpkgs. Nixpkgs supports creating self-contained scripts, called &ldquo;nix writers.&rdquo; Traditionally written in Bash, recent versions of nixpkgs include the ability to write these scripts in Python, Ruby, or Rust. I propose adding a new writer to support Babashka.</p>
<h3 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h3>
<p>Jank feels like Clojure now, with 92% syntax parity and nearly 40% clojure.core parity. But it only <strong>feels</strong> like Clojure to me because none of you are using it yet.</p>
<p>My top priority is to change that.</p>
<p>I&rsquo;ll be working on building out jank&rsquo;s nREPL server, which involves implementing bencode support, <code>clojure.test</code>, improving native interop, supporting pre-compiled binary modules, and ultimately adding AOT compilation support.</p>
<p>This is a great deal of work, with many side quests along the way, but I&rsquo;m aiming to have the nREPL server working from my editor by the end of the year.</p>
<h3 id="kushi-jeremiah-coyle">Kushi: Jeremiah Coyle</h3>
<p>I&rsquo;ll continue development of Kushi, a foundation for building web UI with ClojureScript. Work during the Q3 funding cycle will focus on finishing the new css transpilation pipeline, significant build system performance upgrades, and implementing a reimagined theming system.</p>
<h3 id="standard-clojure-style-chris-oakman">Standard Clojure Style: Chris Oakman</h3>
<p>I&rsquo;ll be developing Standard Clojure Style which is a &ldquo;no config, runs everywhere, follows simple rules&rdquo; formatter for Clojure code.<br>
More information about the genesis of the project can be found on Issue #1: <a href="https://github.com/oakmac/standard-clojure-style-js/issues/1">https://github.com/oakmac/standard-clojure-style-js/issues/1</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2024 Annual Members&#39; Meeting</title>
      <link>https://www.clojuriststogether.org/news/2024-annual-members-meeting/</link>
      <pubDate>Tue, 30 Jul 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2024-annual-members-meeting/</guid>
      <description>Please Hold the Date!</description>
      <content:encoded><![CDATA[<h3 id="annual-members-meeting">Annual Members' Meeting</h3>
<p>Our 4th annual convening is fast-approaching - so we want to give you advance notice of the date. We know you are busy, but if you could reserve an hour to meet, we would value both your participation and input. Please hold the following date and time on your schedules (certainly not a complete list - but enough to check your time). We&rsquo;ll be sending out more information and an agenda in the coming month.</p>
<p>Auckland Wed., Oct 30, 6 am<br>
Chicago Tues., Oct 29. 12 pm (noon)<br>
New York, Tues., Oct 29, 1 pm<br>
São Paulo, Brazil, Tues., Oct 29, 2 pm<br>
London, Tues. Oct 29, 5 pm<br>
Amsterdam, Barcelona, Belgrade, Berlin, Paris Tues., Oct. 29, 6 pm</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>May &amp; June 2024 Long-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/may-june-2024-long-term-project-updates/</link>
      <pubDate>Mon, 22 Jul 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/may-june-2024-long-term-project-updates/</guid>
      <description>The latest from Bozhidar Batsov, Michiel Borkent, Toby Crawley, Thomas Heller, Kira McLean, Nikita Prokopov, Tommi Reiman, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>A huge thank you to our 2024 long-term developers for their amazing work in May and June. Check out their latest project updates!</p>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER    <br>
<a href="#michiel-borkent">Michiel Borkent:</a> squint, babashka, neil, cherry, clj-kondo, and more<br>
<a href="#toby-crawley">Toby Crawley:</a> clojars-web <br>
<a href="#thomas-heller">Thomas Heller:</a> shadow-cljs, shadow-grove <br>
<a href="#kira-mclean">Kira McLean:</a> Scicloj Libraries. tcutils, Clojure Data Cookbook, and more<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Humble UI, Datascript, AlleKinos, Clj-reload, and more<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Reitit 7.0. Malli, jsonista, and more <br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Carmine, Nippy, Telemere, and more</p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>This period was quite busy and productive for CIDER and friends. The highlights are 3 (!!!) CIDER releases and a couple of nREPL releases:</p>
<ul>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.14.0">CIDER 1.14 (&ldquo;Verona&rdquo;)</a></li>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.15.0">CIDER 1.15 (&ldquo;Cogne&rdquo;)</a></li>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.15.1">CIDER 1.15.1 </a> (small bug-fix release)</li>
<li><a href="https://github.com/nrepl/nrepl/releases/tag/v1.1.2">nREPL 1.1.2</a> (small bug-fix release)</li>
<li><a href="https://github.com/nrepl/nrepl/releases/tag/v1.2.0">nREPL 1.2.0</a></li>
</ul>
<p>CIDER 1.14 is our most ambitious release since CIDER 1.8 (&ldquo;Geneva&rdquo;), which was released last autumn.</p>
<p>The single most notable user-visible change of this release is that CIDER is now more robust when evaluating and displaying large values. CIDER will no longer hang when <code>C-x C-e</code>ing a big value in a source buffer or stepping over such a value with CIDER debugger.</p>
<p>I&rsquo;m guessing that many people will also appreciate the improvements we&rsquo;ve made to flex completion (which is finally fully compliant with the Emacs completion API), the inspector and to the cider-cheatsheet functionality which was mostly redesigned.</p>
<p>nREPL 1.2 restores the ability to interrupt evaluation on JDK 20+ (see <a href="https://github.com/nrepl/nrepl/pull/318">https://github.com/nrepl/nrepl/pull/318</a> for details) and CIDER 1.15 implements support for nREPL 1.2.</p>
<p>More interesting work is in progress, so I hope I&rsquo;ll have another exciting report for all of you in a couple of months!  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p><strong>Updates</strong>
In this post I&rsquo;ll give updates about open source I worked on during May and June 2024. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without <em>you</em>, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all.</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br/">Nubank</a></li>
</ul>
<h3 id="sponsor-info">Sponsor info</h3>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which aren&rsquo;t listed above, please get in touch.</p>
<p>On to the projects that I&rsquo;ve been working on!</p>
<h3 id="updates">Updates</h3>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on in May and June.</p>
<ul>
<li>
<p><a href="https://github.com/borkdude/html">html</a>: Html generation library inspired by squint&rsquo;s html tag</p>
<ul>
<li>A <strong>NEW</strong> library for html generation that is both safe, performant, generates easy to understand code and works the same across CLJ and CLJS.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting. Released v1.3.191 with the following changes: \</p>
<ul>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1688">#1688</a>: <code>use-fixtures</code> should add metadata to <code>*ns*</code></li>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1692">#1692</a>: Add support for <code>ITransientSet</code> and <code>org.flatland/ordered-set</code></li>
<li>Bump org.flatland/ordered to <code>1.15.12</code>.</li>
<li>Partially Fix <a href="https://github.com/babashka/babashka/issues/1695">#1695</a>: <code>--repl</code> arg handling should consume only one arg (itself) (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li>Partially Fix <a href="https://github.com/babashka/babashka/issues/1695">#1695</a>: make <code>*command-line-args*</code> value available in the REPL (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1686">#1686</a>: do not fetch dependencies/invoke java for <code>version</code>, <code>help</code>, and <code>describe</code> options (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1696">#1696</a>: add <code>clojure.lang.DynamicClassLoader</code> constructors (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1696">#1696</a>: add <code>clojure.core/*source-path*</code> (points to the same sci var as <code>*file*</code>) (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1696">#1696</a>: add <code>clojure.main/with-read-known</code> (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1696">#1696</a>: add <code>clojure.core.server/repl-read</code> (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1696">#1696</a>: make the <code>cognitect-labs/transcriptor</code> library work (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li><a href="https://github.com/babashka/babashka/issues/1700">#1700</a>: catch exceptions from resolving symbolic links during <code>bb.edn</code> lookup (<a href="https://github.com/bobisageek">@bobisageek</a>)</li>
<li>Support <code>java.nio.channels.ByteChannel</code> + several other related interop</li>
<li>Bump <code>nrepl/bencode</code> to <code>1.2.0</code></li>
<li>Bump <code>babashka/fs</code></li>
<li>Bump <code>org.babashka/http-client</code> to <code>0.4.18</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy. \</p>
<ul>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2335">#2335</a>: read causes side effect, thus not an unused value</li>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2336">#2336</a>: <code>do</code> and <code>doto</code> type checking (<a href="https://github.com/yuhan0">@yuhan0</a>)</li>
<li>Fix <a href="https://github.com/clj-kondo/clj-kondo/issues/2322">#2322</a>: report locations for more reader errors (<a href="https://github.com/yuhan0">@yuhan0</a>)</li>
<li>Imports were copied to <code>.clj-kondo/imports</code> but weren&rsquo;t pick up correctly. Thanks <a href="https://github.com/frenchy64">@frenchy64</a> for reporting the bug.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2333">#2333</a>: Add location to invalid literal syntax errors</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2323">#2323</a>: New linter <code>:redundant-str-call</code> which detects unnecessary <code>str</code> calls. Off by default.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2302">#2302</a>: New linter: <code>:equals-expected-position</code> to enforce expected value to be in first (or last) position. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1035">#1035</a>: Support SARIF output with <code>--config {:output {:format :sarif}}</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2307">#2307</a>: import configs to intermediate dir</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2309">#2309</a>: Report unused <code>for</code> expression</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2315">#2315</a>: Fix regression with unused JavaScript namespace</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2304">#2304</a>: Report unused value in <code>defn</code> body</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2227">#2227</a>: Allow <code>:flds</code> to be used in keys destructuring for ClojureDart</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2316">#2316</a>: Handle ignore hint on protocol method</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2322">#2322</a>: Add location to warning about invalid unicode character</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2319">#2319</a>: Support <code>:discouraged-var</code> on global JS values, like <code>js/fetch</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/536">#536</a>: HTML is not escaped in dynamic expression</li>
<li><a href="https://github.com/squint-cljs/squint/issues/537">#537</a>: Fix <code>not</code>: wrap argument in parens</li>
<li>Return interop expression in function body</li>
<li>Prefer value from props map over explicit value</li>
<li><code>#html</code> improvements, support <code>:&amp;</code> for spreading props</li>
<li><a href="https://github.com/squint-cljs/squint/issues/492">#492</a>: defclass static methods and fields</li>
<li><a href="https://github.com/squint-cljs/squint/issues/526">#526</a>: Fix export of class name with dashes</li>
<li><a href="https://github.com/squint-cljs/squint/issues/517">#517</a>: Preserve state over REPL evals</li>
<li><a href="https://github.com/squint-cljs/squint/issues/513">#513</a>: Fix <code>shuffle</code> core function random distribution and performances</li>
<li><a href="https://github.com/squint-cljs/squint/issues/517">#517</a>: Fix re-definition of class with <code>defclass</code> in REPL</li>
<li><a href="https://github.com/squint-cljs/squint/issues/522">#522</a>: fix <code>nil</code> <code>#html</code> rendering issue</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects.<br>
Released version 0.3.65 with the following changes:</p>
<ul>
<li><a href="https://github.com/babashka/neil/issues/209">#209</a>: add newlines between dependencies</li>
<li><a href="https://github.com/babashka/neil/issues/185">#185</a>: throw on non-existing library</li>
<li>Bump <code>babashka.cli</code></li>
<li>Fetch latest stable <code>slipset/deps-deploy</code>, instead of hard-coding (<a href="https://github.com/vedang">@vedang</a>)</li>
<li>Several emacs package improvements (<a href="https://github.com/agzam">@agzam</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Fix <a href="https://github.com/squint-cljs/cherry/issues/130">#130</a>: fix predefined <code>:aliases</code> for cherry.embed</li>
<li>Support <code>IDeref</code>, <code>ISwap</code>, <code>IReset</code> in <code>deftype</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a>: Clojure/Script mode for CodeMirror 6.</p>
<ul>
<li>Fix <a href="https://github.com/nextjournal/clojure-mode/issues/54">#54</a>: support slurping from within string literal</li>
</ul>
</li>
<li>
<p><a href="https://github.com/brightin/pottery">pottery</a>: A clojure library to interact with gettext and PO/POT files</p>
<ul>
<li>Contributed a few improvements to dealing with reader conditionals</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>Fix <code>cljs.pprint/print-table</code> + <code>with-out-str</code></li>
<li>Fixed <code>cljs.test/testing</code> macro to display strings correctly on test failure (<a href="https://github.com/jaidetree">@jaidetree</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs! \</p>
<ul>
<li>Fix <a href="https://github.com/babashka/cli/issues/98">#98</a>: internal options should not interfere with :restrict</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Upgrade/sync with clojure CLI v1.11.3.1463</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>There are many other projects I’m involved with but that had little to no activity in the past month. Check out the <strong>Other Projects</strong> section (more details) of <a href="https://blog.michielborkent.nl/oss-updates-may-jun-2024.html">my blog here</a> to see a full list.</p>
<p>Published 30-06-2024. <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/89e33a5a60f10ccb33e59d3a418a224bcb4af0dd...a59efb6128f2ae355df359a57bf06d6b8b0289cc"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/190777d4270533d7d4316bb7f2e911cb80ee0dc1...5cb87635b43bf3febe3187940e53ce0ecbf918fd"><code>infrastructure</code></a></p>
<ul>
<li><a href="https://github.com/clojars/infrastructure/commit/e84ca04ec2bb304212751d709c168d781cd101ae">Add wrappers for hashicorp tools to ensure consistent version usage</a></li>
<li><a href="https://github.com/clojars/clojars-web/pull/882">Ensure emails are downcased; don’t allow future duplicate email usage</a></li>
<li><a href="https://github.com/clojars/clojars-web/pull/883">Upgrade to Jetty 11</a></li>
</ul>
<h3 id="june-2024">June 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/a59efb6128f2ae355df359a57bf06d6b8b0289cc...02a10234c5b2e78a3b07ab20f9062fb6f24b833b"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/5cb87635b43bf3febe3187940e53ce0ecbf918fd...59cec6c2924811f07d5e231923e642f6306fee05"><code>infrastructure</code></a></p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/4acf752f11adf2a32041f8788852771c5eb909fa">Upgrade nippy to address CVE-2024-36124</a></li>
<li><a href="https://github.com/clojars/infrastructure/commit/02f51fd94057680ddb4e205e73ba2d8d82547b57">Upgrade LoadBalancer SSL policy</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/053cb838677011f7cc39ad3a577b01edc279ccf8">Clean up many typos</a> (also in <a href="https://github.com/clojars/infrastructure/commit/59cec6c2924811f07d5e231923e642f6306fee05">infrastructure</a>)  <br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.28.10 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<h3 id="notable-updates">Notable Updates</h3>
<ul>
<li>Reworked some of the shadow-grove internals and adjusted the shadow-cljs UI accordingly. Fixing some old bugs in the process.</li>
<li>Updated some Grove Architecture docs: <a href="https://github.com/thheller/shadow-grove/blob/master/doc/kv.md">KV</a>, <a href="https://github.com/thheller/shadow-grove/blob/master/doc/arch/big-picture.md">Big Picture</a>, <a href="https://github.com/thheller/shadow-grove/blob/master/doc/arch/defc-deep-dive.md">defc deep dive</a> and <a href="https://github.com/thheller/shadow-grove/blob/master/doc/arch/defc-impl-notes.md">impl notes</a> <br></li>
</ul>
<hr>
<h2 id="kira-mclean">Kira McLean</h2>
<p>This is a summary of the open source work I&rsquo;ve spent my time on throughout May and June, 2024. There were lots of small bug fixes and reports, driven by work on the Clojure Data Cookbook. This work was also the impetus for my initial release of <a href="https://github.com/scicloj/tcutils"><code>tcutils</code></a>, a library of utility functions for working with tablecloth datasets. I also had the wonderful opportunity to attend PyData London in June and found it really insightful and inspiring. Read on for more details.</p>
<h3 id="sponsors-1">Sponsors</h3>
<p>This work is made possible by the generous ongoing support of my sponsors. I appreciate all of the support the community has given to my work and would like to give a special thanks to Clojurists Together and Nubank for providing me with lucrative enough grants that I can reduce my client work significantly and afford to spend more time on these projects.</p>
<p>If you find my work valuable, please share it with others and consider supporting it financially. There are details about how to do that on my <a href="https://github.com/sponsors/kiramclean">GitHub sponsors page</a>. On to the updates!</p>
<h3 id="ecosystem-issue-reports-and-bug-fixes">Ecosystem issue reports and bug fixes</h3>
<p>Working on the cookbook these last couple of months turned up a few small issues in ecosystem libraries. The other developers of Clojure&rsquo;s data science tools are such a pleasure to work with, it&rsquo;s so rare and nice to have a distributed team of people capable of getting cool things built asynchronously. Here are some details of a few particular issues that came up:</p>
<ul>
<li>Small problem loading .xls/.xlsx files as datasets if they had a number as a column name: <a href="https://clojurians.zulipchat.com/#narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/xlsx.20column.20parsing/near/437313810">discussed here</a>, <a href="https://github.com/techascent/tech.ml.dataset/issues/408">reported here</a>, and graciously <a href="https://github.com/techascent/tech.ml.dataset/commit/24c0e646f289210aa95c1ac9998cb2ddd5c9f836">fixed by Chris Nuernberger</a>.</li>
<li>Unexpected behaviour when comparing certain numeric types in <code>dtype-next</code>: [discussed here](<a href="https://clojurians.zulipchat.com/#narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/numeric.20datatypes/near/438617694%5D(https://clojurians.zulipchat.com/%23narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/numeric.20datatypes/near/438617694),">https://clojurians.zulipchat.com/#narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/numeric.20datatypes/near/438617694%5D(https://clojurians.zulipchat.com/%23narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/numeric.20datatypes/near/438617694),</a> <a href="https://github.com/cnuernber/dtype-next/issues/99">reported here</a>, and again <a href="https://github.com/cnuernber/dtype-next/commit/563fe9c13797feb206391cd951655942e3e6cf0f">fixed by Chris</a>. This one sadly had some unintended consequences that <a href="https://github.com/cnuernber/dtype-next/issues/103">generateme found and reported here</a>.</li>
<li><a href="https://github.com/scicloj/clay/blob/b299d060c3edbce789a55fee3efedce42fbd2ab4/CHANGELOG.md">Many improvements to Clay</a> by Daniel Slutsky, especially a couple of ones that make the quarto publications it produces much nicer: <a href="https://github.com/scicloj/clay/pull/102">fixing too-wide tables in quarto pages</a> and <a href="https://clojurians.zulipchat.com/#narrow/stream/321125-noj-dev/topic/kindly.20options/near/440663980">supporting limiting the number of table rows that get displayed</a>.</li>
<li>Some good discussions about how best to incorporate the myriad of dependencies required to use Java machine learning libraries in Clojure libs, including sorting out what to do about <a href="https://github.com/scicloj/scicloj.ml.tribuo/issues/1">transitive dependencies in our tribuo wrapper</a>, led by Carsten Behring.</li>
</ul>
<h3 id="initial-release-of-tcutils">Initial release of tcutils</h3>
<p>In my explorations of other languages' tools for working data I often come across nice utility functions that are super simple but have a big impact on the ergonomics of using the tools. I wanted to start bringing some of these convenience utilities to Clojure, so for now I&rsquo;m putting them in <a href="https://github.com/scicloj/tcutils"><code>tcutils</code></a>. So far only a handful of helpers are implemented (<code>lag</code>, <code>lead</code>, <code>cumsum</code>, and <code>clean-column-names</code>). The goal is to eventually fill out more utilities that save people from having to dig into the documentation of half a dozen different libraries to figure out how to implement things like these. The goal is not to achieve feature parity or to exactly copy similar libraries, like pandas or dplyr, but rather to take inspiration from them and make our tools easier to use for people who are used to these conveniences.</p>
<h3 id="progress-on-clojure-data-cookbook">Progress on Clojure Data Cookbook</h3>
<p>I spent a lot of time on the Clojure Data Cookbook over these last two months. Notable progress includes:</p>
<ul>
<li>The introductory chapters bear some resemblance now to the final form they&rsquo;ll take.</li>
<li>The overall structure of the book is much more clear now.</li>
<li>I started the example analysis that will serve as the high-level introductory section of the book.</li>
<li>The publishing and deployment process is finally working.</li>
</ul>
<p>It&rsquo;s still very much in progress, but in the interest of transparency the work-in-progress version is <a href="https://github.com/scicloj/clojure-data-cookbook">available online now</a>. It will continue to evolve and change as I fill out more and more of the chapters, but there&rsquo;s enough of it available now to hopefully give a sense of the style and tone I&rsquo;m going for. I also finally have the publishing workflow set up and it&rsquo;s generating a nice-looking Quarto book, thanks to all of Daniel Slutsky&rsquo;s amazing work on Clay and Quarto integration recently.</p>
<h3 id="progress-on-high-level-goals">Progress on high-level goals</h3>
<p>The high-level goal of my work in general remains to steward Clojure&rsquo;s data science ecosystem to a state of maturity and flourishing so that data practitioners can use it to get real work done. Toward this end, I set up a <a href="https://github.com/users/kiramclean/projects/4">project board</a> to track progress toward what I see as the main components of this project.</p>
<p>Over the last couple of months, beginning with a prototype demoed at my <a href="https://www.youtube.com/watch?v=eUFf3-og_-Y">London Clojurians talk in April</a>, Daniel Slutsky has made tremendous progress on our goal of implementing a grammar of graphics in Clojure in the new <a href="https://github.com/scicloj/hanamicloth">hanamicloth library</a>. The near-term goal is to stabilize the API of this library enough that it can be used to provide a user-friendly way to accomplish all of the simple data visualization tasks that are currently possible with our other tools. The long term goal is to take the lessons we learn from this library and build a JVM-only grammar of graphics library for doing data visualization &ldquo;right&rdquo; in Clojure.</p>
<p>The development and surrounding discussions of hanamicloth have also made me realize it would be useful to write an overview of the current state of dataviz options for Clojure and why we&rsquo;re working on building something new. That&rsquo;s on my list for the coming months, but lower priority than actual development work.</p>
<h3 id="impressions-from-pydata-london">Impressions from PyData London</h3>
<p>I got to attend PyData London this year thanks to a client of mine who was sponsoring the conference. I learned a lot and found the talks very interesting. My overall impression is that data science is maturing as a discipline, with more polished methods and robust theory backing up different approaches to data-related problems. With this maturation, though, comes higher expectations for production-ready, professional quality results. Most of the talks focused on high-level concerns like observability, scalability, and long-term stewardship of large open-source projects.</p>
<p>There are a lot of reasons why Python is just not ideal for building highly available, high-performance systems, and I really believe this is a good time to be building alternative tools for data science. Python is obviously entrenched as the current default language for working with data, but it is difficult and slow to write code that can take full advantage of modern hardware (because of the infamous global interpreter lock, reference counting, slow I/O, among other reasons). And to be fair, the Python community knows this. It&rsquo;s why virtually all of the libraries that do the heavy lifting for data science in Python are actually implemented in C (numpy,  pandas) or Rust (Polars, Pydantic), or are wrappers around C++ (PyTorch, TensorFlow, matplotlib) or Java (PySpark, Pydoop, confluent-kafka) libraries.</p>
<p>I think this provides a lot of insights into what data practitioners want. It&rsquo;s clear that users <em>want</em> approachable, simple, human-readable interfaces for all of these tools, and that any new tool needs to interoperate with the rest of the ones currently in use. People are also <a href="https://news.ycombinator.com/item?id=40815097">tired of churn</a> and are craving stability. I think Clojure has a lot to offer in all of these areas and is well placed to become more widely adopted for data science.</p>
<h3 id="ongoing-work">Ongoing work</h3>
<p>My focus over the next two months will remain on the cookbook. My main goal is to finish the introductory chapter with the housing price analysis and to continue putting together the data import section with instructions and examples for all file formats that can reasonably be supported easily at this time.</p>
<p>I&rsquo;ll continue to support and contribute to all of the ecosystem libraries I come across in my writings and analysis work in hopes of smoothing out all the rough edges I find.</p>
<p>Thanks for reading. I always love hearing from people who are interested in any of the things I&rsquo;m working on. If that&rsquo;s you, don&rsquo;t hesitate to be in touch :)  <br></p>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hi, I’m Nikitonsky and this is my open-source update for the past two months. Some good work was done on Humble UI (finally!), DataScript and new project — AlleKinos.de.</p>
<p>New project: <a href="https://allekinos.de/">AlleKinos.de</a>, a no-nonsense movie showtimes site for the entire Germany:</p>
<ul>
<li>A simple view for all movie screenings in Germany, inspired by Bret Victor’s Magic Ink</li>
<li>Developed in Clojure, data stored in DataScript, hosted on <a href="https://application.garden/">application.garden</a></li>
<li>Includes many many small cities (up to 671 now!),</li>
<li>And all the cinemas that were reported missing before.</li>
</ul>
<p><a href="https://github.com/HumbleUI/HumbleUI">HumbleUI</a>, Clojure Desktop UI framework:</p>
<ul>
<li>A long-standing <code>vdom</code> branch that was dragging from January <a href="https://github.com/HumbleUI/HumbleUI/commit/6be0b49f27994d17d5197bdb2ac5d6e31b976625">is finally merged</a>!</li>
<li>All examples have been ported to the new style</li>
<li>Still lots of issues and design ideas to look at, but now I’ll be going through them in the main branch</li>
</ul>
<p><a href="https://github.com/tonsky/datascript">DataScript</a>, immutable database and Datalog query engine for Clojure, ClojureScript, and JS:</p>
<ul>
<li>fixed some OR queries broken in 1.6.4 <a href="https://github.com/tonsky/datascript/issues/468">468</a>, closes <a href="https://github.com/tonsky/datascript/issues/469">469</a>)</li>
<li>Remove duplicate code <a href="https://github.com/tonsky/datascript/issues/471">471</a></li>
<li>Document “partial db” during transaction <a href="https://github.com/tonsky/datascript/issues/366">366</a></li>
<li>Stable sorting of sequences of various types <a href="https://github.com/tonsky/datascript/issues/470">470</a></li>
<li>Correctly restore <code>:max-tx</code> from storage</li>
<li>Fixed tempid/upsert resolution when multiple tempids are added first (closes <a href="https://github.com/tonsky/datascript/issues/472">472</a></li>
<li>Allow upsert by implicit tuple when only tuple components are specified <a href="https://github.com/tonsky/datascript/issues/473">473</a></li>
<li>Allow lookup-refs inside tuples used for lookup-refs <a href="https://github.com/tonsky/datascript/issues/452">452</a></li>
<li>Code cleanup and formatting for the entire codebase</li>
</ul>
<p><a href="https://github.com/tonsky/clj-reload">clj-reload</a>, a smarter way to reload Clojure code:</p>
<ul>
<li>Disabled parallel init/reload via lock <a href="https://github.com/tonsky/clj-reload/issues/9">9</a></li>
<li><code>:only</code> with regexp only reloads changed + new matching</li>
<li>added find-namespaces</li>
<li>clj-reload support has been <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.14.0">merged into CIDER 1.14</a></li>
<li>Now possible to initialize without passing <code>:dirs</code> option, will use system classpath in that case</li>
</ul>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>, Clojure support for Sublime Text 4:</p>
<ul>
<li>Fixed Socket REPL not working on Windows <a href="https://github.com/tonsky/Clojure-Sublimed/issues/95">95</a></li>
<li>Fixed a bug when Clojure Sublimed would not work right after first install <a href="https://github.com/tonsky/Clojure-Sublimed/issues/109">109</a></li>
</ul>
<p><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>, Sublime Text plugin to run any executable from your working dir:</p>
<ul>
<li>Added <code>executor_show_panel_on_output</code> option</li>
</ul>
<h3 id="blogging">Blogging:</h3>
<ul>
<li><a href="https://tonsky.me/blog/allekinos/">Going to the cinema is a data visualization problem</a></li>
<li><a href="https://tonsky.me/blog/crdt-filesync/">Local, First, Forever</a>: what if your CRDT’s syncing engine was Dropbox?</li>
</ul>
<h3 id="talks">Talks:</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=PEDTXF6SQeE">Clj-reload at Clojure Berlin</a> (a bit rushed).</li>
<li><a href="https://www.youtube.com/watch?v=srvFRG5tdg8">Same talk, but re-recorded offline</a>, a little more deep and less rushed. I recommend this version.</li>
</ul>
<p>Love,<br>
Niki  <br></p>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Started my 3 month sabbatical in June with a road-trip with the kids, a welcome reset! Now back to home, learning and doing.<br>
Refreshed my knowledge of the latest <a href="https://typescriptlang.org">TypeScript</a>, <a href="https://zod.dev/">Zod</a> and <a href="https://xstate.js.org/">XState</a>
with a goal to pull some of the good things to Clojure (into Malli + a fully Xstate-compatible FSM-library). Also working on a
template-project with monorepo + malli + reitit, using Java21 and Virtual Threads.</p>
<h3 id="library-releases">Library Releases</h3>
<h3 id="reitit-071-active">reitit 0.7.1 (active)</h3>
<p>Fixing regression bugs from 0.7.0 + latest features via dependent libraries.
Changelog <a href="https://github.com/metosin/reitit/blob/master/CHANGELOG.md#071-2024-06-30">here</a>.</p>
<h3 id="malli-0162-active">malli 0.16.2 (active)</h3>
<p>Welcome Experimental Simplified Function Schemas!</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[<span style="color:#e6db74">:-&gt;</span> <span style="color:#e6db74">:any</span>] <span style="color:#75715e">; [:=&gt; :cat :any]</span>
[<span style="color:#e6db74">:-&gt;</span> <span style="color:#e6db74">:int</span> <span style="color:#e6db74">:any</span>] <span style="color:#75715e">; [:=&gt; [:cat :int] :any]</span>
[<span style="color:#e6db74">:-&gt;</span> [<span style="color:#e6db74">:cat</span> <span style="color:#e6db74">:int</span>] <span style="color:#e6db74">:any</span>]  <span style="color:#75715e">; [:=&gt; [:cat [:cat :int]] :any]</span>
[<span style="color:#e6db74">:-&gt;</span> a b c d <span style="color:#e6db74">:any</span>] <span style="color:#75715e">; [:=&gt; [:cat a b c d] :any]</span>

<span style="color:#75715e">;; guard property</span>
[<span style="color:#e6db74">:-&gt;</span> {<span style="color:#e6db74">:guard</span> (<span style="color:#66d9ef">fn </span>[[[arg] ret]] ...)} <span style="color:#e6db74">:string</span> <span style="color:#e6db74">:boolean</span>]
<span style="color:#75715e">; [:=&gt; [:cat :string] :boolean [:fn (fn [[[arg] ret]] ...)]]</span>
</code></pre></div><p>Also, small fixes and additions. Changelog <a href="https://github.com/metosin/malli/blob/master/CHANGELOG.md#0162-2024-06-30">here</a>.</p>
<p>There is a big bunch of WIP work from myself and contributors waiting to be finished.</p>
<h3 id="jsonista-039-stable">jsonista 0.3.9 (stable)</h3>
<p><code>:do-not-fail-on-empty-beans</code> option + updated dependencies, Changelog <a href="https://github.com/metosin/jsonista/blob/master/CHANGELOG.md#039-2023-06-29">here</a></p>
<h3 id="ring-http-response-094-stable">ring-http-response 0.9.4 (stable)</h3>
<p>Teapots welcome! Changelog <a href="https://github.com/metosin/ring-http-response/blob/master/CHANGELOG.md#094-2962024">here</a>.</p>
<h3 id="spec-tools-0107-inactive">spec-tools 0.10.7 (inactive)</h3>
<p>Small fixes and improvements, Changelog <a href="https://github.com/metosin/spec-tools/blob/master/CHANGELOG.md#0107-2024-06-29">here</a>.
If you are a user of spec-tools and want to help, feel free to ping me on Clojurians Slack, happy to take a new contributor here.</p>
<h3 id="something-else">Something Else</h3>
<p>Old abandoned Soviet-era sanatorium in Latvia.</p>
<p><img width="1728" alt="baltics" src="https://gist.githubusercontent.com/ikitommi/8c904bfaa17f3871f80d3e20ea84ebb7/raw/16c45e9af4d423c758f399db2f4d94c4cadf02d6/baltics.jpg"> <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work! I realise that it&rsquo;s a tough time for a lot of folks and businesses lately, and that sponsorships aren&rsquo;t always easy 🙏</p>
<h3 id="2024-may---jun">2024 May - Jun</h3>
<p>Hi folks! 👋</p>
<p>The last couple months have been light on big-ticket releases. Have been focused on maintenance, support, and groundwork for future releases. Output included:</p>
<h3 id="nippy-and-carmine-security-releases">Nippy and Carmine security releases</h3>
<p>If you haven&rsquo;t yet, please do try update to the latest versions of Nippy and/or Carmine when possible:</p>
<ul>
<li><a href="https://github.com/taoensso/nippy/releases/tag/v3.4.2">Nippy v3.4.2</a> released 2024-05-26</li>
<li><a href="https://github.com/taoensso/carmine/releases/tag/v3.4.1">Carmine v3.4.1</a> released 2024-05-30</li>
</ul>
<p>These include a fix to address a <a href="https://github.com/taoensso/nippy/security/advisories/GHSA-vw78-267v-588h">security vulnerability</a> described in more detail in <a href="https://github.com/taoensso/nippy/releases/tag/v3.4.2">Nippy&rsquo;s release notes</a>.</p>
<p>In short: Carmine uses Nippy for its serialization, and Nippy uses a <a href="https://github.com/airlift/aircompressor">Java compression library</a> for its compression. Earlier releases of that Java library may be vulnerable when decompressing <strong>malicious data directly crafted by an attacker</strong>. The attack is believed to require arbitrary control of the data provided to Nippy for thawing.</p>
<p>Relevant posts were made to the Clojure <a href="https://www.reddit.com/r/Clojure/comments/1d4q9k0/security_advisory_moderate_please_update_to_nippy/">subreddit</a>, Clojurians <a href="https://clojurians.slack.com/archives/C06MAR553/p1717141613851239">Slack</a>, and my X account.</p>
<h3 id="telemere">Telemere</h3>
<p>Work has continued on <a href="https://www.taoensso.com/telemere">Telemere</a>, my new <strong>structured logging and telemetry library</strong> for Clojure/Script.</p>
<p>There were numerous minor beta releases to address various issues that came up, and to polish sharp edges and documentation, etc.</p>
<p>Instead of detailing all that here, I&rsquo;ll just point to the current release - <a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0-beta14">v1.0.0-beta14</a>. The latest beta release will always include a summary of all major recent changes.</p>
<p>I&rsquo;m aiming to try out RC1 around the end of August, but won&rsquo;t needlessly rush. I&rsquo;d like the API to be completely stable after v1 final is out, so I&rsquo;d rather go a bit slower now to get things right.</p>
<p>Big thanks to early adopters and testers for all the valuable feedback so far! 🙏</p>
<h3 id="carmine">Carmine</h3>
<p>Work has continued on Carmine v4. It&rsquo;s quite an undertaking, but I&rsquo;ve recently updated and merged the first parts of the new v4 core into mainline.</p>
<p>The current plan is for all the new stuff to live in a parallel <code>taoensso.carmine-v4</code> namespace. This&rsquo;ll make it easier for me to roll out the new work in stages, and get feedback from early adopters without negatively impacting existing users.</p>
<p>There&rsquo;ll be a lot to say on Carmine v4, but that&rsquo;ll come later.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>My current roadmap can always be found <a href="https://www.taoensso.com/roadmap">here</a>, and it&rsquo;s now also possible to <a href="https://www.taoensso.com/roadmap/vote">vote</a> to help guide my priorities.</p>
<p>Current objectives for July-August include:</p>
<ul>
<li>Continued efforts on <a href="https://www.taoensso.com/telemere">Telemere</a>.</li>
<li>Hopefully release the final stable version of <a href="https://www.taoensso.com/tempel">Tempel</a> - my new <strong>data security framework</strong> for Clojure. Before the final release I&rsquo;m planning to investigate support for <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">MFA</a>, extend the docs re: use with <a href="https://en.wikipedia.org/wiki/OpenID">OpenID</a>, <a href="https://en.wikipedia.org/wiki/OWASP">OWASP</a>, and make a few other last improvements. Originally had this planned for earlier, but rescheduled so that I could prioritise the Nippy security topic.</li>
</ul>
<p>Cheers!<br>
- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>June &amp; July 2024 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/june-july-2024-short-term-project-updates/</link>
      <pubDate>Sat, 20 Jul 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/june-july-2024-short-term-project-updates/</guid>
      <description>Updates from clj-merge tool, Compojure-api, Enjure, Jank, and Lost in Lambduhhs Podcast</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve got several updates to share from our Q2 2024 project developers. Check out the latest in their June and July Reports following the project list below.</p>
<p><a href="#clj-merge-kurt-harriger">clj-merge tool: Kurt Harriger</a><br>
This project focuses on developing a git diff and merge tool for edn and clojure code with the aim of creating a <a href="https://github.com/kurtharriger/clj-mergetool">git mergetool</a> that can be used as a replacement for git’s default merge tool for clj(s) and edn files.</p>
<p><a href="#compojure-api-ambrose-bonnaire-sergeant">Compojure-api: Ambrose Bonnaire-Sergeant</a>  <br>
<a href="https://github.com/metosin/compojure-api">This project</a> will deploy the first new releases since 2019 (and include compojure-api 1.x, 2.0.0-alpha branch, ring-swagger), compojure-api/reitet migration tools, and Swagger 3.0.</p>
<p><a href="#enjure-janet-a-carr">Enjure: Janet A. Carr</a><br>
This project focuses on MVP for the <a href="https://github.com/janetacarr/enjure/blob/main/notes.org">Enjure CLI tool</a> and providing the ability to create new projects and view/controller templates as well as delete templates.</p>
<p><a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
<a href="https://github.com/jank-lang/jank">Jank&rsquo;s</a> library parity with Clojure.core is around 20%. The next step is to fill out the language to make it feel more like Clojure - including Lazy sequences, Loop/recur, Destructuring, Symbol interning, and for and doseq macros.</p>
<p><a href="#lost-in-lambduhhs-podcast-l-jordan-miller">Lost in Lambduhhs Podcast: L. Jordan Miller</a><br>
Rejuvenate and streamline production of the <a href="https://linktr.ee/lambduhhh">Lost In Lambduhhs Podcast</a>, where the audience gets the opportunity to “meet the person behind the Github” -  illuminating the personal narratives and insights of tech luminaries, giving them a platform to share their perspectives while promoting their library or tool.<br>
<br>
 
<br>
 </p>
<h2 id="clj-merge-kurt-harriger">Clj-merge: Kurt Harriger</h2>
<p>Q2 2024 Report No. 2. Published July 1, 2024</p>
<h3 id="introduction">Introduction</h3>
<p>This tool aims to reduce unnecessary conflicts due to whitespace and syntax peculiarities by using a more semantic approach to diffing and merging. I&rsquo;m grateful for the support from ClojuristsTogether and the invaluable feedback and support from the Clojure community.</p>
<h3 id="recent-progress">Recent Progress</h3>
<p>This month, I focused on the following improvements:</p>
<ul>
<li><strong>Bug Fixes</strong>: Several bugs were fixed to enhance the stability of the tool.</li>
<li><strong>CI/CD Pipeline</strong>: A CI/CD pipeline was added to streamline the installation process and prevent additional regressions.</li>
<li><strong>Error Reporting</strong>: Simplified error reporting to make it easier for users to provide useful feedback when the tool does not work as expected.<br>
Due to an exceptionally busy schedule, progress on diff visualization and project promotion was limited.</li>
</ul>
<h3 id="milestones-overview">Milestones Overview</h3>
<p>The project was structured around several key milestones:</p>
<ol>
<li>Development of the MVP - Mostly complete</li>
<li>Enhancement of diff handling and presentation - Ongoing</li>
<li>Community engagement and feedback integration - Ongoing</li>
<li>Performance optimization and cross-platform compatibility - Done</li>
</ol>
<h3 id="milestone-progress">Milestone Progress</h3>
<ol>
<li>
<p><strong>Development of the MVP</strong></p>
<ul>
<li><strong>Goals</strong>: To create a minimal viable product using <code>editscript</code> and <code>rewrite-clj</code>.</li>
<li><strong>Recent Updates</strong>: Bug fixes were implemented to enhance the stability of the tool.</li>
<li><strong>Status</strong>: Mostly Complete. From a technical perspective I have been able to test the feasibility of the implementation and learned a lot. Its hard to say when this is &ldquo;done,&rdquo;  I don&rsquo;t quite feel ready to push the adoption until more work has been done on the diff visualization.</li>
</ul>
</li>
<li>
<p><strong>Enhancement of Diff Handling and Presentation</strong></p>
<ul>
<li><strong>Goals</strong>: To improve the readability and utility of diffs for developers.</li>
<li><strong>Recent Updates</strong>: Limited progress on diff visualization due to time constraints.</li>
<li><strong>Status</strong>: Much more work still needs to be done here.</li>
</ul>
</li>
<li>
<p><strong>Community Engagement and Feedback Integration</strong></p>
<ul>
<li><strong>Goals</strong>: To actively engage with the community to gather detailed feedback and real-world merge conflict examples.</li>
<li><strong>Recent Updates</strong>: Simplified error reporting to facilitate better feedback.</li>
<li><strong>Next Steps</strong>: Increase efforts to engage the community and aim to present at a Clojure meetup in the near future.</li>
</ul>
</li>
<li>
<p><strong>Performance Optimization and Cross-Platform Compatibility</strong></p>
<ul>
<li><strong>Goals</strong>: Simplify the installation process.</li>
<li><strong>Recent Updates</strong>: A CI/CD pipeline was added to streamline the installation process.</li>
<li><strong>Status</strong>: Done</li>
</ul>
</li>
</ol>
<h3 id="conclusion">Conclusion</h3>
<p>Thank you for your support and contributions to the clj-mergetool project.  <br></p>
<hr>
<h2 id="compojure-api-ambrose-bonnaire-sergeant">Compojure-api: Ambrose Bonnaire-Sergeant</h2>
<p>Q2 2024 Report No. 3. Published July 8, 2024</p>
<p>Last month I successfully <a href="https://github.com/metosin/compojure-api/compare/23b96cb7ac39180160cb8e967889aa03b1d7c119...master">added support</a>
for compojure-api 1.x coercions in the 2.x branch. This is one of the last steps towards backwards-compatibility of 1.x code using the 2.x branch.
I did not make any progress on this front this month, but the remaining steps are starting
to crystallize, which I will talk a bit about here.</p>
<p>Implementation wise, a 1.x coercion is detected with <code>fn?</code>, and implies the Schema backend (Spec support was addedin 2.x). Such a coercion is a nested function with the shape <code>request-&gt;field-&gt;schema-&gt;coercer</code>, often
often implemented like <code>(constantly nil)</code> or <code>(constantly {:body matcher})</code>.</p>
<p>Several insights during this 3-month project made backwards-compatibility particularly clean.</p>
<p>Once I grokked the main differences between 1.x and 2.x coercions at the end of month 2, I realized that
my efforts to restore support for ring-middleware-format was misguided. I could instead
translate 1.x coercions to muuntaja&rsquo;s expected format.</p>
<p>There are two steps to this. The first was to add support for &ldquo;legacy&rdquo; coercions in 2.x&rsquo;s coercion
abstraction. This involved changing the <code>coerce-request</code> implementation in <a href="https://github.com/metosin/compojure-api/compare/23b96cb7ac39180160cb8e967889aa03b1d7c119...master#diff-7267ec6276ef7f826245f8be37898dcaa3b2ce6915d1cede0abec0aba8f5935a">compojure.api.coercion.schema</a>.</p>
<p>The second step is to translate ring-middleware-format&rsquo;s <code>:format</code> options to muuntaja&rsquo;s <code>:formats</code>.
I have only done this for the default options, and currently any custom <code>:format</code> extensions do not work.</p>
<p>One wrinkle that is difficult to reconcile in all cases is that 2.x dropped implicit support for several coercion formats such as yaml. In order to maintain backwards compatibility with 1.x coercions, we want to ensure that yaml formats are supported by default for legacy coercions.</p>
<p>I have not completely solved this problem, but I identified that coercions are usually configured in terms of
the <code>api-defaults</code> var, which is a map with containing <code>:format</code> in 1.x and <code>:formats</code> in 2.x.
In both branches, I introduced a breaking change, renaming <code>api-default</code> to <code>api-defaults-v1</code> and <code>api-defaults-v2</code>
using <code>:format</code> and <code>:formats</code> respectively. This might help decide whether to include yaml coercion by default, but requires more thought.</p>
<p>Finally, I removed any attempt to add ring-middleware-format support in the 2.x branch since I realized it was unnecessary.</p>
<h3 id="recompojure">recompojure</h3>
<p>As part of this 3-month project, I am releasing a <a href="https://github.com/frenchy64/recompojure">recompojure</a>, which is a library providing compojure-style macros that expand to reitit.</p>
<p>It does not have a stable release yet, but there are some interesting problems to solve.</p>
<p>I worked on recompojure for the first month of this project, but stopped after I ported it out of a corporate repo I prototyped it in. I realized that compojure-api has a different set of features than reitit, and decided that my time would be better served working on compojure-api itself.</p>
<p>One big difference between reitit and compojure-api is reitit accepts a local configuration (<code>opts</code>) map
which compojure-api is extended using global state. To preserve this local configuration style, recompojure
is structured as a macro-generating-macro that is passed a top-level options map. An additional subtlety is
that this options map is needed at compile-time when compojure-api does most of its work.</p>
<p>For example, the <code>load-api</code> call here defines all the compojure-api macros such as <code>GET</code>, <code>POST</code>, <code>context</code>, etc., but their extensions can (eventually) be centralized in the <code>options</code> var. This attempts to
address a common concern using compojure-api where care must be taken to ensure extension are loaded before
any routing macros are expanded&mdash;this style should centralize extensions such that they are
deterministic without further safe guards.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">ns </span>com.recompojure.compojure-api1
  <span style="color:#e6db74">&#34;Exposes the API of compojure.api.core v1.1.13 but compiling to reitit.&#34;</span>
  (<span style="color:#e6db74">:require</span> [com.recompojure.compojure-api1.impl <span style="color:#e6db74">:as</span> impl]
            [clojure.set <span style="color:#e6db74">:as</span> set]))

(<span style="color:#66d9ef">def </span><span style="color:#f92672">^</span><span style="color:#e6db74">:private</span> options {<span style="color:#e6db74">:impl</span> <span style="color:#e6db74">:compojure-api1</span>})

(<span style="color:#a6e22e">impl/load-api</span> <span style="color:#f92672">`</span>options)
</code></pre></div><p>From here, I would like to add compojure-api 2.x support, and fully take advantage of the implicit options map
as described. The next big feature would be to reconcile compojure-api and reitit&rsquo;s middleware support
so that compojure-api-style applications can easily be translated to reitit via recompojure. In particular,
most compojure-api app use the <code>api</code> function to create an app, but recompojure does not yet support translating this to reitit.</p>
<h3 id="project-summary">Project Summary</h3>
<p>This 3-month project had two main focuses.</p>
<p>The first half concentrated on performance of the 2.x branch of compojure-api and ensuring stable versions
of security fixes were deployed.</p>
<p>My main goal for the second half of this 3-month project was to ease future maintenance of compojure-api by
retiring the 1.x branch. That way, features need only be developed in the 2.x branch and can
still be enjoyed by 1.x users.</p>
<p>This was much more challenging and onerous than I anticipated, and I would not have
been able to invest time in this if Clojurists Together had not funded the project.
My main activity was attempting to understand and compare two versions of the same project and reverse-engineer
the evolution of the project.</p>
<p>I&rsquo;d like to thank Clojurists Together for selecting this project for funding.  <br></p>
<hr>
<h2 id="enjure-janet-a-carr">Enjure: Janet A. Carr</h2>
<p>Q2 2024 Report. Published June 12, 2024</p>
<p>Progress has been good. I regularly stream Enjure to my audience on Twitch which seem to be bootstrapping Enjure&rsquo;s Github stars.</p>
<p>Despite the progress, I intentionally expanded the scope of the project by implementing an
HTTP router for Enjure. I&rsquo;m not entirely sure that this was a wise decision, but
it adheres to Enjure&rsquo;s guiding philosophy. Enjure&rsquo;s HTTP router is implemented
with a Radix tree and supports path parameters, in pure Clojure. I&rsquo;m hoping to come up with a scheme for query, body, path, and form coercion soon, but I
haven&rsquo;t decided on a scheme I like. The router lives in a dynamic var managed
by Enjure and is updated by macros for defining pages and controllers.</p>
<p>Enjure has several macros enforcing a similar convention to define HTTP resources.
The purpose of which brings together a resource&rsquo;s routes, contract, coercion and handling
expressions to a single namespace. Often Clojure web applications are structured with several
libraries. For example, Consider an application with Reitit with ring, next.jdbc with postgreSQL,
The application will likely have its routes in one namespace, it&rsquo;s handlers in another namespace,
its business logic in another namespace and data modification language (DML) in another namespace;
Necessitating opening several source files to accomplish a small task. Rarely do the
Routes, contracts, and handlers change. If they do, it&rsquo;s from minute changes.
Bringing these together cuts down on the cyclomatic complexity of developing web
Applications in Clojure. Thanks to homoiconicity, I can create constructs to help with
Exactly this:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; Example from Enjure repo</span>
(<span style="color:#a6e22e">defpage</span> user <span style="color:#e6db74">&#34;/users/:user-id&#34;</span>
  [req]
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:keys</span> [path-params]} req
        {<span style="color:#e6db74">:keys</span> [user-id]} path-params]
    (<span style="color:#a6e22e">format</span> <span style="color:#e6db74">&#34;&lt;h1&gt;Hello, %s&lt;/h1&gt;&#34;</span> user-id)))

</code></pre></div><p>This &ldquo;page&rdquo; construct is simply a function var under the hood, but also manages the routing-table
Var. There&rsquo;s no middleware required to update the routing table upon REPL reload. Simply evaluating
The buffer/namespace will change the routing table. defpage expects a string as its return value as
it&rsquo;s largely tied to the content-type text/html. In the future I hope to have other, similar view
constructs to support other popular application mime types.</p>
<p>Similarly, there are actions, changes, and removals that correspond to POST, PUT, and DELETE
HTTP methods, respectively. Since Enjure places a high emphasis on convention, I&rsquo;ll only show a
Simple example of a Sign In action for a user:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">defaction</span> signin <span style="color:#e6db74">&#34;/signin&#34;</span>
  [req]
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:keys</span> [email password]} (<span style="color:#e6db74">:form-params</span> req)]
    (<span style="color:#66d9ef">if </span>(<span style="color:#a6e22e">check-db</span> email password)
      (<span style="color:#a6e22e">redirect</span> pages/home <span style="color:#e6db74">:see-other</span>) <span style="color:#75715e">;; redirects to whatever route pages/home var has.</span>
      (<span style="color:#a6e22e">pages/siginin</span> req) <span style="color:#75715e">;; this is a page var to render</span>
  )))
</code></pre></div><p>Since resources in Enjure are just function vars, they can be called directly, and also reverse-routed
to using some of the response macros. In the above example, if the signing check passes, redirect
Redirects to whatever route pages/home has declared. (Reverse-routing is largely for convenience, and
Not mandatory, the redirect macro supports redirecting to static paths/URLs, Enjure resources like pages, and
Values from functions).</p>
<p>Ideally, resources would interact with the database through a data model supported by the framework.
My ideas for this are still experimental and can be found in the repository under the internal “frm”
namespace. Currently, it&rsquo;s some simple templating of basic queries by querying the information_schema in
Postgres, and interning the query functions as vars. These are queries I&rsquo;ve seen regularly over the years,
and I&rsquo;m sure that, once implemented, will give developers a boost in productivity. Plus, there&rsquo;s the added
benefit of being decoupled from whatever mechanism I choose for supporting migrations/entities in Enjure (still
A TBD). However, this model does not alienate developers who opt to create more complex queries
as those are supported as well with next.jdbc.</p>
<p>Another idea I&rsquo;ve been experimenting with is something I call the ReactiveRecord. ReactiveRecord uses
Software transactional memory to synchronize with the database, providing an in-memory DB representation.
I think given the functional interface provided by FRM above and information schema data. It might be interesting, but I do believe this kind of transacting might be faux-pas or even dangerous, so more thought is needed here on my part.</p>
<p>All of this will ideally be controlled with the Enjure CLI. Enjure puts a heavy emphasis on reducing
developer friction. Given a base installation of Clojure, installing Enjure should allow for the creation and
management of Enjure projects very easily. I&rsquo;ll admit this is an area I&rsquo;ve been slacking on a bit since I
wanted to finished with other core components first. As of writing this, the Enjure CLI has two basic commands:
Notes and help.  Notes search a project for comments containing NOTES, FIXME, TODO, and HACK. Help just
prints out the help dialog. Soon enough Enjure CLI will support creating and deleting resources, migrations,
Entities, dependencies, etc., as well as creating new projects. The Enjure CLI can already be installed to a user&rsquo;s path as a CLI utility written entirely in Clojure.</p>
<p>Finally, documentation of the project has become my lowest priority and definitely at risk. However, I&rsquo;m not too concerned about the documentation faltering. In some sense, I&rsquo;m a technical writer thanks to my blog, so I believe writing documentation for Enjure won&rsquo;t be as challenging as the rest of the project.  <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q2 2024 Report 3. Published June 30, 2024</p>
<p>Welcome back to another jank development update! For the past month, I&rsquo;ve been
pushing jank closer to production readiness primarily by working on multimethods
and by debugging issues with Clang 19 (currently unreleased). Much love to
<a href="https://www.clojuriststogether.org/">Clojurists Together</a> and all of my
<a href="https://github.com/sponsors/jeaye">Github sponsors</a> for their support this
quarter.</p>
<h3 id="multimethods">Multimethods</h3>
<p>I thought, going into this month, that I had a good idea of how multimethods
work in Clojure. I figured we define a dispatch function with <code>defmulti</code>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defmulti </span>sauce-suggestion <span style="color:#e6db74">::noodle-type</span>)
</code></pre></div><p>Then we define our catch-all method for handling types:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defmethod </span>sauce-suggestion <span style="color:#e6db74">:default</span> [noodle]
  (println <span style="color:#e6db74">&#34;You can&#39;t go wrong with some butter and garlic.&#34;</span>))
</code></pre></div><p>Then we define some specializations for certain values which come out of our
dispatch function.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defmethod </span>sauce-suggestion <span style="color:#e6db74">::shell</span> [noodle]
  (println <span style="color:#e6db74">&#34;Cheeeeeeeese!&#34;</span>))

(<span style="color:#66d9ef">defmethod </span>sauce-suggestion <span style="color:#e6db74">::flate-white-rice</span> [noodle]
  (println <span style="color:#e6db74">&#34;Hor fun gravy.&#34;</span>))
</code></pre></div><p>Then, when you call the <code>sauce-suggestion</code> function, first the dispatch
function is called and then the correct method is looked up and called.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">sauce-suggestion</span> {<span style="color:#e6db74">::noodle-type</span> <span style="color:#e6db74">::shell</span>})
Cheeeeeeeese!

(<span style="color:#a6e22e">sauce-suggestion</span> {<span style="color:#e6db74">::noodle-type</span> <span style="color:#e6db74">::spaghetti</span>})
You can<span style="color:#e6db74">&#39;t</span> go wrong with some butter and garlic.
</code></pre></div><p>This is as much as I knew. But wait, there&rsquo;s more!</p>
<h3 id="hierarchies">Hierarchies</h3>
<p>It turns out that multimethods match dispatch values based on a couple of
different hierarchies, too. If you&rsquo;re matching actual class types, like
<code>String</code>, you could have a method which is parameterized on <code>Object</code> and it will
be a catch-all. So this would allow you to match on everything which inherits
from <code>IRenderable</code>, for example, and then use that interface to render the
object. I wasn&rsquo;t concerned about this, since jank&rsquo;s object model isn&rsquo;t based on
inheritance. I figured I could leave this whole feature out of multimethods.</p>
<p>However, it turns out that Clojure supports another form of hierarchies! Even
crazier, we have full control over those hierarchies at run-time and we can
build as many as we want. Check this out.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">; We can classify spaghetti and penne as Italian.</span>
<span style="color:#75715e">; They will both be considered children of ::italian.</span>
(<span style="color:#a6e22e">derive</span> <span style="color:#e6db74">::spaghetti</span> <span style="color:#e6db74">::italian</span>)
(<span style="color:#a6e22e">derive</span> <span style="color:#e6db74">::penne</span> <span style="color:#e6db74">::italian</span>)

<span style="color:#75715e">; Then we can define a method based on the parent.</span>
(<span style="color:#66d9ef">defmethod </span>sauce-suggestion <span style="color:#e6db74">::italian</span> [noodle]
  (println <span style="color:#e6db74">&#34;Sugo al pomodoro.&#34;</span>))

<span style="color:#75715e">; This allows us to match multiple dispatch values in a</span>
<span style="color:#75715e">; deterministic and intuitive way.</span>
(<span style="color:#a6e22e">sauce-suggestion</span> {<span style="color:#e6db74">::noodle-type</span> <span style="color:#e6db74">::penne</span>})
Sugo al pomodoro.
</code></pre></div><p>There are a handful of related core functions for working with these
hierarchies. jank now implements all of them.</p>
<ul>
<li><code>make-hierarchy</code></li>
<li><code>isa?</code></li>
<li><code>parents</code></li>
<li><code>ancestors</code></li>
<li><code>descendents</code></li>
<li><code>derive</code></li>
<li><code>underive</code></li>
</ul>
<p>As I was implementing multimethods, I needed a few more core functions, so those
were all implemented as well:</p>
<ul>
<li><code>hash-set</code></li>
<li><code>disj</code></li>
<li><code>defmulti</code></li>
<li><code>alter-var-root</code></li>
<li><code>bound?</code></li>
<li><code>thread-bound?</code></li>
</ul>
<p>Notably, this includes <code>bound?</code>, which required me to actually create a
dedicated unbound var object so I could distinguish between unbound vars and
vars holding <code>nil</code>.</p>
<h3 id="clangllvm-19">Clang/LLVM 19</h3>
<p>Most of my time this past month was not spent developing new features for jank,
which is why I only have multimethods and 13 new functions to report. Instead,
my time was spent trying to get jank ported over to the latest Clang/LLVM
version, which will allow us to leave Cling behind. jank uses these for JIT
compiling C++ code and upgrading to the upstream Clang will unlock huge
performance wins, make compiling jank easier, and will allow for jank to follow
the bleeding edge of the native JIT space. However, before we get there, we have a
couple of bugs to get past.</p>
<h3 id="extern-templates">Extern templates</h3>
<p>The <a href="https://github.com/llvm/llvm-project/issues/97137">first bug</a>, which was causing JIT
linking issues, I reduced down to a simple test case involving an extern
template which is linked either in the current process or in a loaded shared
library. Clang will be unable to resolve the address of the definition of that
function. As it happens, the fmt library uses this pattern to provide some
optimized versions of certain templates. However, we can fortunately work around
this, since fmt wraps those definitions in a <code>FMT_HEADER_ONLY</code> preprocessor flag.
The relevant fmt source is <a href="https://github.com/fmtlib/fmt/blob/b61c8c3d23b7e6fdf9d44593877dba1c8a291be1/include/fmt/format.h#L4283">here</a>.</p>
<p>The process of narrowing this down from the entire jank runtime is cumbersome,
ruling out chunks of code at a time while still trying to keep things compiling
and correct.</p>
<h3 id="optimization-crash">Optimization crash</h3>
<p>This is the <a href="https://github.com/llvm/llvm-project/issues/95581">blocking bug</a>
preventing jank from switching to Clang. It only happens in release builds,
which also makes it harder to debug. This month, I traced the bug down from
a crash in jank all the way to a minimal test case involving assignments with an
implicit constructor. However, when testing whether or not the bug existed in
Clang 18, I found that it indeed did not. This meant that it&rsquo;s since been
introduced in the yet unreleased Clang 19. So I bisected around 1300 commits,
each time requiring a fresh Clang/LLVM compilation and taking ~30m. It was an
entire day of all 32 cores on my machine being busy compiling, but fortunately I
could script all of the hard work just using some bash. Bisecting allowed me to
find the commit which introduced the issue. This has yet to be fixed and I don&rsquo;t
have the expertise to know what&rsquo;s wrong with that commit, but I&rsquo;ve provided a
test case, pinged the relevant people, and now I&rsquo;m hoping the real experts can
come in for the save.</p>
<h3 id="clang-status">Clang status</h3>
<p>Aside form those two issues, only one of them being a blocker, the port to Clang
is ready. In debug builds (which avoid the second bug), jank can pass its full
test suite using Clang 19. Even better, some early benchmarking has shown that
Clang 19 is <strong>more than twice as fast</strong> as Cling when it comes to JIT compiling
large amounts of generated C++ code (such as all of <code>clojure.core</code>). That will
mean faster startup times and shorter REPL iteration loops.</p>
<h3 id="whats-next">What&rsquo;s next?</h3>
<p>Implementing multimethods identified a couple of issues related to certain
sequence types in jank which I&rsquo;m still investigating. Once those are sorted,
I&rsquo;ll continue working through the requirements to implement <code>clojure.test</code>,
which is why I was implementing multimethods in the first place. From there, I
can start testing my jank code using more jank code and the dogfooding cycle can
really begin. Stay tuned, folks!  <br></p>
<hr>
<h2 id="lost-in-lambduhhs-podcast-l-jordan-miller">Lost in Lambduhhs Podcast: L. Jordan Miller</h2>
<p>Q2 2024 Report 2. Published June 27, 2024.</p>
<p>I have made continued progress on my new podcast series, thanks to the support from Clojurists Together. Here are the key milestones I&rsquo;ve achieved since my last update and my plans moving forward:</p>
<h3 id="theme-music-and-audio-engineering">Theme Music and Audio Engineering</h3>
<ul>
<li><strong>Created Theme Music and Audio Engineering Template:</strong> Developed the theme music and an audio engineering template to ensure a consistent and professional sound for each episode.</li>
</ul>
<h3 id="riversidefm-proficiency">Riverside.fm Proficiency</h3>
<ul>
<li><strong>Learned Riverside.fm Editing Software:</strong> Gained proficiency in using Riverside.fm&rsquo;s editing software and created a workflow for efficiently editing audio.</li>
</ul>
<h3 id="episode-releases">Episode Releases</h3>
<ul>
<li><strong>Released Two Episodes:</strong>
<ul>
<li>David Nolan</li>
<li>Arne Brasseur</li>
</ul>
</li>
</ul>
<h3 id="guest-coordination-and-diversity-efforts">Guest Coordination and Diversity Efforts</h3>
<ul>
<li><strong>Gender Diversity Challenge:</strong> I am striving to ensure gender diversity in my episodes, which has been challenging.</li>
<li><strong>Reached Out to Prospective Guests:</strong> Contacted three prospective guests, with two having returned my communications.</li>
</ul>
<h3 id="recent-challenges">Recent Challenges</h3>
<ul>
<li><strong>Scheduling Conflicts:</strong> Faced scheduling conflicts due to a death in my family followed by getting sick with strep throat. I am now on day 8 of recovering from the sickness and have recordings scheduled for next week.</li>
</ul>
<h3 id="next-steps">Next Steps</h3>
<ul>
<li><strong>Continue Outreach:</strong> Continue to reach out to schedule recordings, ensuring a diverse lineup of guests.</li>
<li><strong>Timely Editing and Release:</strong> Edit and release episodes in a timely manner, promoting on Clojurians Slack, Clojure Weekly updates, LinkedIn, and Twitter.</li>
<li><strong>Expand Promotion Channels:</strong> Create a Mastodon account to help promote the podcast.</li>
</ul>
<h3 id="conclusion-1">Conclusion</h3>
<p>Despite recent challenges, I am on track with my project timeline and excited about the content I am creating. I will continue to provide updates as I progress further.  <br></p>
<hr>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for Proposals. June 2024 Member Survey</title>
      <link>https://www.clojuriststogether.org/news/call-for-proposals.-june-2024-member-survey/</link>
      <pubDate>Fri, 12 Jul 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-proposals.-june-2024-member-survey/</guid>
      <description>We are awarding up to $44K for Q3 2024 Projects</description>
      <content:encoded><![CDATA[<br>
<p>Happy July! It&rsquo;s that time again.</p>
<p>Clojurists Together is pleased to announce that we are opening our Q3 2024 funding round for Clojure Open Source Projects.  Applications will be accepted through the 26th of July 2024 (midnight Pacific Time). We are looking forward to reviewing your proposals! <a href="https://clojuriststogether.org/open-source/">More information and the application can be found here.</a></p>
<p>We will be awarding up to $44,000 USD for a total of 6-8 projects. The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established. Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed. We expect projects to start on Sept. 1, 2024.</p>
<p>We surveyed our members again in June to find out what types of initiatives they would like us to focus on for this round of funding. Their responses are summarized below. In particular, it was great to see members' feedback relating to how often they used or referred to developers' work we have funded. Also noted that several of you plan to attend Heart of Clojure in Belgium in Sept. and Clojure/Conj in the US in October. Check this out!</p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/b50b3f96-8457-4b50-9642-c5686b4cb704" alt="Usage by Members June 2024"></p>
<p>If you are working on a Clojure open source project or have a new one in mind, especially one mentioned as a focus area for our members, consider applying. Or if you know someone that might be interested, please pass this information along. Let&rsquo;s get the word out!  If you have questions, please contact Kathy Davis at <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a>.</p>
<h2 id="our-members-speak-feedback-from-the-june-2024-survey">Our Members Speak: Feedback from the June 2024 Survey.</h2>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/aa87c6a7-8fba-4751-b407-ff46e5b16d9a" alt="Platform June 2024"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/02e23b62-4756-49bb-b522-16c68fb1c98d" alt="Clojure June 2024"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/7f066fcf-4b2d-4157-bc0a-88533059089e" alt="Clojurscript June 2024"></p>
<hr>
<h3 id="what-other-information-would-you-like-to-know-about-clojurists-together-and-the-work-we-fund">What other information would you like to know about Clojurists Together and the work we fund?</h3>
<ul>
<li>Your updates have been great. The current amount of information is good.</li>
<li>A roadmap of where clojurists together wants to go/grow to.</li>
<li>It&rsquo;d be great to learn about your decision making-process (which is so fruitful)!</li>
<li>I&rsquo;d like to know more about your approach to supporting new contributors and people from underrepresented groups.  <br></li>
</ul>
<hr>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<ul>
<li>Although this doesn&rsquo;t affect me personally, it is always good to make it easier for newcomers, so may some articles/documentation aimed at them, and maybe support for things like Kit Framework so they can get going quickly. (4 comments)</li>
<li>A better test framework than clojure.test but ideally mostly compatible with current tooling. The implementation of clojure.test is borderline unreadable.</li>
<li>AI copilots specific to clojure libraries</li>
<li>Cloud deployment patterns &amp; tooling</li>
<li>JVM/Clojure runtime has seen catch up with the JDK platform, but ClojureScript runtime seems to be a bit &ldquo;stuck&rdquo;, which makes me worried.</li>
<li>Clojure Editor integrations</li>
<li>ClojureDart, auth libs for web apps</li>
<li>Fairly bare-to-the-metal visualization. I&rsquo;m still using Oz (vega, vega-lite), but it is not maintained. I am not that much interested in hanami, which is its own metalanguage on top of vega-lite, and I think cloj-viz wants to build on top of hanami again. At least oz I can debug by looking at vega/vega-lite code.</li>
<li>3rd Party Libraries, some of which have merges for fixes but no releases!</li>
<li>Structural editing</li>
<li>I&rsquo;d love access to ClojureScript debugging within Emacs</li>
<li>Data-science</li>
<li>Making simple things easy, like Rails does.</li>
<li>Calva support for simultaneous clojure+clojurescript from the same workspace</li>
<li>Test tooling</li>
<li>I was recently looking at test.check and clojure.spec.alpha and was having some trouble figuring out how (if at all) the two are related? Maybe some unification of these two concepts?</li>
<li>The usual issues that crop up every year, like getting newcomers, error messages, and community engagement. Core team output feels stagnant; nothing in 1.12 feels worthy of a major release. Plus, it seems like Clojure is falling behind in just keeping up with changes to Java.</li>
<li>Marketing. Rich&rsquo;s seminal talks were a fantastic advert for Clojure, but the tech market is fickle and nothing has really stepped in to replace these to attract companies in a position to create jobs.</li>
<li>Library maintenance</li>
<li>Documentation is still horrible for most libraries in the ecosystem. <br></li>
</ul>
<hr>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong? </h3>
<ul>
<li>Core language itself</li>
<li>Stability has been great (4).</li>
<li>Expertise is strong - but especially on Slack, where it is quickly swept under the tide of time. Slack has some very patient people with great advice. The design work that went into the language is showing it&rsquo;s benefit.</li>
<li>Good community, good tools and libraries developed by talented and experienced people, with a preference towards stability and backwards compatibility. Community is strong and welcoming. Documentation is there (though often in not always obvious places).</li>
<li>Babashka and it&rsquo;s ecosystem</li>
<li>The libraries and general &ldquo;can get things done with the language&rdquo; abilities are super-strong.</li>
<li>Web development</li>
<li>Interactive developer tooling  <br></li>
</ul>
<hr>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>(Number of mentions in parentheses):</p>
<ul>
<li>Cider (8)</li>
<li>Malli (6)</li>
<li>Shadow-cljs (5) </li>
<li>Clj-kondo (5)</li>
<li>Calva (4)</li>
<li>Reiti (4)</li>
<li>Ring (3)</li>
<li>Babashka, Biff, buddy, cljfmt, clj-reload, Clojure-lsp, ClojureDart, Donut, Flowstorm, Re-frame (each 2)</li>
<li>Async, badspreadsheet, Carmine cluster support, Clay, Clojure-spec, Clojure-ts mode, Cloverage, Conjure, Data Analysis processing framework, Datalevin, DataScript, Datasplash, Dtype-next, eMac, Fastmath, Fulcro, Hanami, Hanamicloth,  HoneySQL, HTMX projects, Humble UI, Jank, Kindly,  Langohr, Leinigen, libpython-clj, Metamorph.mi, nbb, Neanderthal, Neovim, next.jdbc, Noj, Parinfer, Pedestal, Polylith, Portal, Regeant, Reframe, ring-jetty9-adapter, SciCloj, Scittle, Spandex, Tablecloth, Tech.ml.dataset, uix, VIM integrations, All things Borkdude, Taoensso &amp; Weavejester&rsquo;s projects (each 1)</li>
<li>I am very impressed by ClojureScript. With that said, I have been reading about unpoly and htmx of late. I&rsquo;m not sure if it is a fad or not at this point, but it would be interesting to highlight if we have any special advantages or integrations between Clojure and these frameworks. I especially like the &ldquo;hypermedia first&rdquo; narrative that htmx is pushing.</li>
<li>The data-science thing.  Datascript&rsquo;s core insofar as it is reused in Datalevin. Datalevin might not be looking for funding, but it is(?) the obvious heir to the Datomic popular revolution (FOSS triple-store replacing SQL+Lucene without time-travel) and thus has the potential to bring lots of attention as the SQL ball-and-chain is finally clipped from developers' ankles.</li>
<li>Mac version (M1+ apple). It&rsquo;s a great base for high-performance computing</li>
<li>Some level of ClojureScript debugging support that could also work when developing for nbb via nrepl</li>
<li>I would like the bi-quarterly updates to include a one line description of what the project is and a link to its website, before describing all that work that was done - to set the scene. Don&rsquo;t assume we know (and remember) all the cool Clojure projects.  <br></li>
</ul>
<hr>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h3>
<ul>
<li>Better AI / ML story</li>
<li>Maturing of the data-science stack</li>
<li>Coordinate more around certain standards like biff.</li>
<li>For 3rd party libraries that have commits, but no releases, or even open pull releases to fix issues are released!</li>
<li>kotlin interop, scala interop</li>
<li>Get rid of the perceived lack of adoption, bring companies before the curtain who use Clojure.</li>
<li>Helping innovation like squintjs/cherry, or something similar, to strengthen the ClojureScript runtime story.</li>
<li>CT has funded people to be present on Slack and share expertise. A live answer is very nice, but the goodness will diminish as soon as funding stops, and completely vanish if Slack ceases to renew the free enterprise status. In a word, when the music stops there will not even be records to replay. What is a potential solution?</li>
<li>I notice many of the questions recur, over and over and over again. They are literally FAQs. Could CT encourage contributing to a FAQ?</li>
<li>ClojureDart will be big: very big. As a toy, it is already impressive. My app came out super on mobile phones &amp; tolerable as a website, totally bypassing the self-inflicted agonies of Javascript. CLJD is still missing a few key things - or maybe just multimethods - that a lot of Clojure software depends on.  Soon as that obstacle is past, I predict a tsunami of interest in CLJD-adapted CLJC of many Clojure libraries.  Clojurists Together may have a part in adapting long-stable libraries, in service of possibly really putting Clojure &lsquo;on the map&rsquo;, leapfrogging the labor quagmire of JS/CLJS while reusing tons of software already written for the JVM/JS hosts!&quot;</li>
<li>The Clojure community is already pretty great. I think we must just continue to be a friendly community and continue to help each other and newcomers on Slack and AskClojure. Efforts like Clojurists Together is a wonderful way to support developers that work on important open source tools and libraries. Keep up the good work!</li>
<li>Attracting newcomers &amp; find out what bumps are in onboarding . More advocacy and uptake of the language, I sense a lull not only due to the economy, but also due to Rich&rsquo;s retirement.  How can we grow the Clojure userbase?</li>
<li>Maybe more focus on getting started quickly for new Clojure projects? I am not sure exactly how, but maybe docker images or nix integrations that are just dead simple. I don&rsquo;t honestly have the answers here, but I think that a lot of people just dismiss Clojure because it has somewhat of a learning and setup cost. I think if you can just get it in front of people quickly then you can quickly impress them with language feature/design choices, but you have to get them to look at it. Getting started was a little easier then we could slowly grow our ranks a little more.</li>
<li>I&rsquo;m personally not a fan of the community going to deps. Kind of feels like if the Java community moved back to ant.</li>
<li>Better transparency over the current state of Clojure libraries.  Are they being actively maintained?  Do they have stale dependencies that might have security issues?</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>April and May 2024 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/april-and-may-2024-short-term-project-updates/</link>
      <pubDate>Mon, 03 Jun 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/april-and-may-2024-short-term-project-updates/</guid>
      <description>Updates from clj-lmerge, Compojure-api, Instaparse, Jank, Plexus, Lost in Lambduhhs Podcast, Scicloj</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve got several updates to share from our Q1 and Q2 project developers. Check out the latest in their April and May reports.</p>
<p><a href="#clj-merge-kurt-harriger">clj-merge tool: Kurt Harriger</a><br>
<a href="#compojure-api-ambrose-bonnaire-sergeant">Compojure-api: Ambrose Bonnaire-Sergeant</a><br>
<a href="#instaparse-mark-engelberg">Instaparse: Mark Engelberg</a><br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
<a href="#plexus-john-collins">Plexus: John Collins</a><br>
<a href="#lost-in-lambduhhs-podcast-l-jordan-miller">Lost in Lambduhhs Podcast: L. Jordan Miller</a><br>
<a href="#scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</a><br>
<br>
 
<br>
 </p>
<h2 id="clj-merge-kurt-harriger">Clj-merge: Kurt Harriger</h2>
<p>Q2 2024 Report No. 1. Published May 15, 2024</p>
<h3 id="introduction">Introduction</h3>
<p>This tool aims to reduce unnecessary conflicts due to whitespace and syntax peculiarities by using a more semantic approach to diffing and merging. I&rsquo;m grateful for the support from ClojuristsTogether and the invaluable feedback and support from the Clojure community.</p>
<h3 id="milestones-overview">Milestones Overview</h3>
<p>The project was structured around several key milestones:</p>
<ol>
<li>Development of the MVP.</li>
<li>Enhancement of diff handling and presentation.</li>
<li>Community engagement and feedback integration.</li>
<li>Performance optimization and cross-platform compatibility.</li>
</ol>
<h3 id="milestone-progress">Milestone Progress</h3>
<ol>
<li>
<p><strong>Development of the MVP</strong></p>
<ul>
<li><strong>Goal</strong>: To create a minimal viable product using <code>editscript</code> and <code>rewrite-clj</code>.</li>
<li><strong>Progress</strong>: The MVP was successfully developed and demonstrated its capability in resolving basic merge conflicts. Initially, extensive diffs suggested a complete rewrite of <code>editscript</code> might be necessary. However, implementing isomorphic translations between <code>rewrite-clj</code> node representations proved to be a sufficient workaround for now.</li>
<li><strong>Next Steps</strong>: The focus will now shift towards refining this MVP, enhancing its error handling, and improving the user feedback system to make the tool more robust.</li>
</ul>
</li>
<li>
<p><strong>Enhancement of Diff Handling and Presentation</strong></p>
<ul>
<li><strong>Goal</strong>: To improve the readability and utility of diffs for developers.</li>
<li><strong>Progress</strong>: The generated diffs are more machine-readable than human-readable, early use of the tool has underscored the importance of easily interpretable diffs emphasizing the need for better visualization.</li>
<li><strong>Next Steps</strong>: I plan to continue working on improving the presentation of diffs, making them easier to understand and act upon.</li>
</ul>
</li>
<li>
<p><strong>Community Engagement and Feedback Integration</strong></p>
<ul>
<li><strong>Goal</strong>: To actively engage with the community to gather detailed feedback and real-world merge conflict examples.</li>
<li><strong>Progress</strong>: Some feedback and bug reports have been received, such as an &ldquo;index out of range&rdquo; error; however, collecting comprehensive examples has proved challenging.</li>
<li><strong>Next Steps</strong>: I aim to increase efforts to engage the community and hope to present at one of the clojure meetups in the near future.</li>
</ul>
</li>
<li>
<p><strong>Performance optimization and cross-platform compatibility</strong></p>
<ul>
<li><strong>Goal</strong>: Simplify the installation process</li>
<li><strong>Progress</strong>: The project has been successfully compiled with GraalVM for fast startup. However, these are built during the install process and require GraalVM to be available at install.</li>
<li><strong>Next Steps</strong>: CICD process to publish the binaries for download.</li>
</ul>
</li>
</ol>
<h3 id="future-vision-and-calls-to-action">Future Vision and Calls to Action</h3>
<p>Moving forward, enhancing diff visualization will be my primary focus. A more intuitive representation of changes will not only improve the tool&rsquo;s usability but also its adoption. I encourage everyone in the Clojure community to try clj-mergetool, especially in challenging merge scenarios, and share any issues or feedback. Your contributions are crucial for refining the tool and expanding its capabilities.</p>
<p>Thank you for your continued support and contributions to the clj-mergetool project. <br></p>
<hr>
<h2 id="compojure-api-ambrose-bonnaire-sergeant">Compojure-api: Ambrose Bonnaire-Sergeant</h2>
<p>Q2 2024 Report No. 1 &amp; 2. Published April 30 &amp; June 7, 2024</p>
<h3 id="report-1-april-2024">Report 1: April 2024</h3>
<h3 id="ring-swagger">ring-swagger</h3>
<p>I have released ring-swagger 1.0.0, compojure-api 1.1.14 and 2.0.0-alpha33
which all include a critical fix to prevent <a href="https://github.com/metosin/compojure-api/issues/454">this memory leak</a>.</p>
<p>Rajkumar Natarajan proposed <a href="https://github.com/metosin/ring-swagger/pull/150">OpenAPI3 support</a> and I have been reviewing it.</p>
<h4 id="100-3042024">1.0.0 (30.4.2024)</h4>
<ul>
<li>Fix memory leaks via multimethods caching default dispatch values: <a href="https://github.com/metosin/compojure-api/issues/454">https://github.com/metosin/compojure-api/issues/454</a><br>
<br>
 </li>
</ul>
<h3 id="compojure-api">compojure-api</h3>
<p>My two main focuses with compojure-api have been to make 2.x backwards compatible with 1.x
and implement performance improvements.</p>
<p>I have drafted some further performance ideas as <a href="https://github.com/metosin/compojure-api/issues">issues</a>
and the remaining tasks for 1.x compatilibity are <a href="https://github.com/metosin/compojure-api/issues/462">here</a>.</p>
<h4 id="200-alpha33-2024-04-30">2.0.0-alpha33 (2024-04-30)</h4>
<ul>
<li>Throw an error on malformed <code>:{body,query,headers}</code>, in particular if anything other than 2 elements was provided</li>
<li>Disable check with <code>-Dcompojure.api.meta.allow-bad-{body,query,headers}=true</code></li>
<li>50% reduction in the number of times <code>:{return,body,query,responses,headers,coercion,{body,form,header,query,path}-params}</code> schemas/arguments are evaluated/expanded</li>
<li>saves 1 evaluation per schema for static contexts
<ul>
<li>saves 1 evaluation per schema, per request, for dynamic contexts</li>
</ul>
</li>
<li>Fix: Merge <code>:{form,multipart}-params</code> <code>:info :public :parameters :formData</code> field at runtime</li>
<li>Add <code>:outer-lets</code> field to <code>restructure-param</code> result which wraps entire resulting form</li>
<li>Remove <code>static-context</code> macro and replace with equivalent expansion without relying on compojure internals.</li>
<li>Upgrade to ring-swagger 1.0.0 to fix memory leaks</li>
</ul>
<h4 id="200-alpha32-2024-04-20">2.0.0-alpha32 (2024-04-20)</h4>
<ul>
<li>Fix empty spec response coercion. <a href="https://github.com/metosin/compojure-api/issues/413">#413</a></li>
<li>Add back <code>defapi</code> (and deprecate it)</li>
<li>Remove potemkin <a href="https://github.com/metosin/compojure-api/issues/445">#445</a></li>
<li>Add back <code>compojure.api.routes/create</code></li>
<li>Add back <code>middleware</code> (and deprecate it)</li>
<li>Make <code>context</code> :dynamic by default</li>
<li>Add <code>:static true</code> option to <code>context</code></li>
<li>Add static context optimization coach
<ul>
<li><code>-Dcompojure.api.meta.static-context-coach=print</code> to print hints</li>
<li><code>-Dcompojure.api.meta.static-context-coach=assert</code> to assert hints</li>
</ul>
</li>
<li>port unit tests from midje to clojure.test</li>
</ul>
<h3 id="report-2-may-2024">Report 2: May 2024</h3>
<h3 id="compojure-api-1">compojure-api</h3>
<p>This month I concentrated on making compojure-api 2.x backwards compatible with 1.x.
I approached this by both backporting features to the 1.x branch and reestablishing 1.x features
in the 2.x branch. My hope is when feature-parity is achieved, I can release a stable 2.x
and retire the 1.x branch.</p>
<p>This proved to be challenging and resulted in many false starts. The main success this month
was <a href="https://github.com/metosin/compojure-api/commit/113263b05c4ecb5b63fe187a2e1830377d9b54b5">adding support for 1.x coercions in 2.x</a>.</p>
<p>My initial conceptualization of the problem was that the move from ring-middleware-format
to muuntaja in 2.x was the main breaking change, and backwards compatbility would involve
restoring ring-middleware-format support in the 2.x branch. I am reexaminining this assumption,
as I realized I conflated 1.x coercions with ring-middleware-format after successfully adding
1.x coercions in 2.x, however this assumption directed most of my development this month.</p>
<p>I initially copied the 1.x test suite to the 2.x branch and attempted to directly change the 2.x
branch until the tests pass. This proved overwhelming and highlighted that I did not deeply understand
compojure-api&rsquo;s internals. I <a href="https://github.com/metosin/compojure-api/pull/461">abandoned this approach</a>.</p>
<p>To better understand the changes from 1.x to 2.x, I <a href="https://github.com/metosin/compojure-api/pull/471">created a PR</a>
to compare the 1.x and 2.x branches. Using this PR, I <a href="https://github.com/metosin/compojure-api/compare/981c316b3de6d27ff1cbaedd93c20aa6bb13ebe2...8d3c17db11a5a70f287e63501dd8220348401d5d">backported</a>
many of the changes made in 2.x to 1.x until the major refactoring around coercions was the main difference.</p>
<p>From there, I <a href="https://github.com/metosin/compojure-api/pull/473">attempted to backport 2.x coercions into 1.x</a>. This proved very difficult to reason about
since the code paths around coercion completely changed in 2.x.</p>
<p>It was a useful exercise, however, and I realized that 1.x coercions could unintrusively be <a href="https://github.com/metosin/compojure-api/pull/473">added to 2.x</a>,
which was a key stumbling block in my initial attempts at having the 1.x test suite pass in the 2.x branch.</p>
<p>Next month I&rsquo;m planning to continue on backwards compatibility. I think I may not need to add ring-middleware-format support which addresses <a href="https://github.com/metosin/compojure-api/issues/462#issuecomment-2074255931">a user concern</a>, so I will probably back out any ring-middleware-format related changes I added in 2.x.</p>
<ul>
<li><a href="https://github.com/metosin/compojure-api/issues/472">#472</a>: I found and fixed a potential memory leak in compojure-api 2.x</li>
<li><a href="https://github.com/metosin/compojure-api/commit/2577f7454608ddca22083bf742d69a960a12c674">Upgraded to spec-tools 0.10.6</a> and compensated for upstream changes</li>
<li><a href="https://github.com/metosin/compojure-api/commit/80b524b6d79ca6a29462e508a9e602ae44cff69e">Fixed outdated docstring</a> around 2.x coercions that described 1.x coercions  <br></li>
</ul>
<hr>
<h2 id="instaparse-mark-engelberg">Instaparse: Mark Engelberg</h2>
<p>Q1 2024 Report 2. Published May 31, 2024</p>
<p>Thanks to funding from Clojurists Together, I have continued to review instaparse pull requests that have been submitted over the past couple of years.</p>
<p>The most interesting and useful issue, which had languished among the pull requests for over two years, was a suggestion to incorporate namespaced non-terminals, so I am pleased to report that this feature has now been implemented, tested, documented, and deployed in instaparse version 1.5.0. The pull request wasn&rsquo;t quite usable out of the box, as it relied on a feature unique to Clojure 1.11, and I always strive for instaparse to be backwards compatible to Clojure 1.5. But it provided a great starting point for implementation. I think the community will find this feature to be useful.</p>
<p>For the final third of my Clojurists Together time, I have my eye on a bug with negative lookahead that was discovered shortly after instaparse&rsquo;s initial release. It&rsquo;s something I have always wanted to fix, but have never had the time to solve it as the problem is quite subtle, and any fix will require in-depth testing since it could have wider ramifications.  <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q2 2024 Reports 1&amp;2. Published April 30 &amp; May 31, 2024</p>
<h3 id="report-1-april-30-2024">Report 1: April 30, 2024</h3>
<p>This quarter, I&rsquo;m being funded by <a href="https://www.clojuriststogether.org/">Clojurists Together</a>
to build out jank&rsquo;s lazy sequences, special <code>loop*</code> form, destructuring, and
support for the <code>for</code> and <code>doseq</code> macros. Going into this quarter, I had only a
rough idea of how Clojure&rsquo;s lazy sequences were implemented. Now, a month in,
I&rsquo;m ready to report some impressive progress!</p>
<h3 id="lazy-sequences">Lazy sequences</h3>
<p>There are three primary types of lazy sequences in Clojure. I was planning on
explaining all of this, but, even better, I can shine the spotlight on
<a href="https://blog.brunobonacci.com/2023/09/08/buffered-sequences/">Bruno Bonacci&rsquo;s blog</a>,
since he&rsquo;s covered all three of them very clearly. In short, we have:</p>
<ol>
<li>Per-element lazy sequences</li>
<li>Chunked lazy sequences</li>
<li>Buffered lazy sequences</li>
</ol>
<p>This month, I have implemented per-element lazy sequences, along with partial
support for chunked lazy sequences. Chunked lazy sequences will be finished next
month. By implementing even per-element lazy sequences, so many new
opportunities open up. I&rsquo;ll show what I mean by that later in this post, so
don&rsquo;t go anywhere!</p>
<h3 id="loop">Loop</h3>
<p>Prior to this month, jank supported function-level <code>recur</code>. As part of this
month&rsquo;s work, I also implemented <code>loop*</code> and its related <code>recur</code>. When we look at
how Clojure JVM implements <code>loop*</code>, it has two different scenarios:</p>
<ol>
<li>Expression loops</li>
<li>Statement loops</li>
</ol>
<p>If a loop is in a statement position, Clojure JVM will code-generate labels with
goto jumps and local mutations. If the loop is an expression, Clojure JVM
generates a function around the loop and then immediately calls that. There is
<em>potentially</em> a performance win of not generating the function wrapper and
calling it right away, but note that this particular idiom is commonly
identified and elided by optimizing compilers. It even has its own acronym:
<a href="https://en.wikipedia.org/wiki/Immediately_invoked_function_expression">IIFE</a>.
(see <a href="https://rigtorp.se/iife/">this</a> also)</p>
<p>jank, for now anyway, simplifies this by always using the IIFE. It does it in a
more janky way, though, which is interesting enough that I&rsquo;ll share it with you
all. Let&rsquo;s take an example <code>loop*</code> (note that the special form of <code>loop</code> is
actually <code>loop*</code>, same as in Clojure; <code>loop</code> is a macro which provides
destructuring on top of <code>loop*</code> &ndash; now you know):</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">loop*</span> [x <span style="color:#ae81ff">0</span>]
  (when (&lt; x <span style="color:#ae81ff">10</span>)
    (println x)
    (<span style="color:#a6e22e">recur</span> (inc x))))
</code></pre></div><p>Given this, jank will replace the <code>loop*</code> with a <code>fn*</code> and just use function
recursion. Initial loop values just get lifted into parameters. The jank compiler
will transform the above code into the following:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">((<span style="color:#a6e22e">fn*</span> [x]
   (when (&lt; x <span style="color:#ae81ff">10</span>)
     (println x)
     (<span style="color:#a6e22e">recur</span> (inc x)))) <span style="color:#ae81ff">0</span>)
</code></pre></div><p>jank code-generates function recursion into a <code>while(true)</code> loop with mutation on some
locals for each iteration, similar to Clojure.</p>
<p>However, <code>loop*</code> is tricky, since it can also do anything <code>let*</code> can do. For
example (also note: no recursion):</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">loop*</span> [a <span style="color:#ae81ff">1</span>
        b (* <span style="color:#ae81ff">2</span> a)]
  (println a b))
</code></pre></div><p>Since we&rsquo;re using <code>a</code> in the binding for <code>b</code>, we can&rsquo;t know <code>b</code> until we&rsquo;ve
calculated <code>a</code>, and doing so can involve any arbitrary expression. Agh! This
can&rsquo;t work if we just dump those into the positional parameters of the IIFE. So
jank gets around this by actually just wrapping it in a <code>let*</code>. 🙃</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">let*</span> [a <span style="color:#ae81ff">1</span>
       b (* <span style="color:#ae81ff">2</span> a)]
  ((<span style="color:#a6e22e">fn*</span> [a b]
    (println a b)) a b))
</code></pre></div><p>This could be done in a macro, but since it&rsquo;s a language-level feature, the
compiler does it for us. This means you can still use <code>loop*</code> even if you&rsquo;re
running without <code>clojure.core</code>. As mentioned, this is potentially slower, in the
scenario of the loop being in statement position. We can return to this when the
performance of loops is the most important thing to tackle. Right now, parity
with Clojure and getting jank onto your machine are most important.</p>
<h3 id="destructuring">Destructuring</h3>
<p>Clojure supports all kinds of fancy destructuring of sequences, maps, and
keyword arguments. We use destructuring in <code>let</code>, <code>defn</code>, and <code>loop</code>, primarily. One
interesting thing about this destructuring is that there&rsquo;s no compiler support
for it at all; it&rsquo;s not a language-level feature. It&rsquo;s a library feature, done
entirely in macros. The amazing thing about it is that, as long as we support
all of the core functions required, we can support destructuring. The actual
<code>destructure</code> function is huge, but you can see it in Clojure&rsquo;s source
<a href="https://github.com/clojure/clojure/blob/06d450895e2d4028afaa4face17f8e597c772a24/src/clj/clojure/core.clj#L4417-L4511">here</a>.</p>
<p>This month, I implemented all of the missing functions required for
the <code>destructure</code> function to be ported over to jank. Largely, once all those
functions were implemented, the port just meant updating Java interop in a few
places to be C++ interop. Now jank supports all of the fancy destructuring
Clojure does, in all the same places. This helps demonstrate how much closer
jank is to being a complete Clojure dialect, since complex functions like this
can <em>almost</em> just work.</p>
<h3 id="new-clojurecore-functions">New clojure.core functions</h3>
<p>So, to support lazy sequences and destructuring, I needed to add several new
core functions. While adding those, I tended toward implementing any similar or
surrounding functions as well. I got a little carried away, to be honest. Let&rsquo;s
take a look at the new functions jank now supports.</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>take</code>  (no transducer)</td>
<td><code>cycle</code></td>
</tr>
<tr>
<td><code>take-while</code> (no transducer)</td>
<td><code>repeat</code></td>
</tr>
<tr>
<td><code>drop</code> (no transducer)</td>
<td><code>seq?</code></td>
</tr>
<tr>
<td><code>filter</code> (no transducer)</td>
<td><code>concat</code></td>
</tr>
<tr>
<td><code>identity</code></td>
<td><code>-&gt;</code></td>
</tr>
<tr>
<td><code>constantly</code></td>
<td><code>-&gt;&gt;</code></td>
</tr>
<tr>
<td><code>into</code> (no transducer)</td>
<td><code>cond-&gt;</code></td>
</tr>
<tr>
<td><code>mapv</code></td>
<td><code>zipmap</code></td>
</tr>
<tr>
<td><code>filterv</code></td>
<td><code>last</code></td>
</tr>
<tr>
<td><code>reduce</code></td>
<td><code>butlast</code></td>
</tr>
<tr>
<td><code>nthrest</code></td>
<td><code>map?</code></td>
</tr>
<tr>
<td><code>nthnext</code></td>
<td><code>key</code></td>
</tr>
<tr>
<td><code>partition</code></td>
<td><code>val</code></td>
</tr>
<tr>
<td><code>partition-all</code></td>
<td><code>dissoc</code></td>
</tr>
<tr>
<td><code>partition-by</code></td>
<td><code>ident?</code></td>
</tr>
<tr>
<td><code>dorun</code></td>
<td><code>simple-ident?</code></td>
</tr>
<tr>
<td><code>doall</code></td>
<td><code>qualified-ident?</code></td>
</tr>
<tr>
<td><code>when-let</code></td>
<td><code>boolean</code></td>
</tr>
<tr>
<td><code>when-some</code></td>
<td><code>nth</code></td>
</tr>
<tr>
<td><code>when-first</code></td>
<td><code>loop</code></td>
</tr>
<tr>
<td><code>split-at</code></td>
<td><code>peek</code></td>
</tr>
<tr>
<td><code>split-with</code></td>
<td><code>pop</code></td>
</tr>
<tr>
<td><code>drop-last</code></td>
<td><code>for</code></td>
</tr>
<tr>
<td><code>take-last</code></td>
<td><code>chunk-buffer</code></td>
</tr>
<tr>
<td><code>chunk-append</code></td>
<td><code>destructure</code></td>
</tr>
</tbody>
</table>
<p>That&rsquo;s 52 new functions/macros! That alone amounts to around 10% of all the
functions in <code>clojure.core</code> jank will be implementing. A few of these will need
some updates once jank fully supports chunked lazy sequences and transducers,
but they&rsquo;re all very usable today. You may also note that <code>for</code> is in there,
which was one of the goals this quarter.</p>
<h3 id="migration-from-cling-to-clang">Migration from Cling to Clang</h3>
<p>jank is much closer to running on Clang&rsquo;s JIT compiler than it was a month ago.
Some recent patches have landed which partially address a blocking bug with
pre-compiled header handling in Clang&rsquo;s internal C++ JIT compiler. I have
identified another small reproduction case for what I hope to be the rest of the
issues. Part of my work this month involved getting jank running on LLVM
19 and updating filling out the related CMake system to be able to flexibly
bring in LLVM on any system.</p>
<p>Once jank moves away from Cling in favor of Clang, building and distributing
jank will be significantly easier. Developers won&rsquo;t need to compile a custom
Cling/Clang/LLVM stack. On top of that, Clang&rsquo;s JIT compiler has recently landed
support for loading C++20 modules, which can serve as an less-portable
equivalent to JVM&rsquo;s class files, allowing jank to load pre-compiled modules very
quickly. This will drastically optimize jank&rsquo;s startup time, but will require
some work to get going. I&rsquo;ll keep you updated!</p>
<h3 id="whats-next">What&rsquo;s next?</h3>
<p>I&rsquo;m well ahead of schedule, for the quarter, but I need to finish up chunked
sequences and <code>doseq</code>. I&rsquo;ll have time after that and I&rsquo;d like to get atoms
working, since most Clojure programs have some form of state. From there, I can
look into strengthening native interop and making jank more easily
distributable, but let&rsquo;s not get ahead of ourselves.<br>
<br>
 </p>
<h3 id="report-2-may-31-2024">Report 2: May 31, 2024</h3>
<p>Hey folks! I&rsquo;ve been building on last month&rsquo;s addition of lazy sequences,
<code>loop*</code>, destructuring, and more. This month, I&rsquo;ve worked on rounding out
lazy sequences, adding more mutability, better meta support, and some big
project updates.</p>
<h3 id="chunked-sequences">Chunked sequences</h3>
<p>I&rsquo;ve expanded the lazy sequence support added last month to include chunked
sequences, which pre-load elements in chunks to aid in throughput. At this
point, only <code>clojure.core/range</code> returns a chunked sequence, but all of the
existing <code>clojure.core</code> functions which should have support for them do.</p>
<p>If you recall from last month, there is a third lazy sequence type: buffered
sequences. I won&rsquo;t be implementing those until they&rsquo;re needed, as I&rsquo;d never even
heard of them before researching more into the lazy sequences in Clojure.</p>
<h3 id="initial-quarter-goals-accomplished">Initial quarter goals accomplished</h3>
<p>Wrapping up the lazy sequence work, minus buffered sequences, actually checked
off all the boxes for my original goals this quarter. There&rsquo;s a bottomless
well of new tasks, though, so I&rsquo;ve moved onto some others. So, how do I decide what
to work on next?</p>
<p>My goal is for you all to be writing jank programs. The most important tasks are
the ones which bring me closer to that goal. Let&rsquo;s take a look at what those
have been so far.</p>
<h3 id="volatiles-atoms-and-reduced">Volatiles, atoms, and reduced</h3>
<p>Most programs have some of mutation and we generally handle that with volatiles
and atoms in Clojure. jank already supported transients for most data structures,
but we didn&rsquo;t have a way to hold mutable boxes to immutable values. Volatiles are
also essential for many transducers, which I&rsquo;ll mention a bit later. This month,
both volatiles and atoms have been implemented.</p>
<p>Implementing atoms involved a fair amount of research, since lockless
programming with atomics is
<a href="https://www.youtube.com/watch?v=c1gO9aB9nbs">not nearly as straightforward</a>
as one might expect.</p>
<p>As part of implementing atoms, I also added support for the <code>@</code> reader macro and
the overall <code>derefable</code> behavior. This same behavior will be used for delays,
futures, and others going forward.</p>
<h3 id="meta-handling-for-defs">Meta handling for defs</h3>
<p>Last quarter, I added support for meta hints, but I didn&rsquo;t actually use that
metadata in many places. Now, with defs, I&rsquo;ve added support for the optional
meta map and doc string and I also read the meta from the defined symbol. This
isn&rsquo;t a huge win, but it does mean that jank can start using doc strings
normally, and that we can do things like associate more function meta to the var
in a <code>defn</code>, which can improve error reporting.</p>
<h3 id="monorepo">Monorepo</h3>
<p>There will be many jank projects and I&rsquo;ve known for a while that I want them
all to be in one git <a href="https://en.wikipedia.org/wiki/Monorepo">monorepo</a>.
This makes code sharing, searching, refactoring, and browsing simpler. It gives
contributors one place to go in order to get started and one place for all of
the issues and discussions. It&rsquo;s not my intention to convince you of anything, if
you&rsquo;re not a fan of monorepos, but jank is now using one.</p>
<p>This started by bringing in <a href="https://github.com/Samy-33/lein-jank">lein-jank</a>,
which was initially created by Saket Patel. From there, I&rsquo;ve added a couple of
more projects, which I&rsquo;ll cover later in this update.</p>
<h3 id="new-clojurecore-functions-1">New clojure.core functions</h3>
<p>Following last month&rsquo;s theme, which saw 52 new Clojure functions, I have
excellent news. We actually beat that this month, adding 56 new Clojure functions!
However, I only added 23 of those and the other 33 were added
by <a href="https://github.com/madstap">madstap</a> (Aleksander Madland Stapnes). He did
this while also adding the transducer arity into pretty much every existing
sequence function. I added volatiles to support him in writing those transducers.</p>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>dotimes</code></td>
<td><code>chunk</code></td>
</tr>
<tr>
<td><code>chunk-first</code></td>
<td><code>chunk-next</code></td>
</tr>
<tr>
<td><code>chunk-rest</code></td>
<td><code>chunk-cons</code></td>
</tr>
<tr>
<td><code>chunked-seq?</code></td>
<td><code>volatile!</code></td>
</tr>
<tr>
<td><code>vswap!</code></td>
<td><code>vreset!</code></td>
</tr>
<tr>
<td><code>volatile?</code></td>
<td><code>deref</code></td>
</tr>
<tr>
<td><code>reduced</code></td>
<td><code>reduced?</code></td>
</tr>
<tr>
<td><code>ensure-reduced</code></td>
<td><code>unreduced</code></td>
</tr>
<tr>
<td><code>identical?</code></td>
<td><code>atom</code></td>
</tr>
<tr>
<td><code>swap!</code></td>
<td><code>reset!</code></td>
</tr>
<tr>
<td><code>swap-vals!</code></td>
<td><code>reset-vals!</code></td>
</tr>
<tr>
<td><code>compare-and-set!</code></td>
<td><code>keep</code></td>
</tr>
<tr>
<td><code>completing</code></td>
<td><code>transduce</code></td>
</tr>
<tr>
<td><code>run!</code></td>
<td><code>comp</code></td>
</tr>
<tr>
<td><code>repeatedly</code></td>
<td><code>tree-seq</code></td>
</tr>
<tr>
<td><code>flatten</code></td>
<td><code>cat</code></td>
</tr>
<tr>
<td><code>interpose</code></td>
<td><code>juxt</code></td>
</tr>
<tr>
<td><code>partial</code></td>
<td><code>doto</code></td>
</tr>
<tr>
<td><code>map-indexed</code></td>
<td><code>keep-indexed</code></td>
</tr>
<tr>
<td><code>frequencies</code></td>
<td><code>reductions</code></td>
</tr>
<tr>
<td><code>distinct</code></td>
<td><code>distinct?</code></td>
</tr>
<tr>
<td><code>dedupe</code></td>
<td><code>fnil</code></td>
</tr>
<tr>
<td><code>every-pred</code></td>
<td><code>some-fn</code></td>
</tr>
<tr>
<td><code>group-by</code></td>
<td><code>not-empty</code></td>
</tr>
<tr>
<td><code>get-in</code></td>
<td><code>assoc-in</code></td>
</tr>
<tr>
<td><code>update-in</code></td>
<td><code>update</code></td>
</tr>
<tr>
<td><code>cond-&gt;&gt;</code></td>
<td><code>as-&gt;</code></td>
</tr>
<tr>
<td><code>some-&gt;</code></td>
<td><code>some-&gt;&gt;</code></td>
</tr>
</tbody>
</table>
<h3 id="new-projects">New projects</h3>
<p>At this point, I was thinking that jank actually has pretty darn good Clojure
parity, both in terms of syntax and essential core functions. So how can I
take the best steps toward getting jank onto your computer?</p>
<p>Well, I think the most important thing is for me to start writing some actual
projects in jank. Doing this will require improving the tooling and will help
identify issues with the existing functionality. The project I&rsquo;ve chosen is
jank&rsquo;s nREPL server. By the end of the project, we&rsquo;ll not only have more
confidence in jank, we&rsquo;ll all be able to connect our editors to running jank
programs!</p>
<h3 id="nrepl-server">nREPL server</h3>
<p>nREPL has <a href="https://nrepl.org/nrepl/building_servers.html">some docs</a> on building
new servers, so I&rsquo;ve taken those as a starting point. However, let&rsquo;s be clear,
there are going to be a <em>lot</em> of steps along the way. jank is <em>not</em> currently
ready for me to just build this server today and have it all work. I need a goal
to work toward, though, and every quest I go on is bringing me one step closer
to completing this nREPL server in jank. Let&rsquo;s take a look at some of the things
I know I&rsquo;ll need for this.</p>
<h4 id="module-system">Module system</h4>
<p>jank&rsquo;s module system was implemented two quarters ago, but since there are no
real jank projects, it hasn&rsquo;t seen much battle testing. To start with, I will
need to work through some issues with this. Already I&rsquo;ve found (and fixed) a
couple of bugs related to module writing and reading while getting started on
the nREPL server. Further improvements will be needed around how modules are
cached and timestamped for iterative compilation.</p>
<h4 id="native-interop">Native interop</h4>
<p>Next, jank&rsquo;s native interop support will need to be expanded. I&rsquo;ve started on that
this month by making it possible to now write C++ sources alongside your jank
sources and actually <code>require</code> them from jank! As you may know, jank allows
for inline C++ code within the special <code>native/raw</code> form, but by compiling
entire C++ files alongside your jank code, it&rsquo;s now much easier to offload
certain aspects of your jank programs to C++ without worrying about writing too
much C++ as inline jank strings.</p>
<p>jank&rsquo;s native interop support can be further improved by declaratively noting
include paths, implicit includes, link paths, and linked libraries as part of
the project. This will likely end up necessary for the nREPL server.</p>
<h4 id="aot-compilation">AOT compilation</h4>
<p>Also required for the nREPL server, I&rsquo;ll need to design and implement jank&rsquo;s AOT
compilation system. This will involve compiling all jank sources and C++ sources
together and can allow for direct linking, whole-program link time optimizations
(LTO), and even static runtimes (no interactivity, but smaller binaries).</p>
<h4 id="distribution">Distribution</h4>
<p>Finally, both jank and the nREPL server will need distribution mechanisms for
Linux and macOS. For jank, that may mean AppImages or perhaps more integrated
binaries. Either way, I want this to be easy for you all to use and I&rsquo;m
following Rust/Cargo as my overall inspiration.</p>
<p>I hope I&rsquo;ve succeeded in showing how much work still remains for this nREPL
server to be built and shipped out. This will take me several months, I&rsquo;d
estimate. However, I think having this sort of goal in mind is very powerful and
I&rsquo;m excited that jank is far enough along to where I can actually be doing this.</p>
<h3 id="nrepl-server-progress">nREPL server progress</h3>
<p>Since I have C++ sources working alongside jank source now, I can use
<code>boost::asio</code> to spin up an async TCP server. The data sent over the wire for
nREPL servers is encoded with bencode, so I started on a <code>jank.data.bencode</code>
project and I have the decoding portion of that working. From there, I wanted to
write my tests in jank using <code>clojure.test</code>, but I haven&rsquo;t implemented
<code>clojure.test</code> yet, so I looked into doing that. It looks like <code>clojure.test</code>
will require me to implement multimethods in jank, which don&rsquo;t yet exist. On top
of that, I&rsquo;ll need to implement <code>clojure.template</code>, which requires
<code>clojure.walk</code>, none of which have been started.</p>
<p>I&rsquo;ll continue on with this depth-first search, implementing as needed, and then
unwind all the way back up to making more progress on the nREPL server. Getting
<code>clojure.test</code> working will be a huge step toward being able to
<a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dogfood</a> more, so I
don&rsquo;t want to cut any corners there. Once I can test my decode
implementation for bencode, I&rsquo;ll write the encoding (which is easier) and then
I&rsquo;ll be back onto implementing the nREPL server functionality.</p>
<p>Hang tight, folks! We&rsquo;ve come a long way, and there is still so much work to do,
but the wheels are rolling and jank is actually becoming a usable Clojure
dialect. Your interest, support, questions, and encouragement are all the
inspiration which keeps me going.  <br></p>
<hr>
<h2 id="plexus-john-collins">Plexus: John Collins</h2>
<p>Q2 2024 Report 1. Published May 15, 2024</p>
<h3 id="1-much-better-loft-algorithm">1. Much better Loft Algorithm.</h3>
<p>The previous loft algorithm simply mapped vertices between one-to-one between cross sections. This meant that lofted cross-sections had to have the same number of vertices. The new loft algorithm is much more general and now supports many-to-one and one-to-many vertex mappings. Loft is a very important operation that is not available in many programmatic CAD tools, so I&rsquo;m excited to have support for this.</p>
<p>I go over this a bit more in a blog post:
<a href="http://www.cartesiantheatrics.com/2024/04/09/perfect-loft.html">http://www.cartesiantheatrics.com/2024/04/09/perfect-loft.html</a></p>
<h3 id="2-text-rendering-support">2. Text rendering Support</h3>
<p>I wrote a first-cut at support for text rendering in companion library to <code>plexus</code> called <code>clj-manifold3d</code>. There is not now a simple function called <code>text</code> that takes a .ttf font file, a string, and a few other parameters and renders the string to a 2D cross section that can be extruded like any other cross section. This is done in the c++ by interpolating freetype2 glyphs.</p>
<p>Aside from built-in support for textures, this is the last major feature that clj-manifold lacked compared to OpenSCAD.</p>
<h3 id="3-n-slices">3. N Slices</h3>
<p>There is now a highly efficient algorithm to slice a manifold into N evenly spaced 2D cross sections. This is a primitive that can be used to implement custom slicers. In the future, I will likely be writing a slicer that gives a high level of control over the G-code generated.</p>
<h3 id="4-three-point-arcs">4. Three Point Arcs</h3>
<p>You can now create arcs given three points. This lets you draw circles or arcs in a similar way that is often done in graphical CAD systems. It is useful for many complex polygon constructions.</p>
<h3 id="5-progress-on-navigation-on-manifolds">5. Progress on Navigation on Manifolds</h3>
<p>This is totally unfinished and unproven, but I have been experimenting heavily with a somewhat unique way doing custom texturing of manifolds. It works by creating a set of primitives that make it easy to &ldquo;draw on&rdquo; arbitrary 3D manifolds as if you&rsquo;re drawing on a 2D plane. I&rsquo;m hoping achieve something more fine-tunnable than common texturing methods (like UV mapping) and that could integrate seamlessly with Plexus&rsquo;s abstractions. It has proven to be challenging unclear how well it&rsquo;s going to work out.</p>
<p>While continuing to tinker with this approach, I&rsquo;ll likely add support for more standard texturing.</p>
<h3 id="6-example-projects">6. Example projects</h3>
<p>I improved and updated example projects that demonstrate using plexus for real-world problems. These are:</p>
<ul>
<li>
<p><a href="https://github.com/SovereignShop/spiralized-hydroponic-tower">A Simple rapidly printable hydroponic tower</a></p>
</li>
<li>
<p><a href="https://github.com/SovereignShop/kossel-printer/">Kossel delta printer:</a></p>
</li>
</ul>
<p>I will try more examples in the future.</p>
<h3 id="7-better-support-for-2d-affine-transforms">7. Better support for 2D affine transforms</h3>
<p>2D affine transforms (3x2 matrices) are now fully supported. They support the same API as 2D cross sections. Having affine transforms as independent objects is a big advantage over OpenSCAD.</p>
<h3 id="8-tests-docs-code-cleanup">8. Tests, Docs, Code Cleanup</h3>
<p>Documentation is still sorely lacking, but README&rsquo;s have been improved. There are more tests now and somewhat better API documentation in the code. There are also now github action pipelines in an effort to bring a bit more transparency and professionalism to the dev process.  <br></p>
<hr>
<h2 id="lost-in-lambduhhs-podcast-l-jordan-miller">Lost in Lambduhhs Podcast: L. Jordan Miller</h2>
<p>Q2 2024 Report 1. Published May 15, 2024.</p>
<h3 id="progress-overview">Progress Overview</h3>
<p>I have made significant progress on my new podcast series, thanks to the support from Clojurists Together. Here are the key milestones I&rsquo;ve achieved so far and my plans moving forward:</p>
<h3 id="platform-subscription">Platform Subscription</h3>
<ul>
<li><strong>Subscribed to Riverside.fm</strong> as my podcasting platform to ensure high-quality audio recordings and ease of use for my guests.</li>
</ul>
<h3 id="guest-coordination">Guest Coordination</h3>
<ul>
<li><strong>First Four Guests Identified and Scheduled:</strong>
<ul>
<li>David Nolan - Recorded on Monday, May 13.</li>
<li>Arne Brasseur - Scheduled to record on Wednesday, May 15.</li>
<li>Recia Roopnarine - Scheduled to record on Wednesday, May 21.</li>
<li>Raf Dittwald - Scheduled to record on Wednesday, May 21.</li>
</ul>
</li>
</ul>
<h3 id="recordings-and-editing">Recordings and Editing</h3>
<ul>
<li><strong>Completed Recording:</strong>
<ul>
<li>My first session with David Nolan was successfully recorded.</li>
</ul>
</li>
<li><strong>Current Task:</strong>
<ul>
<li>I am currently editing and post-processing the interview with David Nolan.</li>
</ul>
</li>
<li><strong>Upcoming Recordings:</strong>
<ul>
<li>Recording with Arne Brasseur on May 15.</li>
<li>Recording with Recia Roopnarine and Raf Dittwald on May 21.</li>
</ul>
</li>
</ul>
<h3 id="release-schedule">Release Schedule</h3>
<ul>
<li><strong>Planned Release:</strong>
<ul>
<li>I plan to release the episode featuring David Nolan within the next week.</li>
</ul>
</li>
</ul>
<h3 id="next-steps">Next Steps</h3>
<ul>
<li>Complete the editing phase for the first episode.</li>
<li>Prepare and test all technical setups for the upcoming recordings.</li>
<li>Begin outreach for additional guests to feature in future episodes.</li>
</ul>
<h3 id="conclusion">Conclusion</h3>
<p>I am on track with my project timeline and excited about the content I am creating. I will continue to provide updates as I progress further.  <br></p>
<hr>
<h2 id="scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</h2>
<p>Q1 2024 Report 3. Published April 30, 2024</p>
<p>April 2024 was the last of three months on the Clojurists Together project titled &ldquo;Scicloj Community Building and Infrastructure&rdquo;.</p>
<p>Scicloj is an open-source group developing Clojure tools and libraries for data and science. As a community organizer at Scicloj, my current role is to help make the emerging Scicloj stack easier and more accessible for broad groups of Clojurians. I collaborate with a few Scicloj members on this.</p>
<p>While this is the last update under the Clojurists Together 2024 Q1 support, the project will, of course, continue.</p>
<p>Below are the sub-projects that were addressed during April 2024. They are listed by their proposed priorities for the coming month.</p>
<p>The new real-world-data group is ranked highest for its impact on community growth. This means the following. Assuming this group will (hopefully) grow well and demand attention, the goals of other projects will receive less attention and will be delayed. However, some of them (e.g., required extensions or bugfixes to libraries) will receive more attention if the real-world-data group requires them.</p>
<h3 id="the-real-world-data-grouphttpssciclojgithubiodocscommunitygroupsreal-world-data"><a href="https://scicloj.github.io/docs/community/groups/real-world-data/">The real-world-data group</a></h3>
<p>The real-world-data group is a space for Clojure data and science practitioners to bring their data projects, share experiences, and evolve common practices.</p>
<h4 id="april-summary">April summary</h4>
<ul>
<li>had a few one-on-one meetings with group members, discussing their goals, and helping out with the technical path</li>
<li>had the second and third group meetings, which included new presentations, follow-ups on personal projects, hands-on parts, and discussions</li>
<li>kept working on introductory materials to support the group</li>
</ul>
<h4 id="may-goals">May goals</h4>
<ul>
<li>have more one-on-one meetings, three more group meetings, and ad-hoc small topical meetings</li>
<li>help the participants take on active paths that connect their interests with community goals<br>
<br>
 </li>
</ul>
<h3 id="nojhttpssciclojgithubionoj"><a href="https://scicloj.github.io/noj/">Noj</a></h3>
<p>The Noj project bundles a few recommended libraries for data and science and adds convenience layers and documentation for using them together.</p>
<h4 id="april-summary-1">April summary</h4>
<ul>
<li>collaborated with Kira McLean on a draft for a new data-visualization API, combining Tablecloth, Hanami, and statistical functions</li>
<li>updated documentation: added a tutorial for visualizing correlation matrices (WIP); started working on an additional machine-learning tutorial</li>
<li>updated the implementation to reuse existing functions of other libraries</li>
</ul>
<h4 id="may-goals-1">May goals</h4>
<ul>
<li>implement the new data-visualization API (still in experimental stage)</li>
<li>improve documentation<br>
<br>
 </li>
</ul>
<h3 id="translating-bookshttpsclojureverseorgtlearn-data-and-science-in-clojure-by-translating-a-book-together"><a href="https://clojureverse.org/t/learn-data-and-science-in-clojure-by-translating-a-book-together/">translating books</a></h3>
<p>In this project, we are renewing previous efforts to systematically review data science books in other programming languages and convert them to Clojure.<br>
The goal is twofold: figuring out what common data science needs are still missing in the Clojure stack and creating well-polished documentation of this stack. It is also an opportunity for Clojurians to get involved in the data science community and learn from books they are curious about.</p>
<h4 id="april-summary-2">April summary</h4>
<ul>
<li>created a list of books (to be announced soon in a tidy repo) in a discussion with community members, exploring content and licenses</li>
<li>explored a Clay+Quarto workflow for a couple of the books, and created draft repos for them</li>
<li>started exploring certain books with community members who may take them on as their long-term projects</li>
</ul>
<h4 id="may-goals-2">May goals</h4>
<ul>
<li>focus on <a href="https://github.com/mthulin/mswr-book">Modern Statistics with R</a> by Måns Thulin</li>
<li>keep exploring other books with community members<br>
<br>
 </li>
</ul>
<h3 id="visual-tools-grouphttpssciclojgithubiodocscommunitygroupsvisual-tools"><a href="https://scicloj.github.io/docs/community/groups/visual-tools/">visual-tools group</a></h3>
<p>This group&rsquo;s goal is to create collaborations in learning and building Clojure tools for data visualization, literate programming, and UI design.</p>
<h4 id="april-summary-3">April summary</h4>
<ul>
<li>had the third ggplot study session</li>
<li>had a meetup about badspreadsheet and HTMX with Adam James</li>
<li>coordinated collaborations with a few group members who are working on HTMX-based dashboards (TBA)</li>
<li>kept exploring options for grammar-of-graphics implementations (documented in the Scrapbook)</li>
</ul>
<h4 id="may-goals-3">May goals</h4>
<ul>
<li>keep the collaborations around HTMX-based layers</li>
<li>continue the grammar-of-graphics study sessions</li>
<li>clarify a proposal and a proof-of-concept for the long-term grammar-of-graphics project<br>
<br>
 </li>
</ul>
<h3 id="clojure-data-scrapbookhttpssciclojgithubioclojure-data-scrapbook"><a href="https://scicloj.github.io/clojure-data-scrapbook/">Clojure Data Scrapbook</a></h3>
<p>The Clojure Data Scrapbook is intended to be a community-driven collection of tutorials around data and science in Clojure.</p>
<h4 id="april-summary-4">April summary</h4>
<ul>
<li>continued the &ldquo;exploring ggplot&rdquo; tutorials</li>
<li>started tutorials (WIP): processing JSON files, analyzing transportation networks</li>
<li>adapted old tutorials to ecosystem updates</li>
</ul>
<h4 id="may-goals-4">May goals</h4>
<ul>
<li>encourage and help community contributions to the scrapbook</li>
<li>keep adding content to support other projects<br>
<br>
 </li>
</ul>
<h3 id="clayhttpssciclojgithubioclay"><a href="https://scicloj.github.io/clay/">Clay</a></h3>
<p>Clay is a minimalistic namespace-as-a-notebook tool for literate programming and data visualization.</p>
<h4 id="april-summary-5">April summary</h4>
<ul>
<li>added an experimental version of test generation for the purpose of testable docs / literate testing</li>
<li>minor bugixes and extensions</li>
<li>5 minor releases of Clay, 2 minor releases of the clay.el Emacs package</li>
</ul>
<h3 id="may-goals-5">May goals</h3>
<ul>
<li>start working on additional visualizations, mostly Emmy.viewers integration</li>
<li>explore the extraction of the HTML and Markdown generation layer as a separate library</li>
<li>keep evolving by user needs<br>
<br>
 </li>
</ul>
<h3 id="kindlyhttpssciclojgithubiokindly-noted"><a href="https://scicloj.github.io/kindly-noted/">Kindly</a></h3>
<p>Kindly is a proposed standard for requesting data visualizations in Clojure.</p>
<h4 id="april-summary-6">April summary</h4>
<ul>
<li>added the meta-kind <code>kind/fn</code> for user-defined display</li>
<li>added the meta-kind <code>kind/test-last</code> (with <code>kindly/check</code> syntactic sugar) for test generation</li>
<li>updated documentation (the Kindly-noted project)</li>
<li>updated kind-clerk (Clerk adapter): plotly support</li>
</ul>
<h4 id="may-goals-6">May goals</h4>
<ul>
<li>start working on Kindly support with the creators of new HTMX-based visual-tools</li>
<li>explore the option of a standalone Kindly implementation that is reusable in different tools (an alternative to the current approach of tool-specific implementations)<br>
<br>
 </li>
</ul>
<h3 id="cmdstan-cljhttpsgithubcomsciclojcmdstan-clj"><a href="https://github.com/scicloj/cmdstan-clj">cmdstan-clj</a></h3>
<p>Cmdstan-clj is a draft library for interop with <a href="https://mc-stan.org/">Stan</a> (probabilistic modeling through Bayesian statistics).</p>
<h4 id="april-summary-7">April summary</h4>
<ul>
<li>gave a presentation of the library and the topic of Bayesian Statistics at the real-world-data group</li>
<li>maintenance: adapted the library to related ecosystem changes</li>
</ul>
<h4 id="may-goals-7">May goals</h4>
<ul>
<li>practice usage with community members and keep developing by need<br>
<br>
 </li>
</ul>
<h3 id="clojisrhttpsgithubcomsciclojclojisr"><a href="https://github.com/scicloj/clojisr">ClojisR</a></h3>
<p>ClojisR is a bridge between Clojure and the R language for statistical computing.
During this Month, @generateme released the first non-beta version of the library and announced it as stable after 4.5 years of usage.</p>
<h4 id="april-summary-8">April summary</h4>
<ul>
<li>My role in the release was mostly migrating the old documentation to use our current literate programming workflow with Clay, test-generation, and Quarto.</li>
</ul>
<h4 id="may-goals-8">May goals</h4>
<ul>
<li>Migrate the <a href="https://github.com/scicloj/clojisr-examples">clojisr-examples</a> project to the current workflow.<br>
<br>
 </li>
</ul>
<h3 id="the-scicloj-websitehttpssciclojgithubio"><a href="https://scicloj.github.io/">The Scicloj website</a></h3>
<h4 id="april-summary-9">April summary</h4>
<ul>
<li>Maintenance and updates</li>
</ul>
<h4 id="may-goals-9">May goals</h4>
<ul>
<li>minor updates reflecting current projects and events<br>
<br>
 </li>
</ul>
<h3 id="your-feedback-would-help">Your feedback would help</h3>
<p>Scicloj is in transition. On the one hand, quite a few of the core members have been very active recently, developing the emerging stack of libraries. At the same time, new friends are joining, and soon, more people will enjoy the Clojure for common data and science needs.</p>
<p>If you have any thoughts about the current directions, or if you wish to discuss how the evolving platform may fit your needs, please <a href="https://scicloj.github.io/docs/community/contact/">reach out</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>March &amp; April 2024 Long-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/march-april-2024-long-term-project-updates/</link>
      <pubDate>Wed, 08 May 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-april-2024-long-term-project-updates/</guid>
      <description>The latest from Bozhidar Batsov, MIchiel Borkent, Toby Crawley, Thomas Heller, Kira McLean, Nikita Prokopov, Tommi Reiman, Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Our 2024 long-term developers report on an incredible body of work for March and April. A heartfelt thanks to all!</p>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER    <br>
<a href="#michiel-borkent">Michiel Borkent:</a> squint, neil, clj-kondo,nbb, CLI, and more<br>
<a href="#toby-crawley">Toby Crawley:</a> clojars-web <br>
<a href="#thomas-heller">Thomas Heller:</a> shadow-cljs<br>
<a href="#kira-mclean">Kira McLean:</a> Scicloj Libraries and more<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Datascript, Clj-reload, Clojure Sublimed, and more<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Reitit 7.0. Malli <br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> http-kit, Nippy, Telemere, and more</p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>The biggest news in the past couple of months is that CIDER now supports clj-reload, as an alternative of clojure.tools.namespace! You can find the relevant PR <a href="https://github.com/clojure-emacs/cider/pull/3624">here</a>.</p>
<p>Some other noteworthy changes:</p>
<ul>
<li>Introduced support for global CLI aliases (<a href="https://github.com/clojure-emacs/cider/pull/3623">more details</a>)</li>
<li>Many small improvements to the Inspector (see Orchard&rsquo;s changelog, e.g. <a href="https://github.com/clojure-emacs/orchard/blob/master/CHANGELOG.md#0240-2024-04-30">this section</a>)</li>
<li>Dropped support for Clojure 1.9 (it&rsquo;s barely used these days and dropping it allows us to simplify the codebase and provide a better user experience)</li>
<li>The inspector and code reloading now have dedicated pages in the CIDER&rsquo;s docs:
<ul>
<li><a href="https://docs.cider.mx/cider/debugging/inspector.html">https://docs.cider.mx/cider/debugging/inspector.html</a></li>
<li><a href="https://docs.cider.mx/cider/usage/code_reloading.html">https://docs.cider.mx/cider/usage/code_reloading.html</a></li>
</ul>
</li>
</ul>
<p>Interested people should check out the recent changes in cider-nrepl and orchard, as that&rsquo;s where the bulk of the work has happened.</p>
<p>We&rsquo;ve yet to release a new version of CIDER, but I&rsquo;m expecting this will happen before the end of May.</p>
<p>P.S. We might be close to a solution for the broken <code>interrupt</code> functionality in nREPL on newer JDKs (20+). See <a href="https://github.com/nrepl/nrepl/pull/318">this</a> for details.  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p><strong>Updates</strong>
In this post I&rsquo;ll give updates about open source I worked on during March and April 2024. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without <em>you</em>, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all.</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://nubank.com.br/">Nubank</a></li>
</ul>
<h3 id="sponsor-info">Sponsor info</h3>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.</p>
<p>On to the projects that I&rsquo;ve been working on!</p>
<h2 id="updates">Updates</h2>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on last month.</p>
<ul>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</p>
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/509">#509</a>: Optimization: use arrow fn for implicit IIFE when possible</li>
<li>Optimization: emit <code>const</code> in let expressions, which esbuild optimizes better</li>
<li>Don&rsquo;t wrap arrow function in parens, see <a href="https://github.com/squint-cljs/vite-plugin-squint/pull/12">this issue</a></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/499">#499</a>: add support for emitting arrow functions with <code>^:=&gt;</code> metadata</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/505">#505</a>: Support <code>:rename</code> in <code>:require</code></li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/490">#490</a>: render css maps in html mode</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/502">#502</a>: allow method names in <code>defclass</code> to override squint built-ins</li>
<li>Fix <a href="https://github.com/squint-cljs/squint/issues/496">#496</a>: don&rsquo;t wrap strings in another set of quotes</li>
<li>Fix rendering of attribute expressions in HTML (should be wrapped in quotes)</li>
<li>Compile destructured function args to JS destructuring when annotated with <code>^:js</code>. This benefits working with vitest and playwright.</li>
<li><a href="https://github.com/squint-cljs/squint/issues/481">#481</a>: BREAKING, squint no longer automatically copies all non-compiled files to the <code>:output-dir</code>. This behavior is now explicit with <code>:copy-resources</code>, see docs.</li>
<li>Add new <code>#html</code> reader for producing HTML literals using hiccup. See <a href="https://github.com/squint-cljs/squint?tab=readme-ov-file#html">docs</a> and <a href="https://squint-cljs.github.io/squint/?src=KG5zIG15ZWxlbWVudAogICg6cmVxdWlyZSBbc3F1aW50LmNvcmUgOnJlZmVyIFtkZWZjbGFzcyBqcy10ZW1wbGF0ZV1dCiAgIFsiaHR0cHM6Ly9lc20uc2gvbGl0IiA6YXMgbGl0XSkpCgooZGVmY2xhc3MgTXlFbGVtZW50CiAgKGV4dGVuZHMgbGl0L0xpdEVsZW1lbnQpCiAgKGZpZWxkIG5hbWUgIldvcmxkIikKICAoZmllbGQgY291bnQgMCkKCiAgKGNvbnN0cnVjdG9yIFtfXQogICAgKHN1cGVyKSkKCiAgT2JqZWN0CiAgKHJlbmRlciBbdGhpc10KICAgICNodG1sIF5saXQvaHRtbAogICAgWzpkaXYKICAgICBbOmgxIG5hbWVdCiAgICAgWzpidXR0b24geyJAY2xpY2siICguLW9uQ2xpY2sgdGhpcykKICAgICAgICAgICAgICAgOnBhcnQgImJ1dHRvbiJ9CiAgICAgICJDbGljayBjb3VudCAiIGNvdW50XV0pCgogIChvbkNsaWNrIFt0aGlzXQogICAgKHNldCEgY291bnQgKGluYyBjb3VudCkpCiAgICAoLmRpc3BhdGNoRXZlbnQgdGhpcyAobmV3IGpzL0N1c3RvbUV2ZW50ICJjb3VudC1jaGFuZ2VkIikpKSkKCihzZXQhICguLXByb3BlcnRpZXMgTXlFbGVtZW50KSAjanMgeyJjb3VudCIgI2pzIHt9fSkKCihqcy93aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lICJteS1lbGVtZW50IiBNeUVsZW1lbnQpCgooZGVmIGFwcCAob3IgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNhcHAiKQogICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgKHNldCEgLWlkICJhcHAiKQogICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKSkKCihzZXQhICguLWlubmVySFRNTCBhcHApICNodG1sIFs6bXktZWxlbWVudF0p">playground example</a>.</li>
<li><a href="https://github.com/squint-cljs/squint/issues/483">#483</a>: Fix operator precedence problem</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects.<br>
Released version 0.3.65 with the following changes:</p>
<ul>
<li><a href="https://github.com/babashka/neil/issues/209">#209</a>: add newlines between dependencies</li>
<li><a href="https://github.com/babashka/neil/issues/185">#185</a>: throw on non-existing library</li>
<li>Bump <code>babashka.cli</code></li>
<li>Fetch latest stable <code>slipset/deps-deploy</code>, instead of hard-coding (<a href="https://github.com/vedang">@vedang</a>)</li>
<li>Several emacs package improvements (<a href="https://github.com/agzam">@agzam</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.<br>
Released 2024.03.13</p>
<ul>
<li>Fix memory usage regression introduced in 2024.03.05</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2299">#2299</a>: Add documentation for <code>:java-static-field-call</code>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1732">#1732</a>: new linter: <code>:shadowed-fn-param</code> which warns on using the same parameter name twice, as in <code>(fn [x x])</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2276">#2276</a>: New Clojure 1.12 array notation (<code>String*</code>) may occur outside of metadata</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2278">#2278</a>: <code>bigint</code> in CLJS is a known symbol in <code>extend-type</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2288">#2288</a>: fix static method analysis and suppressing <code>:java-static-field-call</code> locally</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2293">#2293</a>: fix false positive static field call for <code>(Thread/interrupted)</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2296">#2296</a>: publish multi-arch Docker images (including linux aarch64)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2295">#2295</a>: lint case test symbols in list<br>
Unreleased changed:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1035">#1035</a>: Support SARIF output with <code>--config {:output {:format :sarif}}</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2309">#2309</a>: report unused for expression</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2135">#2135</a>: fix regression with unused JavaScript namespace</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2302">#2302</a>: New linter: <code>:equals-expected-position</code> to enforce expected value to be in first (or last) position. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2304">#2304</a>: Report unused value in <code>defn</code> body</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!<br>
Released version 0.8.58-59</p>
<ul>
<li>Fix <a href="https://github.com/babashka/cli/issues/96">#96</a>: prevent false defaults from being removed/ignored</li>
<li>Fix <a href="https://github.com/babashka/cli/issues/91">#91</a>: keyword options and hyphen options should not mix</li>
<li>Fix <a href="https://github.com/babashka/cli/issues/89">#89</a>: long option never represents alias</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/rewrite-edn">rewrite-edn</a>: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments<br>
Released 0.4.8 with the following update:</p>
<ul>
<li>Add newline after adding new element to top level map with <code>assoc-in</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>nbb bundle JS output will ignore <code>nbb.edn</code></li>
<li><a href="https://github.com/babashka/nbb/issues/351">#351</a>: Update bun docs/example.</li>
<li>Add <code>cljs.core/exists?</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a>: Clojure/Script mode for CodeMirror 6.</p>
<ul>
<li>Fix <a href="https://github.com/nextjournal/clojure-mode/issues/49">#49</a>: bug with hitting backspace after line comment Test it in the <a href="https://squint-cljs.github.io/squint/?repl=true&amp;src=I18oKyAxIDIgMyk%3D">squint playground</a>.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a>: Use instaparse from babashka</p>
<ul>
<li>Serialize regexes in parse results</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI<br>
Released v0.6.17</p>
<ul>
<li><a href="https://github.com/babashka/babashka/issues/77">#77</a>: make dependency on browser (<code>js/document</code>) optional so scittle can run in webworkers, Node.js, etc.</li>
<li><a href="https://github.com/babashka/babashka/issues/69">#69</a>: executing script tag with src + whitespace doesn&rsquo;t work</li>
<li><a href="https://github.com/babashka/babashka/issues/72">#72</a>: add clojure 1.11 functions like <code>update-vals</code></li>
<li><a href="https://github.com/babashka/babashka/issues/75">#75</a>: Support reader conditionals in source code</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li><a href="https://github.com/squint-cljs/cherry/issues/127">#127</a>: fix duplicate <code>cherry-cljs</code> property in <code>package.json</code> which caused issues with some bundlers</li>
<li>Bump squint common compiler code</li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clerk">clerk</a></p>
<ul>
<li><a href="https://github.com/nextjournal/clerk/issues/646">#646</a> Fix parsing + location issue which fixes compatibility with honey.sql</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client<br>
Released 0.4.17-19</p>
<ul>
<li><a href="https://github.com/babashka/http-client/issues/55">#55</a>: allow <code>:body</code> be <code>java.net.http.HttpRequest$BodyPublisher</code></li>
<li>Support a Clojure function as <code>:client</code> option, mostly useful for testing</li>
<li><a href="https://github.com/babashka/http-client/issues/49">#49</a>: add <code>::oauth-token</code> interceptor</li>
<li><a href="https://github.com/babashka/http-client/issues/52">#52</a>: document <code>:throw</code> option</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/bbin">bbin</a>: Install any Babashka script or project with one command<br>
These fixes have been made by <a href="https://github.com/rads">@rads</a>:</p>
<ul>
<li><a href="https://github.com/babashka/bbin/issues/62">Fix #62: bbin ls is unnecessarily slow</a></li>
<li><a href="https://github.com/babashka/bbin/issues/72">Fix #72: bbin install [LOCAL-FILE] should not be restricted to files with the .clj extension</a></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</p>
<ul>
<li>Fix <a href="https://github.com/babashka/sci/issues/626">#626</a>: add <code>cljs.core/exists?</code></li>
<li>Fix <a href="https://github.com/babashka/sci/issues/919">#919</a>: :js-libs + refer + rename clashes with core var</li>
<li>Fix <a href="https://github.com/babashka/sci/issues/906">#906</a>: <code>merge-opts</code> loses <code>:features</code> or previous context</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Fix Windows issue related to relative paths (which took me all day, argh!)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li><a href="https://github.com/babashka/fs/issues/122">#122</a>: <code>fs/copy-tree</code>: fix copying read-only directories with children (<a href="https://github.com/sohalt">@sohalt</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/127">#127</a>: Inconsistent documentation for the <code>:posix-file-permissions</code> options (<a href="https://github.com/teodorlu">@teodorlu</a>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Fix <a href="https://github.com/babashka/babashka/issues/1679">#1679</a>: bump timbre and fix wrapping <code>timbre/log!</code></li>
<li>Add <code>java.util.concurrent.CountDownLatch</code></li>
<li>Add <code>java.lang.ThreadLocal</code></li>
<li>Bump versions of included libraries</li>
</ul>
</li>
</ul>
<h2 id="other-projects">Other projects</h2>
<p>There are many other projects I&rsquo;m involved with but that had little to no activity in the past month. Check out the Other Projects section (more details) of my <a href="https://blog.michielborkent.nl/oss-updates-mar-apr-2024.html">blog here</a> to see a full list.</p>
<p>Published: 2024-04-30
Tagged: clojure oss updates  <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<p><strong>April 2024</strong></p>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/commit/4c63223f47bd4d94e879acfbfdee8ea6ecd869e3"><code>clojars-web</code></a></p>
<p>Mostly maintenance work this month related to error handling and tighening error boundaries.</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/50c6cc28261a6ee8fda4d476f8c004004841d961">Tighten search page error handling</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/32867445a39a6a744fbadd60e9ce1d4f44110964">Address CVEs with bouncycastle</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/c061d2bd6df6314a200a30c82bb04733a863019c">Remove usage of clj-time in favor of java.time</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/d3a7cff8c40c4bc8f462e155548027f8d4dac2f5">Remove /error route</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/6824d96c945d697022b67990f809364128930b29">Fix logback to actually roll logs</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/a26e1ee9eb5cee9e4ef6ac6f9ef6164c37c0e40e">Reject non-flat http params in an attempt to reduce errors from fuzzing</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/89e33a5a60f10ccb33e59d3a418a224bcb4af0dd">Return invalid params response as json</a></li>
</ul>
<p><strong>March 2024</strong></p>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/0b131ebcaf21b33cb7106026726d571e4fc47d1c...4a109fd875b0101164c2349b31a1fa624a7f28be"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/4d5993b0860857276a13874ec42e89f238c30188...190777d4270533d7d4316bb7f2e911cb80ee0dc1"><code>infrastructure</code></a></p>
<ul>
<li><a href="https://github.com/clojars/infrastructure/commit/a50476c3073a7b5269a27cac8ce3b5085433fe22">Upgrade from Amazon Linux 2 to Amazon Linux 2023</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/8160f6320156ac890b72aec5d3f97263a45bcd60">Updates to error handling and reporting to allow more to be reported</a></li>
<li>Upgrades to address CVEs  <br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.28.4 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p><strong>Notable Updates</strong></p>
<ul>
<li>Introduced the <a href="https://github.com/thheller/shadow-cljs-ext">shadow-cljs Browser Extension</a></li>
<li>Worked on some additional devtools for <a href="https://github.com/thheller/shadow-grove">shadow-grove</a>, which will also end up as a browser extension at some point. Similar in spirit as the react/vue developer tools.  <be></li>
</ul>
<hr>
<h2 id="kira-mclean">Kira McLean</h2>
<p>This is a summary of the open source work I&rsquo;ve spent my time on throughout March and April, 2024. Overall it was a really insightful couple of months for me, with lots of productive discussions and meetings happening among key contributors to Clojure&rsquo;s data science ecosystem and great progress toward some of our most ambitious goals.</p>
<h3 id="sponsors-1">Sponsors</h3>
<p>This work is made possible by the generous ongoing support of my sponsors. I appreciate all of the support the community has given to my work and would like to give a special thanks to Clojurists Together and Nubank for providing me with lucrative enough grants that I can reduce my client work significantly and afford to spend more time on these projects.</p>
<p>If you find my work valuable, please share it with others and consider supporting it financially. There are details about how to do that on my <a href="https://github.com/sponsors/kiramclean/">GitHub sponsors page</a>. On to the updates!</p>
<h3 id="grammar-of-graphics-in-clojure">Grammar of graphics in Clojure</h3>
<p>With help from Daniel Slutsky and others in the community, I started some concrete work on implementing a grammar of graphics in Clojure. I&rsquo;m convinced this is the correct long-term solution for dataviz in Clojure, but it is a big project that will take time, including a lot of <a href="https://www.youtube.com/watch?v=f84n5oFoZBc">hammock time</a>. It&rsquo;s still useful to play around with proofs of concept whilst thinking through problems, though, and in the interest of transparency I&rsquo;m making all of <a href="https://github.com/kiramclean/ggclj">those experiments public</a>.</p>
<p>The discussions around this development are all also happening in public. There were two visual tools meetups focused on this over the last two months (<a href="https://www.youtube.com/watch?v=MxjzaOtcdcY">link 1</a>, <a href="https://www.youtube.com/watch?v=d3iRGmbJmes">link 2</a>). And at the London Clojurians talk I just gave today I demonstrated an example of one proposed implementation of a <a href="https://github.com/kiramclean/workshops/blob/main/london_clojurians_april_2024/src/utils/hana.clj">grammar-of-graphics-like API</a> on top of hanami implemented by Daniel.</p>
<p>There are more meetups planned for the coming months and work in this area for the foreseeable future will look like researching and understanding the fundamentals of the grammar of graphics in order to design a simple implementation in Clojure.</p>
<h3 id="clojures-ml-and-statistics-tools">Clojure&rsquo;s ML and statistics tools</h3>
<p>I spent a lot of time these last couple of months documenting and testing out Clojure&rsquo;s current ML tools, leading to many great conversations and one <a href="https://codewithkira.com/2024-04-04-state-of-clojure-ml.html">blog post</a> that generated many more interesting discussions. The takeaway is that the tools themselves in this area are all quite mature and stable, but there are still ongoing discussions around how to best accommodate the different ways that people want to work with them. The overall goal in this area of my work is to stabilize the solutions so we can start advocating for specific ways of using them.</p>
<p>Below are some key takeaways from my research into all this stuff. Note none of these are my decisions to make alone, but represent my current opinions and what I will be advocating for within the community:</p>
<ul>
<li>Smile will be slowly sunsetted from the ecosystem. The switch to GPL licensing was made in bad faith and many of the common models don&rsquo;t work on Apple chips. Given the abundance of suitable alternatives, the easiest option is to move away from depending on it.</li>
<li>A greater distinction between statistical modelling and machine learning workflows will be helpful. Right now there are many uses of the various models that are available in Clojure, and the wrappers and tools surrounding them are usually designed with a specific type of user in mind. For example machine learning people almost always have separate training and testing datasets, whereas statisticians &ldquo;train&rdquo; their models on an entire dataset. The highest-level APIs for these different usages (among others) look quite different, and we would benefit from having APIs that are ergonomic and familiar to our target users of various backgrounds.</li>
<li>We should agree on standards for accomplishing certain very common and basic tasks and propose a recommended usage for users. For example, there are almost a dozen ways to do linear regression in Clojure and it&rsquo;s not obvious which is &ldquo;the best&rdquo; way to someone not deeply familiar with the ecosystem.</li>
<li>Everything should work with tablecloth datasets and expect them as inputs. This is mostly the case already, but there is still some progress to be made.</li>
</ul>
<h3 id="foundations-of-clojures-data-science-stack">Foundations of Clojure&rsquo;s data science stack</h3>
<p>I continue to work on guides and tutorials for the parts of Clojure&rsquo;s data science stack that I feel are ready for prime time, mainly tablecloth and all of the amazing underlying libraries it leverages. Every once in a while this turns up surprises, for example this month I was surprised at how column header processing is handled for nippy files specifically. I also <a href="https://github.com/scicloj/tablecloth/pull/143">fixed one bug</a> in tablecloth itself, which I discovered in the process of writing a tutorial earlier in March. I have a pile of in-progress guides focusing on some more in-depth topics from developing the London Clojurians talk that I&rsquo;m going to tidy up and publish in the coming months.</p>
<p>The overarching goal in this area is to create a unified data science stack with libraries for processing, modelling, and visualization that all interoperate seamlessly and work with tablecloth datasets, like the tidyverse in R. Part of achieving that is making sure that tablecloth is rock solid, which just takes a lot of poking and prodding.</p>
<h3 id="london-clojurians-talk">London Clojurians talk</h3>
<p>This talk was a big inspiration for diving deep into Clojure&rsquo;s data science ecosystem. I experimented with a ton of different datasets for the workshop and discovered tons of potential areas for future development. Trying to put together a polished data workflow really exposed many of the key areas I think we should be focusing on and gave me a lot of inspiration for future work. I spent a ton of time exploring all of the possible ways to demonstrate a broad sample of data science tools and learned a lot along the way.</p>
<p>The resources from the talk are all available <a href="https://github.com/kiramclean/workshops/tree/main/london_clojurians_april_2024">in this repo</a> and the video will be posted soon.</p>
<h3 id="summary-of-future-work">Summary of future work</h3>
<p>I mentioned a few areas of focus above, below is a summary of the ongoing work as I see it. A framework for organizing this work is starting to emerge, and I&rsquo;ve been thinking about in terms of four key areas:</p>
<h4 id="visualisation">Visualisation</h4>
<ul>
<li>Priority here is to release a stable dataviz API using the tools and wrappers we currently have so that we can start releasing guides and tutorials that follow a consistent style.</li>
<li>The long-term goal is to develop a robust, flexible, and stable data visualization library in Clojure itself based on the grammar of graphics.</li>
</ul>
<h4 id="machine-learning">Machine learning</h4>
<ul>
<li>Priority is to decide which APIs we will commit to supporting in the long term and stabilize the &ldquo;glue&rdquo; libraries that provide the high-level APIs for data-first users.</li>
<li>Long term goal is to support the full spectrum of libraries and models that are in everyday use by data science professionals.</li>
</ul>
<h4 id="statistics">Statistics</h4>
<ul>
<li>Priority is to document the current options for accomplishing basic statistical modelling tasks, including Clojure libraries we do have, Java libs, and Python interop.</li>
<li>Long term goal is to have tablecloth-compatible stats libraries implemented in pure Clojure.</li>
</ul>
<h4 id="foundations">Foundations</h4>
<ul>
<li>Priority is to build a tidyverse for Clojure. This includes battle-testing tablecloth, fully documenting its capabilities, and fixing remaining, small, sharp edges.</li>
</ul>
<h3 id="going-forward">Going forward</h3>
<p>My overarching goal (personally) is still to write a canonical resource for working with Clojure&rsquo;s data science stack (the Clojure Data Cookbook), and I&rsquo;m still working on finding the right balance of documenting &ldquo;work-in-progress&rdquo; tools and libraries vs. delaying progress until I feel they are more &ldquo;ready&rdquo;. Until now I&rsquo;ve let the absence of stable or ideal APIs in certain areas hinder development of this book, but I&rsquo;m starting to feel very confident in my understanding of the current direction of the ecosystem, enough so that I would feel good about releasing something a little bit more formal than a tutorial or guide and recommending usages with the caveat that development is ongoing in some areas. And while it will take a while to get where we want to go, I feel like I can finally see the path to getting there. It just takes a lot of work and lot of collaboration, but with your support we&rsquo;ll make it happen! Thanks for reading.  <br></p>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hello hello hello, I hope you like some open-source, because I have some for ya. This past two months have been busy!</p>
<p><a href="https://github.com/tonsky/datascript">DataScript</a>:</p>
<ul>
<li>Implement “constant substitution” optimization for queries <a href="https://github.com/tonsky/datascript/issues/462">#462</a></li>
<li>Fixed :max-eid for dangling entities during reader-based serialization <a href="https://github.com/tonsky/datascript/issues/463">#463</a></li>
<li>Fixed tempid in unique refs <a href="https://github.com/tonsky/datascript/issues/464">#464</a></li>
<li>Pass through BigInteger/BigDeciman to freeze-fn in serializable <a href="https://github.com/tonsky/datascript/pull/465">#465</a>, <a href="https://github.com/tonsky/datascript/issues/466">#466</a></li>
</ul>
<p><a href="https://github.com/HumbleUI/Skija">Humble UI</a>:</p>
<ul>
<li>Migration to VDOM continues. Ported <code>stack</code>, redid <code>button</code></li>
<li>Redid state sharing approach between behavior components (e.g. <code>clickable</code>) and visual ones (e.g. <code>button-look</code>)</li>
<li>New frame &amp; event pace graphs</li>
<li>New canvas example (drawing, mouse lag graph)</li>
</ul>
<p><a href="https://github.com/HumbleUI/Skija">Skija</a>:</p>
<ul>
<li>Surface and PictureRecorder cache returned Canvas object and invalidate it when owner is closed <a href="https://github.com/HumbleUI/Skija/issues/66">#66</a></li>
</ul>
<p><a href="https://github.com/tonsky/clj-reload">clj-reload</a>, a smarter way to reload Clojure code:</p>
<ul>
<li>Added <code>unload</code></li>
<li>Fixed issues when adding/removing keeps</li>
<li>Speed up topo-sort <a href="https://github.com/tonsky/clj-reload/pull/5">#5</a></li>
<li>Do not report self-reference as a cycle <a href="https://github.com/tonsky/clj-reload/issues/6">#6</a></li>
<li>Parse record ctor syntax <a href="https://github.com/tonsky/clj-reload/issues/7">#7</a></li>
<li>Added <code>:files</code> option <a href="https://github.com/tonsky/clj-reload/pull/8">#8</a></li>
</ul>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>, Clojure development environment for Sublime Text:</p>
<ul>
<li>Socket REPL: Watches (just like in original LightTable!)</li>
<li>Added <code>transform</code> argument to <code>clojure_sublimed_eval</code>. It lets you implement stuff like print to buffer, eval test under cursor, macroexpand etc <a href="https://github.com/tonsky/Clojure-Sublimed/issues/101">#101</a> <a href="https://github.com/tonsky/Clojure-Sublimed/pull/102">#102</a></li>
<li>Added <code>expand</code> argument to <code>clojure_sublimed_eval</code></li>
<li>Added <code>output.repl</code> panel and <code>Toggle Output Panel</code> command for raw nREPL <a href="https://github.com/tonsky/Clojure-Sublimed/issues/104">#104</a></li>
<li>Raw nREPL: Support colored output in output console <a href="https://github.com/tonsky/Clojure-Sublimed/issues/99">#99</a></li>
<li>Display failed tests report as red</li>
<li>Fixed <code>Reconnect</code> command</li>
<li>Add <code>on_finish_callback</code> to <code>eval</code> <a href="https://github.com/tonsky/Clojure-Sublimed/pull/105">#105</a></li>
<li>Added <code>print_quota</code> as a setting and as an argument to <code>cs_conn.eval</code></li>
</ul>
<p>New library: <a href="https://github.com/tonsky/sane-math">sane-math</a></p>
<ul>
<li>Write mathematical expression in Clojure in infix notation</li>
<li>Part April Fools’ joke, part serious</li>
<li>Supports <code>+</code>, <code>−</code>, <code>*</code>, <code>/</code>, unary minus, <code>**</code> and parentheses</li>
</ul>
<p>Blogging:</p>
<ul>
<li><a href="https://tonsky.me/blog/centering/">Hardest Problem in Computer Science: Centering Things</a></li>
<li><a href="https://tonsky.me/blog/humble-objects/">Humble Chronicles: The Inescapable Objects</a></li>
<li><a href="https://tonsky.me/blog/humble-defcomp/">Humble Chronicles: Shape of the Component</a></li>
<li><a href="https://tonsky.me/blog/dst/">Daylight Saving Time is a perfect test for UI designer</a></li>
</ul>
<p>Best,
Niki  <br></p>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Finally! Reitit 0.7.0 is out. It has been over a year in the making, spanning multiple libraries:
<a href="https://github.com/metosin/reitit">reitit</a>, <a href="https://github.com/metosin/malli">malli</a>,
<a href="https://github.com/metosin/schema-tools">schema-tools</a>, [spec-tools](<a href="https://github.com/metosin/spec-tools">https://github.com/metosin/spec-tools</a> and
<a href="https://github.com/metosin/ring-swagger-ui">ring-swagger-ui</a>. Big thanks to everyone involved.
There is a lot of draft work that has been queued and can now be worked on. New releases should come more
frequently in the future.</p>
<h3 id="reitit-070-all-8-alphas-flattened">Reitit 0.7.0 (all 8 alphas flattened)</h3>
<h3 id="070-2024-04-30">0.7.0 (2024-04-30)</h3>
<p>The OpenAPI3 release, Year in the making - the changes span over multiple repositories!</p>
<ul>
<li>
<p>Openapi3 support, see the <a href="https://github.com/metosin/reitit/blob/master/doc/ring/openapi.md">docs</a></p>
<ul>
<li>Fetch OpenAPI content types from Muuntaja <a href="https://github.com/metosin/reitit/issues/636">#636</a></li>
<li>OpenAPI 3 parameter descriptions get populated from malli/spec/schema descriptions. <a href="https://github.com/metosin/reitit/issues/612">#612</a></li>
<li>Generate correct OpenAPI $ref schemas for malli var and ref schemas <a href="https://github.com/metosin/reitit/pull/673">#673</a></li>
<li>new syntax for <code>:request</code> and <code>:response</code> per-content-type coercions. See <a href="https://github.com/metosin/reitit/blob/master/doc/ring/coercion.md">coercion.md</a>. <a href="https://github.com/metosin/reitit/issues/627">#627</a></li>
<li><a href="https://github.com/metosin/reitit/issues/84">#84</a></li>
</ul>
</li>
<li>
<p>Handlers can be vars <a href="https://github.com/metosin/reitit/pull/585">#585</a></p>
</li>
<li>
<p>Fix swagger generation when unsupported coercions are present <a href="https://github.com/metosin/reitit/pull/671">#671</a></p>
</li>
<li>
<p><strong>BREAKING</strong>: require Clojure 1.11, drop support for Clojure 1.10</p>
</li>
<li>
<p><strong>BREAKING</strong>: <code>compile-request-coercers</code> returns a map with <code>:data</code> and <code>:coerce</code> instead of plain <code>:coerce</code> function</p>
</li>
<li>
<p><strong>BREAKING</strong>: Parameter and Response schemas are merged into the route data vector - so they can be properly merged into the compiled result, fixes <a href="https://github.com/metosin/reitit/issues/422">#422</a> - merging multiple schemas together works with <code>Malli</code> and <code>Schema</code>, partially with <code>data-spec</code> but not with <code>spec</code>.</p>
</li>
<li>
<p>Fixed some module dependencies so Cljdoc can properly analyze all the modules</p>
</li>
<li>
<p>Fix reading fragment string on <code>Html5History</code> initialization</p>
</li>
<li>
<p>Add fragment string parameter to reitit-frontend functions (<a href="https://github.com/metosin/reitit/pull/604">#604</a>)</p>
</li>
<li>
<p>Frontend: provide easy way to update current query params. <a href="https://github.com/metosin/reitit/issues/600">#600</a></p>
</li>
<li>
<p>Updated dependencies:</p>
</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[metosin/malli <span style="color:#e6db74">&#34;0.16.1&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.10.1&#34;</span>
[metosin/muuntaja <span style="color:#e6db74">&#34;0.6.10&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.6.8&#34;</span>
[metosin/spec-tools <span style="color:#e6db74">&#34;0.10.6&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.10.5&#34;</span>
[metosin/schema-tools <span style="color:#e6db74">&#34;0.13.1&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.13.0&#34;</span>
[metosin/jsonista <span style="color:#e6db74">&#34;0.3.8&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.3.7&#34;</span>
[com.fasterxml.jackson.core/jackson-core <span style="color:#e6db74">&#34;2.17.0&#34;</span>] is available but we use <span style="color:#e6db74">&#34;2.14.2&#34;</span>
[com.fasterxml.jackson.core/jackson-databind <span style="color:#e6db74">&#34;2.17.0&#34;</span>] is available but we use <span style="color:#e6db74">&#34;2.14.2&#34;</span>
[ring/ring-core <span style="color:#e6db74">&#34;1.12.1&#34;</span>] is available but we use <span style="color:#e6db74">&#34;1.9.6&#34;</span>
[metosin/ring-swagger-ui <span style="color:#e6db74">&#34;5.9.0&#34;</span>] is available but we use <span style="color:#e6db74">&#34;4.15.5&#34;</span>
</code></pre></div><h3 id="malli">Malli</h3>
<h4 id="0161-2024-04-30">0.16.1 (2024-04-30)</h4>
<ul>
<li>Enabled Java8 tests back, no need to limit the version.</li>
</ul>
<h4 id="0160-2024-04-20">0.16.0 (2024-04-20)</h4>
<ul>
<li><strong>BREAKING</strong>: minimum Java-version is now Java11</li>
<li>allow changing prefix of json-schema $refs via option <code>:malli.json-schema/definitions-path</code> <a href="https://github.com/metosin/malli/pull/1045">#1045</a></li>
<li>Inline refs in non-<code>:body</code> swagger parameters <a href="https://github.com/metosin/malli/pull/1044">#1044</a></li>
<li>Fix flaky test <a href="https://github.com/metosin/malli/pull/1040">#1040</a></li>
<li>Utility to update entry properties: <code>mu/update-entry-properties</code> <a href="https://github.com/metosin/malli/pull/1037">#1037</a></li>
<li>Fix actions cache <a href="https://github.com/metosin/malli/pull/1036">#1036</a></li>
<li>Only humanize one of <code>:min</code> / <code>:max</code> when different <a href="https://github.com/metosin/malli/pull/1032">#1032</a></li>
<li>Distinguish between symbols and strings in humanize <a href="https://github.com/metosin/malli/pull/1031">#1031</a></li>
<li>Fix <code>:map-of</code> <code>:min</code> and unreachable generator, explain such-that failures <a href="https://github.com/metosin/malli/pull/1029">#1029</a></li>
</ul>
<h4 id="0150-2024-03-23">0.15.0 (2024-03-23)</h4>
<ul>
<li><code>:=&gt;</code> takes optional 3rd child, the guard schema validating vector of arguments and return value <code>[args ret]</code>. See <a href="https://github.com/metosin/malli/blob/master/docs/function-schemas.md#function-guards">Function Guards</a> for more details. Fixes <a href="https://github.com/metosin/malli/issues/764">#764</a> and <a href="https://github.com/metosin/malli/issues/764">#764</a>.</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#75715e">;; function of arg:int -&gt; ret:int, where arg &lt; ret</span>
[<span style="color:#e6db74">:=&gt;</span> 
 [<span style="color:#e6db74">:cat</span> <span style="color:#e6db74">:int</span>] 
 <span style="color:#e6db74">:int</span> 
 [<span style="color:#e6db74">:fn</span> (<span style="color:#66d9ef">fn </span>[[[arg] ret]] (&lt; arg ret))]]
</code></pre></div><ul>
<li>
<p><strong>BREAKING</strong>: <code>malli.generator/function-checker</code> returns explanations under new keys:</p>
<ul>
<li><code>::mg/explain-input</code> -&gt; <code>::m/explain-input</code></li>
<li><code>::mg/explain-output</code> -&gt; <code>::m/explain-output</code></li>
<li>new <code>::m/explain-guard</code> to return guard explanation, if any</li>
</ul>
</li>
<li>
<p><code>m/explain</code> for <code>:=&gt;</code> returns also errors for args, return and guard if they exist</p>
</li>
<li>
<p>FIX <code>m/deref-recursive</code> doesn&rsquo;t play nice with <code>:merge</code> schema <a href="https://github.com/metosin/malli/issues/997">#997</a> via <a href="https://github.com/metosin/malli/pull/999">#999</a></p>
</li>
<li>
<p>FIX nested <code>:repeat</code> sequence schema&rsquo;s doesn&rsquo;t seem to work <a href="https://github.com/metosin/malli/issues/761">#761</a> via <a href="https://github.com/metosin/malli/pull/1024">#1024</a></p>
</li>
<li>
<p>FIX Invalid Swagger JSON with <code>[:or :nil]</code> alternatives <a href="https://github.com/metosin/malli/issues/1006">#1006</a> via <a href="https://github.com/metosin/malli/pull/1023">#1023</a></p>
</li>
<li>
<p>FIX <code>(explain :tuple [])</code> <a href="https://github.com/metosin/malli/pull/1022">#1022</a></p>
</li>
<li>
<p>Enforce entry specs in open map destructurings <a href="https://github.com/metosin/malli/pull/1021">#1021</a></p>
</li>
<li>
<p>FIX <code>goog/mixin</code> was deprecated and is now removed <a href="https://github.com/metosin/malli/pull/1016">#1016</a></p>
</li>
<li>
<p>Updated dependencies:</p>
</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">borkdude/edamame <span style="color:#ae81ff">1.3</span>.23 -&gt; <span style="color:#ae81ff">1.4</span>.25
</code></pre></div><h3 id="something-else">Something else</h3>
<p>Back at Greece, to relax and to Open Source.</p>
<img width="1728" alt="os-greece" src="https://gist.github.com/ikitommi/8c904bfaa17f3871f80d3e20ea84ebb7/raw/382b1e5afb832088157a989ae2d5ab316683f3de/os-greece.jpg">
<br>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="https://www.taoensso.com/sponsors">other sponsors</a> of my open source work!</p>
<p>Hi folks! 🦎</p>
<p>It&rsquo;s been a very productive couple months! Have been able to continue full-time on open source. Output included:</p>
<h3 id="http-kit-v280">http-kit v2.8.0</h3>
<p><a href="https://www.taoensso.com/http-kit">http-kit</a> <a href="https://github.com/http-kit/http-kit/releases/tag/v2.8.0">v2.8.0 final</a> is now <a href="https://clojars.org/http-kit/versions/2.8.0">on Clojars</a> 👍</p>
<blockquote>
<p>http-kit is a simple, high-performance event-driven <strong>HTTP client+server</strong> for Clojure.</p>
</blockquote>
<p>This is the first major stable http-kit release since 2023-06-30, and includes work from 10 contributors. Big thanks to everyone involved! 🙏</p>
<p>Some highlights include:</p>
<ul>
<li>Performance improvements, incl. <strong>auto JVM 21+ virtual threads</strong> when available.</li>
<li>Support for the <strong>latest Ring async and WebSocket APIs</strong>.</li>
<li>A comprehensive new <a href="https://github.com/http-kit/http-kit/wiki/4-Benchmarking">benchmark suite</a> for http-kit server and client.</li>
<li><strong>&gt;15 fixes</strong> and numerous other improvements</li>
</ul>
<h3 id="nippy-v340">Nippy v3.4.0</h3>
<p><a href="https://www.taoensso.com/nippy">Nippy</a> <a href="https://github.com/taoensso/nippy/releases/tag/v3.4.0">v3.4.0 final</a> is now <a href="https://clojars.org/com.taoensso/nippy/versions/3.4.0">on Clojars</a> 👍</p>
<blockquote>
<p>Nippy is a <a href="https://github.com/taoensso/nippy?tab=readme-ov-file#performance">fast</a> and mature <strong>binary serialization</strong> library for Clojure.</p>
</blockquote>
<p>This is the first major stable Nippy release since 2023-10-11, and includes:</p>
<ul>
<li>Faster, more accurate <a href="https://cljdoc.org/d/com.taoensso/nippy/CURRENT/api/taoensso.nippy#freezable?">freezable?</a> util (checks if arg is serializable)</li>
<li><a href="https://facebook.github.io/zstd/">Zstandard</a> compression support</li>
<li>Support for serializing <a href="https://github.com/seancorfield/next-jdbc">next.JDBC</a> results (this was previously broken)</li>
</ul>
<h3 id="telemere-v100-first-public-pre-releases">Telemere v1.0.0 first public pre-releases</h3>
<p>My main focus during this period has been has been <a href="https://www.taoensso.com/telemere">Telemere</a>.</p>
<p>Telemere is a major new library (and along with <a href="https://www.taoensso.com/tempel">Tempel</a>, my first all-new library in 7+ years). It&rsquo;s a <strong>structured telemetry library</strong> for Clojure/Script, and a highly-polished modern rewrite of <a href="https://www.taoensso.com/timbre">Timbre</a> without any of the historical constraints.</p>
<p>It offers a superset of the functionality found in <strong>traditional and structured logging</strong>, and out-the-box  support for <strong>SLF4J</strong>, <strong>OpenTelemetry</strong>, clojure.tools.logging, etc.</p>
<p>The latest release can be found <a href="https://github.com/taoensso/telemere/releases">here</a> (currently <a href="https://github.com/taoensso/telemere/releases/tag/v1.0.0-beta5">beta5</a>).</p>
<p>Folks happy with Timbre have zero pressure to update, I’ll continue to support Timbre as usual.  But Telemere offers <em>a lot</em> of new features and improvements (see <a href="https://github.com/taoensso/telemere?tab=readme-ov-file#why-telemere">README</a>), and <a href="https://github.com/taoensso/telemere/wiki/5-Migrating">migration</a> is often pretty easy.</p>
<p>Will note that based on Clojure survey feedback, I’ve been putting a lot more emphasis lately on <strong>beginner-oriented support</strong>.  For Telemere this includes the most comprehensive <a href="https://www.taoensso.com/telemere/wiki">wiki</a> and <a href="https://www.taoensso.com/telemere/wiki">API docs</a> I’ve yet included with a library.</p>
<p>Please do let me know if this stuff is helpful, since it adds a lot to the development effort! 🙏</p>
<p>There’s also a new Telemere <a href="https://www.taoensso.com/telemere/slack">Slack channel</a> and short <a href="https://youtu.be/-L9irDG8ysM?si=NR9tKG6IygaPDx8i">demo video</a>.</p>
<p>Telemere&rsquo;s a small library, but it&rsquo;s been a lot of work getting the details just right. I&rsquo;m happy with the results, and excited for folks to try it out.</p>
<p>Telemere is in many ways represents the refinement and culmination of ideas brewing over 12+ years in <a href="https://www.taoensso.com/timbre">Timbre</a>, <a href="https://www.taoensso.com/tufte">Tufte</a>, <a href="https://www.taoensso.com/truss">Truss</a>, etc.</p>
<p>Ultimately the hope is for it to help enable Clojure/Script systems that are <strong>observable</strong>, <strong>robust</strong>, and <strong>debuggable</strong>. The <a href="https://github.com/taoensso/telemere/wiki/1-Getting-started">wiki intro</a> is probably a good place to start if you&rsquo;re interested in hearing more.</p>
<h3 id="london-clojurians-talk-1">London Clojurians talk</h3>
<p>This was actually recorded back in February, but I have folks still occasionally mentioning that they&rsquo;d missed it earlier - so I&rsquo;ll share a reminder here.</p>
<p>The talk is available <a href="https://www.youtube.com/watch?v=Jz9NcnQbH5I">on YouTube</a>, and is titled <strong>Some Controversial Truths</strong>: _challenging some commonly-held ideas about Clojure, software engineering, and startups; and sharing the 1 secret that will solve all your problems.</p>
<p>Big thanks to <a href="https://twitter.com/BrunoBonacci">Bruno Bonacci</a> for hosting!</p>
<h3 id="interview-with-daniel-compton">Interview with Daniel Compton</h3>
<p>Likewise for folks that missed it earlier - <a href="https://www.therepl.net/episodes/50/">Daniel Compton</a>  recently posted a <a href="https://www.therepl.net/episodes/50/">chat</a> we had about my open source work. Big thanks to Daniel for hosting!</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>My current roadmap can always be found <a href="https://www.taoensso.com/roadmap">here</a>.</p>
<p>Current objectives for May-June include:</p>
<ul>
<li>
<p>Release the final stable version of <a href="https://www.taoensso.com/tempel">Tempel</a> - my new <strong>data security framework</strong> for Clojure. Before the final release I&rsquo;m planning to add support for <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">MFA</a>, extend the docs re: use with <a href="https://en.wikipedia.org/wiki/OpenID">OpenID</a>, <a href="https://en.wikipedia.org/wiki/OWASP">OWASP</a>, and make a few other last improvements.</p>
</li>
<li>
<p>Continued efforts on <a href="https://www.taoensso.com/telemere">Telemere</a>. I&rsquo;m currently working on porting handlers over from Timbre, improving the documentation, and helping out folks on the <a href="https://www.taoensso.com/telemere/slack">Slack channel</a>.</p>
</li>
<li>
<p>(If time allows) I&rsquo;d also like to update <a href="https://www.taoensso.com/tufte">Tufte</a> to use the new engine that was written for <a href="https://www.taoensso.com/telemere">Telemere</a>. The two already <a href="https://github.com/taoensso/telemere/wiki/3-Config#tufte">work well together</a>, but this&rsquo;ll be especially true after they share the same engine (and so filtering and handler API).</p>
</li>
</ul>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>March 2024 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/march-2024-short-term-project-updates/</link>
      <pubDate>Wed, 17 Apr 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-2024-short-term-project-updates/</guid>
      <description>Updates from clojure-lsp, Instaparse, Jank, Scicloj, SiteFox, UnifyBio, Wolframite</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve got a lot of great work to report on - all projects funded in Q1 2024. Thanks to all!</p>
<p><a href="#clojure-lsp-eric-dallo">clojure-lsp: Eric Dallo</a><br>
<a href="#instaparse-mark-engelberg">Instaparse: Mark Engelberg</a><br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
<a href="#scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</a><br>
<a href="#sitefox-chris-mccormick">SiteFox: Chris McCormick</a><br>
<a href="#unifybio-benjamin-kamphaus">UnifyBio: Benjamin Kamphaus</a><br>
<a href="#wolframite-thomas-clark">Wolframite: Thomas Clark</a></p>
<h2 id="clojure-lsp-eric-dallo">clojure-lsp: Eric Dallo</h2>
<p>Q1 2024 Funding. Reports 2 &amp; 3. Published March 1 and April 1, 2024</p>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlight from my work in February is the new linter different-aliases helps guarantee consistency across alias in your codebase!<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/d62f53f4-bebf-4a67-8657-ee7e2b5aa81d" alt="different-aliases (1)"></p>
<p>In April I spent some time fixing and improving clojure-lsp for Calva, but most of the time working on the IntelliJ support for LSP and REPL, improving both <code>clojure-lsp-intellij</code> and <code>clojure-repl-intellij</code>.</p>
<h4 id="20240301-113751">2024.03.01-11.37.51</h4>
<p><strong>General</strong></p>
<ul>
<li>Bump clj-kondo to <code>2024.02.13-20240228.191822-15</code>.</li>
<li>Add <code>:clojure-lsp/different-aliases</code> linter. #1770</li>
<li>Fix unused-public-var false positives for definterface methods. #1762</li>
<li>Fix rename of records when usage is using an alias. #1756</li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>Fix documentation resolve not working for clients without hover markdown support.</li>
<li>Added setting to allow requires and imports to be added within the current comment form during code action and completion: <code>:add-missing :add-to-rcf</code> #1316</li>
<li>Fix <code>suppress-diagnostics</code> not working on top-level forms when preceded by comment. #1678</li>
<li>Fix add missing import feature on some corner cases for java imports. #1754</li>
<li>Fix semantic tokens and other analysis not being applied for project files at root. #1759</li>
<li>Add support for adding missing requires and completion results referring to JS libraries which already have an alias in the project #1587</li>
</ul>
<h4 id="20240331-191013">2024.03.31-19.10.13</h4>
<p><strong>Editor</strong></p>
<ul>
<li>Adding require command fails for requires without alias. #1791</li>
<li>Add require command without alias now add requires with brackets.</li>
<li>Project tree feature now support keyword definitions like re-frame sub/reg.#1789</li>
<li>Support <code>textDocument/foldingRange</code> LSP feature. #1602</li>
<li>Improve <code>textDocument/documentSymbol</code> considering keyword definitions and returning flatten elements.</li>
<li>Fix Add require/import usages count in code actions. #1794.</li>
</ul>
<h4 id="20240313-131100">2024.03.13-13.11.00</h4>
<p><strong>General</strong></p>
<ul>
<li>Bump clj-kondo to <code>2024.03.13</code> fixing high memory usage issue.<br>
<strong>Editor</strong></li>
<li>Fix <code>workspace/didChangeConfiguration</code> exception causing noise on logs. #1784</li>
</ul>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h4 id="1148---11410">1.14.8 - 1.14.10</h4>
<ul>
<li>Fix exception when starting server related to previous version.</li>
<li>Fix some exceptions that can rarely occurr after startup.</li>
<li>Bump clojure-lsp to <code>2024.02.01-11.01.59</code>.</li>
</ul>
<p>There was a major change to how the plugin starts clojure-lsp, now it starts a clojure-lsp process under the hood (like all other editors) instead of using clojure-lsp as a JVM deps, this fixed a lot of macos bugs.<br>
Also this adds support for &ldquo;find implementations&rdquo; of defmultis and protocols, something that it was never possible in any other IntelliJ plugin.</p>
<h4 id="200---232">2.0.0 - 2.3.2</h4>
<ul>
<li>Use clojure-lsp externally instead of built-in since causes PATH issues sometimes. Fixes #25 and #26</li>
<li>Fix multiple code lens for the same line. #29</li>
<li>Fix os type for macos non aarch64 when downloading clojure-lsp server.</li>
<li>Fix references for different URIs when finding references.</li>
<li>Fix only noisy codelens exception. #33</li>
<li>Support &ldquo;Find implementations&rdquo; of defmultis/defprotocols. #31</li>
<li>Fix commands, code actions not being applied after 2.0.0.</li>
<li>Improve &ldquo;find declaration or usages&rdquo; to show popup for references.</li>
<li>Improve Find references/implementations to go directly to the usage if only one is found. #39</li>
<li>Wait to check for client initialized to minor cpu usage improvmenet.</li>
<li>Support multiple projects opened with the plugin. #37</li>
<li>Fix Stackoverflow exception when renaming. #32</li>
<li>Add common shortcuts to DragForward and DragBackward.</li>
<li>Fix race condition NPE when intellij starts slowly.</li>
</ul>
<h3 id="clojure-repl-intellijhttpsgithubcomafucherclojure-repl-intellij"><a href="https://github.com/afucher/clojure-repl-intellij">clojure-repl-intellij</a></h3>
<p>Although this is not related with clojure-lsp, it&rsquo;s a critical library for IntelliJ usage since without it, there is no REPL usage using only LSP.
I spent considerable time adding the missing feature to make this plugin good enough for a stable release.<br>
Now the plugin has test support!</p>
<h4 id="017---master">0.1.7 - master</h4>
<ul>
<li>Use cider-nrepl middleware to support more features.</li>
<li>Add test support. #46</li>
<li>Fix freeze on evaluation. #48</li>
<li>Improve success test report message UI.</li>
<li>Support multiple opened projects. #51</li>
<li>Fix eval not using same session as load-file. #52</li>
</ul>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/55f4914d-a690-4bd8-a912-ed2e41de4d5f" alt="image">
<br></p>
<hr>
<h2 id="instaparse-mark-engelberg">Instaparse: Mark Engelberg</h2>
<p>Q1 2024 Funding. Report 1. Published March 30, 2024.</p>
<p>Thanks to funding from Clojurists Together, I have been able to review Instaparse pull requests that have been submitted over the past couple of years. I began by incorporating some &ldquo;low-hanging fruit&rdquo; pull requests, which addressed some quality-of-life issues raised by users with minimal changes to the code. Although these were small changes and code was contributed by other users, I needed to test the code and make sure the changes were adequately documented.</p>
<p>I also engaged with users who submitted issues where I needed more explanation or input to carefully consider their proposals. In some cases, I spent time evaluating pull requests but eventually decided <em>not</em> to incorporate that pull request. A good example of this was tonsky&rsquo;s proposal to change the way that parsers and error messages print at the REPL. His proposal was logical but would be a breaking change, which posed a dilemma. After collecting information from him, I consulted with other Clojurists who are involved with instaparse as well as pretty printing and REPLs. I came to the conclusion that it was better to leave as-is.</p>
<p>The most interesting issue I began looking at was a suggestion to incorporate namespaced non-terminals. This is an excellent suggestion because namespaced keywords have taken on much more importance in Clojure since the time instaparse was initially released, due to their critical role in Datomic and Spec. This will be my next area of focus.</p>
<p>I had hoped to complete more work on namespaced keywords, but I spent most of March ill with covid (my first time getting covid), which delayed my work on this more substantive issue. So, rather than wait for the completion of that work, I deployed a new release with the pull requests I had incorporated so far (actually two releases in quick succession: 1.4.13 and 1.4.14) and I look forward to making progress on namespaced keywords in the coming weeks. <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Q1 2024 Funding. Report 2. Published March 30, 2024.</p>
<p>Oh, hey folks. I was just wrapping up this macro I was writing. One moment.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defmacro </span>if-some [bindings then else]
  (<span style="color:#a6e22e">assert-macro-args</span> (vector? bindings)
                     <span style="color:#e6db74">&#34;a vector for its binding&#34;</span>
                     (= <span style="color:#ae81ff">2</span> (count bindings))
                     <span style="color:#e6db74">&#34;exactly 2 forms in binding vector&#34;</span>)
  (<span style="color:#66d9ef">let </span>[form (get bindings <span style="color:#ae81ff">0</span>)
        pred (get bindings <span style="color:#ae81ff">1</span>)]
    <span style="color:#f92672">`</span>(<span style="color:#66d9ef">let </span>[temp# <span style="color:#f92672">~</span>pred]
       (<span style="color:#66d9ef">if </span>(nil? temp#)
         <span style="color:#f92672">~</span>else
         (<span style="color:#66d9ef">let </span>[<span style="color:#f92672">~</span>form temp#]
           <span style="color:#f92672">~</span>then)))))
</code></pre></div><p><em>&ldquo;Does all of that work in jank?&quot;</em> I hear you asking yourself. Yes! Indeed it
does. Since my <a href="https://jank-lang.org/blog/2024-02-23-bindings/">last update</a>, which added dynamic bindings, meta hints, and initial reader macros, I&rsquo;ve finished up syntax quoting support, including gensym support, unquoting, and unquote splicing. We might as well see all of this working in jank&rsquo;s REPL CLI.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#960050;background-color:#1e0010">❯</span> jank repl
&gt; (<span style="color:#66d9ef">defmacro </span>if-some [bindings then else]
    (<span style="color:#a6e22e">assert-macro-args</span> (vector? bindings)
                       <span style="color:#e6db74">&#34;a vector for its binding&#34;</span>
                       (= <span style="color:#ae81ff">2</span> (count bindings))
                       <span style="color:#e6db74">&#34;exactly 2 forms in binding vector&#34;</span>)
    (<span style="color:#66d9ef">let </span>[form (get bindings <span style="color:#ae81ff">0</span>)
          pred (get bindings <span style="color:#ae81ff">1</span>)]
      <span style="color:#f92672">`</span>(<span style="color:#66d9ef">let </span>[temp# <span style="color:#f92672">~</span>pred]
         (<span style="color:#66d9ef">if </span>(nil? temp#)
           <span style="color:#f92672">~</span>else
           (<span style="color:#66d9ef">let </span>[<span style="color:#f92672">~</span>form temp#]
             <span style="color:#f92672">~</span>then)))))
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;clojure.core/if-some</span>
&gt; (<span style="color:#a6e22e">if-some</span> [x <span style="color:#ae81ff">123</span>]
    (str <span style="color:#e6db74">&#34;some &#34;</span> x)
    <span style="color:#e6db74">&#34;none&#34;</span>)
<span style="color:#e6db74">&#34;some 123&#34;</span>
&gt; (<span style="color:#a6e22e">if-some</span> [x nil]
    (str <span style="color:#e6db74">&#34;some &#34;</span> x)
    <span style="color:#e6db74">&#34;none&#34;</span>)
<span style="color:#e6db74">&#34;none&#34;</span>
&gt;
</code></pre></div><h3 id="new-interpolation-syntax">New interpolation syntax</h3>
<p>Some of the early feedback I had for jank&rsquo;s inline C++ support is that the
interpolation syntax we use is different from what ClojureScript uses. Turns out
there&rsquo;s no reason to be different, aside from jank needing some more work, so
jank has been improved to support the new <code>~{}</code> syntax. If you&rsquo;re not familiar,
inline C++ in jank looks like this:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defn </span>sleep [ms]
  (<span style="color:#66d9ef">let </span>[ms (int ms)]
    <span style="color:#75715e">; A special ~{ } syntax can be used from inline C++ to interpolate</span>
    <span style="color:#75715e">; back into jank code.</span>
    (<span style="color:#a6e22e">native/raw</span> <span style="color:#e6db74">&#34;auto const duration(std::chrono::milliseconds(~{ ms }-&gt;data));
</span><span style="color:#e6db74">                 std::this_thread::sleep_for(duration);&#34;</span>)))
</code></pre></div><h3 id="more-reader-macros">More reader macros</h3>
<p>Aside from that, reader macro support has been extended to include shorthand
<code>#()</code> anonymous functions as well as <code>#'v</code> var quoting. The only reader macro
not yet implemented is <code>#&quot;&quot;</code> for regex. All of that concludes what I had aimed
to accomplish for my quarter, and then some. It doesn&rsquo;t stop there, though.</p>
<h3 id="new-logo">New logo</h3>
<p>I&rsquo;m wonderfully pleased to announce that jank now has a logo! The logo was
designed by <a href="https://github.com/jaidetree">jaide</a>, who was graciously patient
with me and a joy to work with through the various iterations. With this logo,
we&rsquo;re capturing C++ on one side, Lisp on the other, and yet a
functional core.<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/9a44f422-c72c-498e-b42b-7b7a733c8990" alt="image"></p>
<h3 id="transients">Transients</h3>
<p>Back to code. In truth, there&rsquo;s more work going on. A lovely man named
<a href="https://github.com/Samy-33">Saket</a> has been helping me fill out jank&rsquo;s
transient functionality, which now includes array maps, vectors, and sets, as
well as the corresponding <code>clojure.core</code> functions. This is not the first time
I&rsquo;ve brought up Saket, since he also implemented the initial lein-jank plugin.
Let&rsquo;s take a look at that.</p>
<h3 id="lein-jank">lein-jank</h3>
<p>This plugin isn&rsquo;t ready for prime time yet, but it&rsquo;s a good proof of concept
that jank can work with leiningen&rsquo;s classpaths and it&rsquo;s a good testing ground
for multi-file projects. jank will be adding AOT compilation soon and this
lein-jank plugin will be the first place new features will land. As a brief
demonstration of where it is today, take a look at this session.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#960050;background-color:#1e0010">❯</span> cat project.clj
(<span style="color:#66d9ef">defproject </span>findenv <span style="color:#e6db74">&#34;0.1.0-SNAPSHOT&#34;</span>
  <span style="color:#e6db74">:dependencies</span> [[org.clojure/clojure <span style="color:#e6db74">&#34;1.11.1&#34;</span>]]
  <span style="color:#e6db74">:plugins</span> [[lein-jank <span style="color:#e6db74">&#34;0.0.1-SNAPSHOT&#34;</span>]]
  <span style="color:#e6db74">:jank</span> {<span style="color:#e6db74">:main</span> findenv.core})

<span style="color:#960050;background-color:#1e0010">❯</span> cat src/findenv/core.jank
(<span style="color:#66d9ef">ns </span>findenv.core)

(<span style="color:#66d9ef">defn </span>-main [<span style="color:#f92672">&amp;</span> args]
  (<span style="color:#66d9ef">let </span>[env-var (first args)
        <span style="color:#75715e">; Call through into native land to look up the var.</span>
        env-val (or (<span style="color:#a6e22e">native/raw</span> <span style="color:#e6db74">&#34;auto const str(runtime::detail::to_string(~{ env-var }));
</span><span style="color:#e6db74">                                 __value = make_box(std::getenv(str.c_str()));&#34;</span>)
                    <span style="color:#e6db74">&#34;var not found&#34;</span>)]
    (println env-val)))

<span style="color:#960050;background-color:#1e0010">❯</span> export FINDME=<span style="color:#e6db74">&#34;found me!&#34;</span>

<span style="color:#960050;background-color:#1e0010">❯</span> lein jank run FINDME
found me!

<span style="color:#960050;background-color:#1e0010">❯</span> lein jank run YOUWONTFINDME
<span style="color:#66d9ef">var </span>not found

<span style="color:#960050;background-color:#1e0010">❯</span> lein jank run LC_ALL
en_US.UTF-8
</code></pre></div><h3 id="migration-from-cling-to-clang-repl">Migration from Cling to clang-repl</h3>
<p>Lastly, I&rsquo;ve been working on migrating jank to use the upstream LLVM version of
Cling, called clang-repl. The key benefit here is that we&rsquo;d no longer need to
compile our own Cling/Clang/LLVM stack in order to build jank and we can
distribute jank to use each distro&rsquo;s normal LLVM package, rather than its own.
On top of that, future work is happening more on clang-repl than on
Cling, so it has recent support for loading pre-compiled C++20 modules, for
example. That would greatly improve jank&rsquo;s startup performance, since Cling
doesn&rsquo;t allow us to load pre-compiled modules at this point.</p>
<p>Work here is ongoing and there are some bugs that I have identified in clang-repl
which need to be fixed before jank can fully make the switch. I&rsquo;ll keep you all updated!<br></p>
<hr>
<h2 id="scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</h2>
<p>Q 1 2024 Funding. Report 2. Published March 31, 2024.</p>
<p>March 2024 was the second of three months on the Clojurists Together project titled &ldquo;Scicloj Community Building and Infrastructure&rdquo;.  Scicloj is an open-source group developing Clojure tools and libraries for data and science.</p>
<p>As a community organizer at Scicloj, my current role is to help make the emerging Scicloj stack easier and more accessible for broad groups of Clojurians. I collaborate with a few Scicloj members on this.</p>
<p>In March 2024, this has been mostly about the following projects. The projects are listed by their proposed priorities for the coming month.</p>
<p>The new real-world-data group is ranked highest for its impact on community growth. This means the following. Assuming this group will (hopefully) grow well and demand attention, the goals of other projects will receive less attention and will be delayed. However, some of them (e.g., required extensions or bugfixes to libraries) will receive more attention if the real-world-data group requires them.</p>
<h3 id="the-real-world-data-grouphttpssciclojgithubiodocscommunitygroupsreal-world-data"><a href="https://scicloj.github.io/docs/community/groups/real-world-data/">The real-world-data group</a></h3>
<p>The real-world-data group is a space for Clojure data and science practitioners to bring their data projects, share experiences, and evolve common practices.</p>
<h4 id="march-summary">March summary</h4>
<ul>
<li>had quite a few one-on-one meetings with group members, discussing their goals, interests, and needs</li>
<li>had <a href="https://clojureverse.org/t/real-world-data-meeting-1/">the first group meeting</a>, including personal introductions, talks <a href="https://www.youtube.com/watch?v=oeY2_M22nEM">by Kyle Passarelli</a> and <a href="https://www.youtube.com/watch?v=iG2OF9C2FSI">by Adham Omran</a>, a hands-on part, and discussions</li>
<li>started creating introductory materials to support the group (see the Scrapbook section)</li>
</ul>
<h4 id="april-goals">April goals</h4>
<ul>
<li>have more one-on-one meetings, two more group meetings, and ad-hoc small topical meetings</li>
<li>help the participants take on active paths that connect their interests with community goals</li>
</ul>
<h3 id="nojhttpssciclojgithubionoj"><a href="https://scicloj.github.io/noj/">Noj</a></h3>
<p>The Noj project bundles a few recommended libraries for data and science and adds convenience layers and documentation for using them together.</p>
<h4 id="march-summary-1">March summary</h4>
<ul>
<li>reorganized the docs and clarified the status of different parts</li>
<li>moved some parts of the experimental functionality to other libraries</li>
</ul>
<h4 id="april-goals-1">April goals</h4>
<ul>
<li>start stabilizing important parts of the experimental API (noj.vis.*, noj.stats)</li>
<li>improve documentation</li>
</ul>
<h3 id="clojure-data-scrapbookhttpssciclojgithubioclojure-data-scrapbook"><a href="https://scicloj.github.io/clojure-data-scrapbook/">Clojure Data Scrapbook</a></h3>
<p>The Clojure Data Scrapbook is intended to be a community-driven collection of tutorials around data and science in Clojure.</p>
<h4 id="march-summary-2">March summary</h4>
<ul>
<li>created a simple contribution guide</li>
<li>content updates:
<ul>
<li>added the <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/geography/chicago-bikes">Chicago bike trips</a> tutorial</li>
<li>added the noj-getting-started <a href="https://scicloj.github.io/noj-getting-started/">notebook</a> &amp; <a href="https://www.youtube.com/watch?v=5GluhUmMlpM">video</a></li>
<li>added the <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/datavis/observable">exploring Observable</a> draft, exploring <a href="https://observablehq.com/">Observable</a> interop</li>
<li>added a few updates to the <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/datavis/ggplot">exploring ggplot</a> book</li>
<li>kept working on the <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/geography/seattle-parks">Seattle parks &amp; neighborhoods</a> tutorial</li>
</ul>
</li>
</ul>
<h4 id="april-goals-2">April goals</h4>
<ul>
<li>encourage and help community contributions to the scrapbook</li>
<li>keep adding content to support other projects</li>
</ul>
<h3 id="clayhttpssciclojgithubioclay"><a href="https://scicloj.github.io/clay/">Clay</a></h3>
<p>Clay is a minimalistic namespace-as-a-notebook tool for literate programming and data visualization.</p>
<h4 id="march-summary-3">March summary</h4>
<ul>
<li>user support</li>
<li>bugfixes, extensions, and performance improvements</li>
<li>7 minor releases</li>
<li>shifted from Alpha to Beta stage</li>
</ul>
<h4 id="april-goals-3">April goals</h4>
<ul>
<li>support user needs, especially in study groups</li>
<li>explore adding <a href="https://github.com/mentat-collective/emmy-viewers">emmy-viewers</a> support</li>
</ul>
<h3 id="kindlyhttpssciclojgithubiokindly-noted"><a href="https://scicloj.github.io/kindly-noted/">Kindly</a></h3>
<p>Kindly is a proposed standard for requesting data visualizations in Clojure.</p>
<h4 id="april-goals-4">April goals</h4>
<ul>
<li>discuss Kindly integration with visual tool authors</li>
</ul>
<h3 id="visual-tools-grouphttpssciclojgithubiodocscommunitygroupsvisual-tools"><a href="https://scicloj.github.io/docs/community/groups/visual-tools/">visual-tools group</a></h3>
<p>This group&rsquo;s goal is to create collaborations in learning and building Clojure tools for data visualization, literate programming, and UI design.</p>
<h4 id="march-summary-4">March summary</h4>
<ul>
<li>had one meeting - <a href="https://clojureverse.org/t/visual-tools-meeting-22-ggplot-study-session-2-summary-recording/10631">the second ggplot study session</a></li>
<li>supported some related explorations of grammar-of-graphics in Clojure (see the <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/datavis/ggplot">exploring ggplot book</a>), especially <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/datavis/ggplot/ggplotly">connecting Clojure specs to ggplotly</a></li>
</ul>
<h4 id="april-goals-5">April goals</h4>
<ul>
<li>continue the grammar-of-graphics exploration</li>
<li>have at least one more study session</li>
</ul>
<h3 id="cmdstan-cljhttpsgithubcomsciclojcmdstan-clj"><a href="https://github.com/scicloj/cmdstan-clj">cmdstan-clj</a></h3>
<p>Cmdstan-clj is a draft library for interop with <a href="https://mc-stan.org/">Stan</a> (probabilistic modeling through Bayesian statistics).</p>
<h4 id="april-goals-6">April goals</h4>
<ul>
<li>practice usage with community members and keep developing by need</li>
</ul>
<h3 id="your-feedback-would-help">Your feedback would help</h3>
<p>Scicloj is in transition. On the one hand, quite a few of the core members have been very active recently, developing the emerging stack of libraries. At the same time, new friends are joining, and soon, more people will enjoy the Clojure for common data and science needs.</p>
<p>If you have any thoughts about the current directions, or if you wish to discuss how the evolving platform may fit your needs, please <a href="https://scicloj.github.io/docs/community/contact/">reach out</a>.  <br></p>
<hr>
<h2 id="sitefox-chris-mccormick">SiteFox: Chris McCormick</h2>
<p>Q1 2024 Funding. Report 2. Published March 30, 2024.</p>
<p>Hello! The second half of my Clojurists Together funded work on Sitefox is complete. I made around 30 commits to the project for a total of 80 since the start of the year and this is a summary of the progress I&rsquo;ve made.</p>
<p>My goal with the Clojurists Together funding has been to make it safer and easier for other people to get started building sites and apps on Sitefox. There were two components to this: a) improving documentation and setup tooling; b) improving security and stability.</p>
<h3 id="e2e-testing">E2e testing</h3>
<p>I continued work on e2e tests for Sitefox. I did this to lay the groundwork for other improvements and get confidence that my changes aren&rsquo;t breaking any major functionality. I made three main improvements to the tests:</p>
<ul>
<li>I started by finshing off the AJAX fetch request test which includes CSRF testing.</li>
<li>I created a new set of CI rules to run the tests using Postgres, in addition to Sqlite.</li>
<li>I got basic testing in place against shadow-cljs in dev and compiled release modes.</li>
</ul>
<p>These tests enabled me to replace the CSRF protection module, make changes to the database layer, and upgrade dependencies knowing the main functions of the framework were still working.</p>
<h3 id="dependency-upgrades">Dependency upgrades</h3>
<p>Once I had finished the AJAX request CSRF tests I was able to finish replacing the csurf module. I chose csrf-csrf as the replacement and with a few tweaks I was able to verify it as a drop-in replacement. I also upgraded nbb and the Express webserver module which was flagged by GitHub security infrastructure as vulnerable.</p>
<h3 id="database-layer-changes">Database layer changes</h3>
<p>Sitefox wraps the Keyv key-value database layer and it features functions for filtering data based on the result of a callback. Previously this would load all of the rows of the table into memory before running the filter, but I updated it to do this sequentially in batches instead. I also tweaked the way values are deserialized to use the underlying library&rsquo;s method, and removed some legacy cruft to do with the way objects were returned. I used the database tests to verify that none of these changes impacted typical database use-cases.</p>
<h3 id="other-misc-updates">Other misc. updates</h3>
<p>Various other updates I made to Sitefox included: adding to the auth layer the ability to dynamically redirect on sign-out, inlining the npm &ldquo;create&rdquo; scripts so they are part of the main monorepo, and general code tidying and linter fixes.</p>
<h3 id="presentations">Presentations</h3>
<p>Near the end of February I gave a <a href="https://www.youtube.com/watch?v=mtwHbxS2PmU">talk about Sitefox to the London Clojurians meetup group</a>. This was useful as it helped me distill the core ideas behind Sitefox and get feedback from the community.</p>
<p>Finally, one of my goals was to create a &ldquo;getting started&rdquo; tutorial. I wrote the tutorial and shot a simple YouTube video, but then discovered the sound had some issues. I will re-record this video with better sound and upload it, as well as publishing the text version of the tutorial to help people get started with Sitefox.</p>
<h3 id="whats-next">What&rsquo;s next</h3>
<p>Now that the funding period is complete I intend to continue Sitefox maintenance and updates. I have started by cutting a release (v0.0.19) with all of the changes made during the Q1 2024 Clojurists Together funding period.</p>
<p>One thing I am particularly interested in is building an RPC layer as an alternative to cumbersome REST or GraphQL communications. I hope this will make ClojureScript client-server code more natural to write and reason about without hiding away fundamental information about which computer the code is running on. Hopefully more on that later.</p>
<p>I&rsquo;m very grateful to have received this support from Clojurists Together. Of course the funding itself is helpful but the most important thing for me was that it showed others are interested in this work and find it valuable and worth working on.</p>
<p>Thanks again for your interest and your support!  <br></p>
<hr>
<h2 id="unifybio-benjamin-kamphaus">UnifyBio: Benjamin Kamphaus</h2>
<p>Q1 2024 Funding. Report 2. Published March 31, 2024.</p>
<p>Since the last update, most of my development effort has been split
into three areas:</p>
<ul>
<li>Data-driven validations (essentially resulting in specs applied to imported data, as well as other constraints)</li>
<li>Data lifecycle management (retractions work, but diff/merge still in progress)</li>
<li>Example dataset for quickstart, and full tutorial (I have tiput together he example, support docs still in progress)</li>
</ul>
<p>I haven&rsquo;t completely wrapped these yet as of Mar 31, but I am very close on the first and last bullet. I will try to update Clojurists Together and the larger data sci/engineering and datomic communities when these things are all available.</p>
<p>Some of my time was spent figuring out what a sustainable long-term solution would be for continuing to develop the core of UnifyBio and to ensure it sees actual use in the life sciences. I had some discussions with different orgs and ended up accepting a full-time position at the Rare Cancer
Research Foundation (just started at the end of this quarter), where I&rsquo;ll have support to further develop UnifyBio. This means the project will probably be moved to the RCRF repo, and there&rsquo;s a possibility it might be re-branded, or that the UnifyBio name and site might be brought under RCRF&rsquo;s umbrella. UnifyBio will remain open source, regardless of where it lives.  I&rsquo;ll update Clojurists Together when I have this information, so the project can be pointed to.</p>
<p>IMO this is an ideal place to be positioned coming out of this quarter where I&rsquo;ve been working on the project as an independent, supported by a mix of client work and funding like the small grant provided to me by Clojurists Together. This change does mean I&rsquo;ll be spending more time on bio specific applications and not as much work focused on making Unify a generically useful tool for Clojure data science, but this won&rsquo;t be a 100% shift, as general use will continue to be helpful for the health of the open source data commons ecosystem I&rsquo;ll be building with RCRF.</p>
<p>I want to thank Clojurists Together again for helping me bridge a time of uncertainty in this interim period while I was working on UnifyBio as a solo dev, and didn&rsquo;t yet have longer term support from a sponsor or employer.  <br></p>
<hr>
<h2 id="wolframite-thomas-clark">Wolframite: Thomas Clark</h2>
<p>Q1 2024 Funding. Report 1. Published April 15, 2024.</p>
<ol>
<li><a href="#org538f5a4">Overview</a></li>
<li><a href="#org523e2d8">Code organization</a></li>
<li><a href="#org06bd2c4">User experience</a></li>
<li><a href="#orgc90fbcf">Documentation</a></li>
<li><a href="#org2142041">Preparation</a></li>
</ol>
<p><a id="org538f5a4"></a></p>
<h3 id="overview">Overview</h3>
<p>Well, 1 and a half months, much confusion  and 1 baby later, we have officially sunk our teeth into the wolfram&lt;-&gt;clojure bridge. Wolframite, as newly christened by Pawel, is the continuation of Clojuratica: a geat project, pioneered by great people over more than 15 years. As such, the main task for this part of the funding was simply to get to grips with what’s going on underneath before we can prepare it for posterity. A summary of the work so far follows below.</p>
<p><a id="org523e2d8"></a></p>
<h3 id="code-organization">Code organization</h3>
<p>A big part of the work was debugging and merging all of the great things that Pawel and others contributed with the current system. As such, main is now up to date and stable. Examples of incorporated work are making sure that we don’t rely on macros or dynamic vars and that options are passed explicitly. The API has been cleaned up, seprating core functionality from tools etc. and functions and namespaces have been renamed to enforce a standard across the codebase.</p>
<p><a id="org06bd2c4"></a></p>
<h3 id="user-experience">User experience</h3>
<p>For the user, we have particularly worked on the initialization experience. This has involved fixing bugs that prevented the use of wolframengine on linux, type mismatches, reordering engine priorities (Wolfram has different flavours of installation) and having clearer error messages (e.g. when executables and licences are missing). As well as basic streamlining (removing the need for flags etc.), we have ensured a more robust jlink detection, un-lazy interning and significantly faster symbol loading. We have also, with thanks to Daniel Slutsky, integrated support for ’clay’ and the ’kindly’ system, with a plan for allowing users to specify their own clojure&lt;-&gt;wolfram aliases.</p>
<p><a id="orgc90fbcf"></a></p>
<h3 id="documentation">Documentation</h3>
<p>As well as updating the key, user-facing docs, we have also built a series of troubleshooting tips and development documentation that will no doubt grow before (and after) release. This was further complemented with ongoing internal commenting within the source code. Additionally, we have a new demo notebook that illustrates clay and kindly, and two example physics namespaces that demonstrate the bridge for a couple of real-world problems.</p>
<p><a id="org2142041"></a></p>
<h3 id="preparation">Preparation</h3>
<p>Finally, an important part of this early stage has simply been the necessary preparation for the second half, where the lion’s share of our contribution is expected to be felt (particularly now that no more deliveries of small people are expected :) ). Such preparation has largely focused on learning and documenting the internal code structure, opening channels with the official Wolfram team and opening issues: both existing bugs and enhancements highlighted by test use cases.</p>
<p>In the short term, we plan to release wolframite-1.0.0-alpha very soon so that the next stage of development can benefit from community feedback. This should happen as soon as we finalize some &ldquo;getting-started&rdquo; materials. These will be aimed at two target groups: Clojure developers interested in data science, and Mathematica / Wolfram users who would benefit from using the algorithms from Clojure (a real programming language!).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2024 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q2-2024-funding-announcement/</link>
      <pubDate>Mon, 01 Apr 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2024-funding-announcement/</guid>
      <description>We are funding 7 projects for a total of $35K USD in Q2 2024.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce that  we will be funding 7 projects in Q2 2024 for a total of $35K USD (3 for $9K and 4 shorter or more experimental projects for $2K). To date in 2024, we are funding 25 projects or developers for a total of $223,000 USD. This includes the 8 long-term developers whose project work we are supporting for the year. We expect to be able to fund another 7 projects this year for a grand total of $258,000. Thanks to all our members for making this happen!</p>
<p>Based on our recent survey results we know that our members and larger Clojure community rely on this work on a regular (most on a daily) basis.  If we are able to engage more companies or individual developer members, we could support even more important work - so please get the word out.</p>
<p>As usual, we received a LOT of great proposals - so the decision-making was not easy. However, proposals are returned to the pool for another 2 rounds for consideration. We&rsquo;re looking forward to developer updates over the next 3-6 months! Here is a general overview of what each developer plans to work on.</p>
<h2 id="9k-projects">$9K Projects</h2>
<p><a href="#clj-kondo-babashka-squintcherry-michiel-borkent">Clj-kondo, Babashka, Squint/Cherry: Michiel Borkent</a><br>
<a href="#compojure-api-ambrose-bonnaire-sergeant">Compojure-api: Ambrose Bonnaire-Sergeant</a><br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a></p>
<h2 id="2k-projects">$2K Projects</h2>
<p><a href="#clj-merge-tool-kurt-harriger">Clj-merge tool: Kurt Harriger</a><br>
<a href="#enjure-janet-a-carr">Enjure: Janet A. Carr</a><br>
<a href="#lost-in-lambduhhs-podcast-l-jordan-miller">Lost in Lambduhhs Podcast: L. Jordan Miller</a><br>
<a href="#plexus-john-collins">Plexus: John Collins</a></p>
<h2 id="clj-kondo-babashka-squintcherry-michiel-borkent">Clj-kondo, Babashka, Squint/Cherry: Michiel Borkent</h2>
<p>Work for Q2 2024 project will include:<br>
<strong>Clj-kondo:</strong> support Clojure 1.12, other Clojure dialects, most wanted open tickets<br>
<strong>Babashka:</strong> Support new Clojure 1.12 (interop) features, better error messages<br>
<strong>Squint / cherry:</strong> source map support, better nREPL support, better CLJS compatibility  <br></p>
<hr>
<h2 id="compojure-api-ambrose-bonnaire-sergeant">Compojure API: Ambrose Bonnaire-Sergeant</h2>
<p>compojure-api was a popular and actively maintained library to use for web projects around 2014-2018. While its creators have moved on to reitit, there are likely many existing/legacy commercial projects that rely on compojure-api. Lack of support for &ldquo;old&rdquo; or &ldquo;abandoned&rdquo; libraries is a common pain point for Clojure users, and a common complaint about Clojure in the annual surveys. My focus for this project:</p>
<p><strong>Deploy first releases since 2019</strong><br>
Since 2019 compojure-api (and ring-swagger, a sister project) have not seen releases since 2019, as of the time of writing. There are several issues that warrant new releases.</p>
<ul>
<li>compojure-api 1.x<br>
&ndash; vulnerable dependencies</li>
<li>compojure-api 2.0.0-alpha* branch
&ndash; release stable 2.0.0<br>
&ndash; finalize breaking changes from 1.x =&gt; 2.x</li>
<li>ring-swagger<br>
&ndash; include critical memory leak fix <a href="https://github.com/metosin/ring-swagger/pull/148">https://github.com/metosin/ring-swagger/pull/148</a><br>
&ndash; compojure-api will need to bump its ring-swagger version <a href="https://github.com/metosin/compojure-api/issues/454">https://github.com/metosin/compojure-api/issues/454</a></li>
</ul>
<p><strong>House cleaning</strong></p>
<ul>
<li>Review documentation, README&rsquo;s, templates, and wikis for outdated information that have gone stale over the last 5 years.</li>
<li>Review, update and add tests to example projects.</li>
<li>Update CI, linting, and similar tooling that might be applicable.</li>
<li>Triage open issues on compojure-api and ring-swagger. Review open PRs.</li>
<li>Update tutorial <a href="https://github.com/metosin/compojure-api/wiki/Tutorial">https://github.com/metosin/compojure-api/wiki/Tutorial</a> - don&rsquo;t assume knowledge of compojure.</li>
</ul>
<p><strong>compojure-api =&gt; reitit migration tools</strong> <br>
I believe many compojure-api users now use reitit for new projects (as recommended in the compojure-api README), but also have old projects that they wish they could convert to reitit. There are significant performance benefits to using reitit but not all compojure-api projects can be ported since compojure routing is more dynamic than reitit. Even if possible, manually migrating from compojure-api to reitit is error prone and difficult to do incrementally. I would like to build tools to aid converting an existing compojure-api project to reitit.</p>
<p><strong>Swagger 3.0</strong><br>
I would like to investigate what is necessary for supporting Swagger/OpenAPI 3.0 and implement it if time permits.   <br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>At this point, jank has over 80% syntax parity with Clojure. Library parity with <code>clojure.core</code> is around 20%. The next step is to fill out the language to make it feel more like Clojure. There are just a few things remaining  which show up in every Clojure program which I will address in  Q2 2024 project:<br>
<strong>Lazy sequences</strong> <br>
Once we have these, we can implement all sorts of core function goodies, lazy like a cat.</p>
<p><strong>Loop/recur</strong><br>
jank only has function-level <code>recur</code> right now, but <code>loop</code> is even more common.</p>
<p><strong>Destructuring:</strong> This one&rsquo;s actually done at a macro level, but right now <code>let</code>, <code>defn</code>, and friends don&rsquo;t support any destructuring.</p>
<p><strong>Symbol interning</strong><br>
This is a smaller one to tackle, but it&rsquo;s important for reaching parity. Clojure allocates all symbols separately right now, rather than interning them (though keywords and vars are interned).</p>
<p><strong>Bonus for and doseq magic</strong><br>
If there&rsquo;s time, I&rsquo;ll implement all of the craziness that go into the <code>for</code> and <code>doseq</code> macros. All of this will get me where I want to be to start focusing on tooling, distribution, error handling, more robust interop, and overall usability. <code>clojure.core</code> bits will fill in over time and after this quarter we&rsquo;ll have even more of the essentials in there.<br></p>
<hr>
<h2 id="clj-merge-tool-kurt-harriger">Clj-merge tool: Kurt Harriger</h2>
<p>Clojure syntax and style tend to create unnecessary merge conflicts due to bunching of ))) on single line for non-local changes. Manual resolution is often not performed by same person that wrote it and may not be well understood or (re)tested after merge resulting in errors such as moving a form in or out of a else or block changing the code behavior. My project will focus on developing a  git diff and merge tool for edn and clojure code with the aim of creating a git mergetool that can be used as a replacement for git&rsquo;s default merge tool for clj(s) and edn files.</p>
<p>Git&rsquo;s line based merge algorithms can result in frequent and unnecessary conflicts due changes in whitespace and indentation.</p>
<p><strong>What will clj mergetool do differently?</strong><br>
clj mergetool diffs the data structures rather then the lines of text, as a result conflicts resulting from whitespace and indentation changes are far less likely. One such structural diff/patch implementation used successfully in practice is editscript.</p>
<p>However, these structural edits do not preserve whitespace and a single line of code of output even reformatted is not good enough for source code. However, building on rewrite-clj and the associated zipper structure I believe it is possible to preserve essential whitespace when applying structural changes.<br></p>
<hr>
<h2 id="enjure-janet-a-carr">Enjure: Janet A. Carr</h2>
<p>Since this is an experimental project, the focus should be on what might constitute a &lsquo;minimum-viable-project&rsquo;(MVP) to demonstrate the value the Enjure aims to deliver, in accordance with the guiding principles.</p>
<p>The first guiding principle &ldquo;Easy to get going, easy to keep going&rdquo; alludes to my starting: point: The Enjure CLI tooling, since it&rsquo;ll be the first experience all developers will have with it. Largely, I think the Enjure CLI should be able to create new projects and (view/controller) templates as well as delete templates. Migrations are a much bigger task I imagine, and probably outside the scope of an MVP.</p>
<p>Naturally, This implies creating a basic view and controller system. Hardly a compelling idea, but the guiding philosophy of &ldquo;A holistic approach&rdquo; gives us a hint as to how it should function. Essentially, each constituent component of the system should have a defined <em>functional interface</em> such that other components can interact with the system in a preordained manner. For example, consider the Enjure CLI, it should be entirely possible for the Enjure CLI to be a &lsquo;view&rsquo; unto itself, AND should be easy for a developer to use the same functional interface the CLI might use to create a GUI to manage the Enjure project. <br></p>
<hr>
<h2 id="lost-in-lambduhhs-podcast-l-jordan-miller">Lost in Lambduhhs Podcast: L. Jordan Miller</h2>
<p>This proposal sets forth a strategic plan to rejuvenate the &ldquo;Lost In Lambduhhs Podcast,&rdquo; an interview-style technology show for engineers and people working in tech. Through free-form conversational style questions the audience gets the opportunity to &ldquo;meet the person behind the Github&rdquo;.</p>
<p>The goal of each episode is to illuminate the personal narratives and insights of tech luminaries, giving them a platform to share their perspectives while promoting their library or tool. Following a hiatus necessitated by the extensive demands of editing and production, the ambition is to leverage the learnings from the initial seasons, alongside the latest advancements in SaaS platforms and generative AI tools.</p>
<p>My strategy aims to streamline my production process, elevate content quality, and achieve consistent episode releases. &ldquo;Lost in Lambduhhs&rdquo; has already cultivated a loyal audience by uncovering the human stories beneath technological breakthroughs. Now, with advancements in technology and renewed funding, I am excited for the opportunity to refine my production strategy, rendering the crafting of compelling content both more efficient and sustainable. <br></p>
<hr>
<h2 id="plexus-john-collins">Plexus: John Collins</h2>
<p>I will be developing a solid modelling library called Plexus, as well as dependent libraries that bring the full power of Manifold (a state-of-the-art CSG modelling library written in c++) to the Java and, most importantly, Clojure ecosystems. Plexus is an effort to define a declarative data model for solid modeling on top of a robust CSG foundation and combine that with the unmatched interactive development experience that Clojure provides.</p>
<p>The library is usable today. The goal of this work will be to (1) smooth out rough edges and make plexus an approachable, hardened, well-document, well-presented, and well-tested library suitable for consumption by non-experts and (2) extend the functionality to make it more powerful (and possibly more extensible) than it is today.</p>
<p><strong>Here is a list of some of the tasks I hope to accomplish in rough order of priority:</strong></p>
<ol>
<li>Clj-docs for Plexus</li>
<li>Extesive tests</li>
<li>Tutorials, including video tutorials.</li>
<li>Improved error handling and schema validation.</li>
<li>Examples gallery (mostly collected from things I&rsquo;ve already built with it).</li>
<li>Substantial improvement to the Loft algorithm to make it more general and potentially replace a lot of union operations.</li>
<li>Addition of text support to Manifold.</li>
<li>Three-point arcs.</li>
<li>Bezier curves.</li>
<li>Support for more Manifold operations (SmoothOut, etc.)</li>
<li>(Aspirational/experimental) Topology Projections, allowing the user to navigate and &ldquo;draw&rdquo; on the surface of arbitrary manifolds.</li>
<li>ClojureScript Support (via. emscripten build of Manifold)</li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>January &amp; February 2024 Long-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/january-february-2024-long-term-project-updates/</link>
      <pubDate>Mon, 11 Mar 2024 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/january-february-2024-long-term-project-updates/</guid>
      <description>The latest from Batsov, Borkent, Crawley, Heller, McLean, Nikitonsky, Reiman, Taoussanis</description>
      <content:encoded><![CDATA[<p>We&rsquo;re excited to post the first reports of the year from our 2024 long-term developers. There is a lot of great work to catch-up on, so dive in!</p>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER, Clojure-mode, clojure ts-mode  <br>
<a href="#michiel-borkent">Michiel Borkent:</a> clj-kondo, babashka, SCI, squint, nbb, CLI, and more<br>
<a href="#toby-crawley">Toby Crawley:</a> clojars <br>
<a href="#thomas-heller">Thomas Heller:</a> shadow-cljs<br>
<a href="#kira-mclean">Kira McLean:</a> Scicloj Libraries<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Humble UI, Clj-reload, Datascript, and more<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Malli<br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Telemere, Tempel, and more</p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>Another busy couple of months with quite a few achievements, both big and small. This time around I even managed to write a few articles about the bigger achievements! Here are the highlights for this period:</p>
<ul>
<li>CIDER now features preliminary support for <code>clojure-ts-mode</code> (see <a href="https://metaredux.com/posts/2024/02/19/cider-preliminary-support-for-clojure-ts-mode.html">https://metaredux.com/posts/2024/02/19/cider-preliminary-support-for-clojure-ts-mode.html</a> for more details)</li>
<li><code>clojure-mode</code> has full support for &ldquo;tonsky&rdquo;/fixed indentation (see <a href="https://metaredux.com/posts/2024/02/19/configuring-fixed-tonsky-indentation-in-clojure-mode.html">https://metaredux.com/posts/2024/02/19/configuring-fixed-tonsky-indentation-in-clojure-mode.html</a>)</li>
<li>nREPL 1.1.1 is out with improved code completion functionality (see <a href="https://metaredux.com/posts/2024/02/20/nrepl-1-1-1-improved-completion-with-compliment-lite.html">https://metaredux.com/posts/2024/02/20/nrepl-1-1-1-improved-completion-with-compliment-lite.html</a>)</li>
<li><code>clojure-ts-mode</code> 0.2.1 and 0.2.2 were released (see <a href="https://github.com/clojure-emacs/clojure-ts-mode/releases/tag/v0.2.1">https://github.com/clojure-emacs/clojure-ts-mode/releases/tag/v0.2.1</a>)</li>
<li>More improvements are in the pipeline on <code>clojure-ts-mode</code>&rsquo;s front</li>
<li>A new stable CIDER release is likely around the corner</li>
</ul>
<p>On top of this I wrote <a href="https://metaredux.com/posts/2024/02/15/cider-community-impact.html">an article</a> about the positive impact that community-contributed funding
has had on CIDER and friends. Thanks to everyone for their continued support!</p>
<p>P.S. Some of you might be interested to hear that in this period <a href="https://metaredux.com/posts/2024/02/10/the-state-of-flycheck-alive-and-kicking.html">I&rsquo;ve also become of Flycheck&rsquo;s maintainers</a>. I&rsquo;ve spent quite a bit of time working on Flycheck, and I see it very connected to the rest of my projects (e.g. there&rsquo;s <code>flycheck-elgot</code> and <code>flycheck-clj-kondo</code> which many Clojure programmers user)  <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>In this post I&rsquo;ll give updates about open source I worked on during January and February 2024.
To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Like you can read on <a href="https://metaredux.com/posts/2024/02/15/cider-community-impact.html">Bozhidar Batsov</a>&rsquo;s blog these aren&rsquo;t the easiest times for Open Source sponsored software. I have no reason to complain, but I did see a similar drop in sponsoring in the last year. I&rsquo;m thankful for those who sponsored my projects in the past and even more for those who keep doing so! Without <em>you</em>, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all.</p>
<p>Current top tier sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
</ul>
<p>Additional sponsor info: If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!<br>
<a href="https://clojuriststogether.org/">Clojurists Together</a><br>
<a href="https://github.com/sponsors/borkdude">Github Sponsors</a><br>
The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective<br>
<a href="https://ko-fi.com/borkdude">Ko-fi</a><br>
<a href="https://www.patreon.com/borkdude">Patreon</a><br>
If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.  On to the projects that I&rsquo;ve been working on!</p>
<h3 id="updates">Updates</h3>
<p>Here are updates about the projects/libraries I&rsquo;ve worked on last two months.</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy. Released 2024.02.12
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2276">#2276</a>: New Clojure 1.12 array notation (<code>String*</code>) may occur outside of metadata</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2278">#2278</a>: <code>bigint</code> in CLJS is a known symbol in <code>extend-type</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2288">#2288</a>: fix static method analysis and suppressing <code>:java-static-field-call</code> locally</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2293">#2293</a>: fix false positive static field call for <code>(Thread/interrupted)</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2093">#2093</a>: publish multi-arch Docker images (including linux aarch64)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2274">#2274</a>: Support clojure 1.12 new type hint notations</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2260">#2260</a>: calling static <em>field</em> as function should warn, e.g. <code>(System/err)</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1917">#1917</a>: detect string being called as function</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1923">#1923</a>: Lint invalid fn name</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2256">#2256</a>: enable <code>assert</code> in hooks</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2253">#2253</a>: add support for <code>datomic-type-extensions</code> to datalog syntax checking</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2255">#2255</a>: support <code>:exclude-files</code> in combination with linting from stdin + provided <code>--filename</code> argument</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2246">#2246</a>: preserve metadata on symbol when going through <code>:macroexpand</code> hook</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2254">#2254</a>: lint files in absence of config dir</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2251">#2251</a>: support suppressing <code>:unused-value</code> using <code>:config-in-call</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2266">#2266</a>: suppress <code>:not-a-function</code> linter in reader tag</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2259">#2259</a>: <code>ns-map</code> unmaps var defined prior in namespace</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2272">#2272</a>: Report var usage in <code>if</code>/<code>when</code> condition as always truthy, e.g. <code>(when #'some-var 1)</code></li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/472">#472</a>: Use consistent alias</li>
<li><a href="https://github.com/squint-cljs/squint/issues/474">#474</a>: fix JSX fragment</li>
<li><a href="https://github.com/squint-cljs/squint/issues/475">#475</a>: don&rsquo;t crash watcher on deleting file</li>
<li>Add <code>simple-benchmark</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/468">#468</a>: Keywords in JSX should render with hyphens</li>
<li><a href="https://github.com/squint-cljs/squint/issues/466">#466</a>: Fix <code>doseq</code> expression with <code>set!</code> in function return position</li>
<li><a href="https://github.com/squint-cljs/squint/issues/462">#462</a>: Add <code>&quot;exports&quot;</code> field to <code>package.json</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/460">#460</a>: escape <code>&amp;lt;</code> and <code>&gt;</code> in JSX strings</li>
<li><a href="https://github.com/squint-cljs/squint/issues/458">#458</a>: don&rsquo;t emit <code>null</code> in statement position</li>
<li><a href="https://github.com/squint-cljs/squint/issues/455">#455</a>: don&rsquo;t export non-public vars</li>
<li>Fix infix operator in return position</li>
<li>Allow playground to use JSX in non-REPL mode</li>
<li>Add transducer arity to all existing core functions</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting. Two releases in the past two months with the following changes:
<ul>
<li><a href="https://github.com/babashka/babashka/issues/1660">#1660</a>: add <code>:deps-root</code> as part of hash to avoid caching issue with <code>deps.clj</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1632">#1632</a>: fix <code>(.readPassword (System/console))</code> by upgrading GraalVM to <code>21.0.2</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1661">#1661</a>: follow symlink when reading adjacent bb.edn</li>
<li><a href="https://github.com/babashka/babashka/issues/1665">#1665</a>: <code>read-string</code> should use non-indexing reader for compatibilty with Clojure</li>
<li>Bump edamame to 1.4.24</li>
<li>Bump http-client to 0.4.16</li>
<li>Bump babashka.cli to 0.8.57</li>
<li>Uberjar task: support reader conditional in .cljc file</li>
<li>Support reader conditional in .cljc file when creating uberjar</li>
<li>Add more <code>javax.net.ssl</code> classes</li>
<li><a href="https://github.com/babashka/babashka/issues/1675">#1675</a>: add <code>hash-unordered-coll</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1658">#1658</a>: fix command line parsing for scripts that parse <code>--version</code> or <code>version</code> etc</li>
<li>Add <code>clojure.reflect/reflect</code></li>
<li>Add <code>java.util.ScheduledFuture</code>, <code>java.time.temporal.WeekFields</code></li>
<li>Support <code>Runnable</code> to be used without import</li>
<li>Allow <code>catch</code> to be used as var name</li>
<li><a href="https://github.com/babashka/babashka/issues/1646">#1646</a>: command-line-args are dropped when file exists with same name</li>
<li><a href="https://github.com/babashka/babashka/issues/1645">#1645</a>: Support for <code>clojure.lang.LongRange</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1652">#1652</a>: allow <code>bb.edn</code> to be empty</li>
<li><a href="https://github.com/babashka/babashka/issues/1586">#1586</a>: warn when config file doesn&rsquo;t exist and <code>--debug</code> is enabled</li>
<li><a href="https://github.com/babashka/babashka/issues/1410">#1410</a>: better error message when exec fn doesn&rsquo;t exist</li>
<li>Bump <code>babashka.cli</code> to <code>0.8.55</code> which contains subcommand improvements</li>
<li>Bump <code>deps.clj</code> to <code>1.11.1.1435</code></li>
<li>Bump <code>babashka.fs</code> to <code>0.5.20</code></li>
<li>Compatibility with <code>plumbing.core</code></li>
<li>Compatibility with <code>shadow.css</code> by improving <code>tools.reader</code> compatibility</li>
<li><a href="https://github.com/babashka/babashka/issues/1647">#1647</a>: Allow capturing env vars at build time (only relevant for building bb)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes
<ul>
<li><a href="https://github.com/babashka/process/issues/123">#123</a>: <code>exec</code> now converts <code>:env</code> and <code>:extra-env</code> keywords (<a href="https://github.com/lread">@lread</a>)</li>
<li><a href="https://github.com/babashka/process/issues/140">#140</a>: accept <code>java.nio.file.Path</code> as <code>:dir</code> argument</li>
<li><a href="https://github.com/babashka/process/issues/148">#148</a>: accept <code>Path</code> in <code>:out</code>, <code>:err</code> and <code>:in</code></li>
<li>Support <code>:out :bytes</code> (<a href="https://github.com/hansbugge">@hansbugge</a>)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter
<ul>
<li>Released version 0.1.6 which fixes <code>:key-fn</code> + <code>read</code> behavior for cheshire</li>
</ul>
</li>
<li><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and <a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>: use tools.deps directly from babashka
<ul>
<li>Upgraded the underlying tools.build version to the latest version used in tools.build (the very latest wasn&rsquo;t compatible with tools.build!)</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata
<ul>
<li>Support new <code>^[String]</code> metadata notation which desugars into <code>^{:param-tags [String]}</code></li>
<li>Add <code>:map</code> and <code>:set</code> options to coerce map/set literals into customizable data structures, for example, an ordered collections to preserve key order.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI
<ul>
<li>Add <code>cljs.test/run-test</code> macro</li>
<li>Add cljs.core/Atom</li>
<li>Add promesa <code>promesify</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client
<ul>
<li><a href="https://github.com/babashka/http-client/issues/45">#45</a>: query param values are double encoded</li>
</ul>
</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!
<ul>
<li>Fix <a href="https://github.com/babashka/cli/issues/82">#82</a>: prefer alias over composite option</li>
<li>Add <code>:opts</code> to <code>:error-fn</code> input</li>
<li>Fix command line args for test runner <code>--dirs</code>, <code>--only</code>, etc</li>
<li>Fix <code>--no-option</code> (<code>--no</code> prefix) in combination with subcommands</li>
<li>Prioritize <code>:exec-args</code> over spec <code>:default</code>s</li>
<li><code>dispatch</code> improvements (<a href="https://github.com/Sohalt">@Sohalt</a>, <a href="https://github.com/borkdude">@borkdude</a>):
<ul>
<li>The <code>:cmds</code> order of entries in the table doesn&rsquo;t matter</li>
<li>Support parsing intermediate options: <code>foo --opt1=never bar --opt2=always</code></li>
</ul>
</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Bump edamame</li>
<li>Add <code>hash-ordered-coll</code></li>
<li><code>read-string</code> should use non-indexing reader</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>There are many other projects I&rsquo;m involved with but that had little to no activity in the past month. Check out the Other Projects section (more details) of my <a href="https://blog.michielborkent.nl/oss-updates-jan-feb-2024.html">blog here</a> to see a full list.<br>
<em>Published: 2024-02-29</em><br>
<em>Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></em>  <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<h3 id="january-2024">January 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/commit/4c63223f47bd4d94e879acfbfdee8ea6ecd869e3"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/commit/4d5993b0860857276a13874ec42e89f238c30188"><code>infrastructure</code></a></p>
<p>I upgraded the PostgreSQL database from v12.1 to v15.5.</p>
<h3 id="february-2024">February 2024</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/4c63223f47bd4d94e879acfbfdee8ea6ecd869e3...0b131ebcaf21b33cb7106026726d571e4fc47d1c"><code>clojars-web</code></a></p>
<p>This month was a smattering of small changes/fixes:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/bb01ae647468e8591d2de642d1d11ad7e8be18f2">Display username on all pref/admin pages</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/dbe8769339c6470f9a094e1017e695bc85e27a3b">Use a Thread for SQS receive loop to allow UCE to work</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/60c064f9612f98336aebf6bda2845d112ff2827c">Report validity to GitHub on secret scanning requests</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/1655377c40927316c15cfd225dda5470cb801efb">Add admin tooling to soft-delete users</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/d3153018dda214f00569bc8276c9b9dbf28a46c8">Upgrade postgresql driver to address CVE-2024-1597</a>
<br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.27.5 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Notable Updates:</p>
<ul>
<li>Tweaked <code>watch</code> recompile logic to also account for indirect var usages via macros. The usual recompile logic compiles a changed namespace, and then everything which directly required it. This is sometimes insufficient since macros can insert references to other namespaces, without the namespace using the macro having direct knowledge (or require) of that ns. Now all direct accessed vars (after analysis) are collected and used for this logic, making it much more accurate.</li>
<li>Added limited support for npm modules using <code>import()</code> in their code. This is still fairly limited in support, and does not perform actual code splitting as <code>webpack</code> might, but it made some npm modules usable again that would previously just crash.</li>
<li>Worked a lot on <a href="https://github.com/thheller/shadow-grove">shadow-grove</a>. Spent way too much time <a href="https://github.com/thheller/js-framework-shadow-grove">benchmarking</a>, but I feel confident now that performance is quite good and potentially the fastest CLJS <code>react</code>-equivalent available. Also updated the <a href="https://code.thheller.com/shadow-grove-playground/0.6.0/">playground</a>, which I plan on using as the basis for documentation. Still a couple of things to work out, but overall in good shape.  <br></li>
</ul>
<hr>
<h2 id="kira-mclean">Kira McLean</h2>
<p>This is a summary of the work I did on open source projects in January and February 2024. It was published as a blog post <a href="https://codewithkira.com/2024-02-29-clojurists-together-update-jan-feb-2024.html">on my website here</a>.</p>
<h3 id="clojure-tidy-tuesdays">Clojure Tidy Tuesdays</h3>
<p>The main thing I spent my time working on over the past couple of months was a collection of tutorials and guides for working with data in Clojure. The R for Data Science online learning community publishes toy datasets every week for &ldquo;Tidy Tuesdays&rdquo; with a question to answer or example article to reproduce. I&rsquo;ve been going through them in Clojure, and it&rsquo;s proven a great tool for uncovering areas for future development in the Clojure data science ecosystem.</p>
<h3 id="other-work">Other Work</h3>
<p>The explorations with the Tidy Tuesday data have been revealing areas where I think we could benefit from more ergonomic ways to work with tablecloth datasets. I started two little projects each with a couple of little wrappers around existing functions to make them easier to use with tablecloth datasets. So far I&rsquo;m calling them <code>tcstats</code> (for statistical operations on datasets) and <code>tcutils</code> (with miscellaneous dataset manipulation tools that aren&rsquo;t built-in to tablecloth directly).</p>
<p>I am also still working on the Clojure Data Cookbook. I nudged it forward ever so slightly these last couple of months, and I plan to finish it despite the remaining holes in Clojure&rsquo;s data science stack. I would love to also fill these in eventually, but the Cookbook will be a living document that can easily evolve and be updated as new tools and libraries are developed.</p>
<p>Lastly, one of the main missing pieces I&rsquo;m discovering we really need to work on in Clojure&rsquo;s data science ecosystem is a robust yet flexible graphics library. There are a few great solutions that already exist, but they take different approaches to graphing that can make them a bit clumsy to work with when it comes time to build more complex visualisations. My dream is to implement a proper <a href="https://ggplot2-book.org">grammar of graphics</a> in Clojure, giving the Clojure data ecosystem a &ldquo;profressional quality&rdquo; graphics library, so to speak. Anyway.. there is still tons of work to do here so I&rsquo;m grateful for the ongoing funding that will allow me to continue to focus a large amount of time on it for the foreseeable future.  <br></p>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hello guys and gals, Nikitonsky here with some Winter 2024 updates.</p>
<p>New library! <a href="https://github.com/tonsky/clj-reload">Clj-reload</a> is a smarter way to reload Clojure code during development:<br>
Main goal was to replace and improve over <code>tools.namespace</code>:</p>
<ul>
<li>Do not reload everything on first repl/refresh</li>
<li>Allow users to register hooks on namespace unload</li>
<li>Support in-ns and standalone require and use</li>
<li>Not reload namespaces that were never loaded before</li>
<li>Keep defonce values/protocols/types between reload</li>
</ul>
<p>And it worked! Humble UI and my website are already migrated to it, and it feels fantastic to being able to use <code>defonce</code> again, without creating a separate namespace just to hold that one value.</p>
<p>Filipe Silva <a href="https://github.com/clojure-emacs/cider-nrepl/issues/849">is working on CIDER integration</a>, so I hope we’ll see more adoption soon.</p>
<p>If you’ve been using <code>tools.namespace</code>, give <code>clj-reload</code> a try. You might like it better. If you haven’t, it’s time to reconsider your REPL workflow. We have some convincing points in the README.</p>
<p>Oh, and DO check out <a href="https://mastodon.online/@nikitonsky/112021659534638868">our new logo</a>. I’m pretty happy with how it turned out.</p>
<p><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a>:</p>
<ul>
<li>Implemented tricky lazy-loading system</li>
<li>Improved deftype+ stacktraces</li>
<li>Migrated to VDom:
<ul>
<li>gap</li>
<li>label</li>
<li>image</li>
<li>svg</li>
<li>padding</li>
<li>rect, rounded-rect</li>
<li>clip, clip-rrect</li>
<li>halign, valign, center</li>
<li>vscroll, vscrollbar</li>
<li>column, row</li>
<li>hoverable, clickable</li>
<li>button, toggle-button (new!)</li>
<li>slider</li>
</ul>
</li>
<li>Migrated to clj-reload</li>
<li>Jakub Dundalek managed to <a href="https://clojurians.slack.com/archives/C033FTUBWH5/p1709151287356759?thread_ts=1709110584.101919&amp;cid=C033FTUBWH5">run HumbleUI app from GraalVM native image</a></li>
</ul>
<p><a href="https://github.com/HumbleUI/JWM">JWM</a>:</p>
<ul>
<li>macOS: fix fullscreen. Yes, I had to fix something that I didn’t touch for a year and it broke anyways.</li>
</ul>
<p><a href="https://github.com/HumbleUI/humble-deck">Humble Deck</a>:</p>
<ul>
<li>Now supports multiple decks</li>
</ul>
<p><a href="https://github.com/HumbleUI/humble-starter">humble-starter</a>:</p>
<ul>
<li>Simplest possible project to draw a window on a screen</li>
</ul>
<p><a href="https://github.com/tonsky/datascript/">DataScript</a>:</p>
<ul>
<li>Query: shortcircuit clause resolution when result is guaranteed to be empty #459 via @galdre</li>
</ul>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>:</p>
<ul>
<li>Detect namespace from in-ns forms</li>
</ul>
<p><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>:</p>
<ul>
<li>Support colored output (I can finally see colored diffs in failing tests)</li>
</ul>
<p>Blogging:</p>
<ul>
<li><a href="https://tonsky.me/blog/js-bloat/">JavaScript Bloat in 2024</a> (funny side note: other people now translate my articles to Russian because I write in English. How the table have turned!)</li>
<li><a href="https://tonsky.me/blog/clj-reload/">New Library: clj-reload</a></li>
<li><a href="https://tonsky.me/blog/checkbox/">In Loving Memory of Square Checkbox</a></li>
</ul>
<p>Talks:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=HZTrfz-2yW4">Desktop GUI Made Easy</a></li>
</ul>
<p>Onward and upward!</p>
<br>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Worked on a big new release of <a href="https://github.com/metosin/malli">Malli</a> and wrote a <a href="https://www.metosin.fi/blog/2024-01-16-malli-data-modelling-for-clojure-developers">blog post</a> about it.</p>
<p><a href="https://github.com/metosin/reitit">Reitit</a> should be now feature-complete for OpenAPI, will cut out release soon.</p>
<p>Helped users to use and adopt the libs.</p>
<h3 id="0140-2024-01-16">0.14.0 (2024-01-16)</h3>
<ul>
<li>Better development-time tooling
<ul>
<li><code>malli.dev/start!</code> captures all malli-thrown exceptions, see [README](<a href="https://github.com/metosin/malli/blob/master/README.md#development-mode">README.md#development-mode</a> for details</li>
<li>does not log individual re-instrumentation of function vars</li>
<li><strong>BREAKING</strong>: changes in <code>malli.dev.virhe</code> and <code>malli.pretty</code> extension apis, wee <a href="https://github.com/metosin/malli/pull/980">#980</a> for details</li>
</ul>
</li>
<li>New <code>m/deref-recursive</code> to recursive deref all schemas (not <code>:ref</code>s)</li>
<li>FIX: Malli generates incorrect clj-kondo spec for :fn schemas <a href="https://github.com/metosin/malli/issues/836">#836</a> via <a href="https://github.com/metosin/malli/pull/987">#987</a></li>
<li>Support for Var references <a href="https://github.com/metosin/malli/pull/985">#985</a>, see [guide](<a href="https://github.com/metosin/malli/blob/master/README.md#var-registry">README.md#var-registry</a> for details.</li>
<li><strong>BREAKING</strong>: <code>m/coerce</code> and <code>m/coercer</code> throw <code>::m/coercion</code> instead of <code>::m/invalid-input</code></li>
<li>New Guide for <a href="https://github.com/metosin/malli/blob/master/docs/reusable-schemas.md">Reusable Schemas</a></li>
<li>Less printing of Var instumentation</li>
<li><strong>BREAKING</strong>: qualified symbols are valid reference types <a href="https://github.com/metosin/malli/pull/984">#984</a></li>
<li>Fixing <code>mt/strip-extra-keys-transformer</code> for recursive map encoding <a href="https://github.com/metosin/malli/pull/963">#963</a></li>
<li>Support passing custom <code>:type</code> in into-schema opt for <code>:map</code> and <code>:map-of</code> <a href="https://github.com/metosin/malli/pull/968">#968</a></li>
<li><code>mu/path-&gt;in</code> works with <code>:orn</code>, <code>:catn</code> and <code>:altn</code>.</li>
</ul>
<h3 id="something-else">Something else</h3>
<p>Teppo the Dog enjoying the Sun at <a href="https://fi.wikipedia.org/wiki/N%C3%A4sij%C3%A4rvi">Näsijärvi</a>.</p>
<img width="1728" alt="spring-fi" src="https://gist.githubusercontent.com/ikitommi/8c904bfaa17f3871f80d3e20ea84ebb7/raw/1a23548f4d1cc94f6ec836cd4d7e5a039c4a35ad/teppo-nassy.jpg">
<br>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<h3 id="open-source-update">Open source update</h3>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and other sponsors of my open source work!</p>
<p>It&rsquo;s been a productive start to the year! Have been focused almost entirely on open source. Output has included:</p>
<h3 id="7x-library-releases">7x library releases</h3>
<p>This includes <a href="https://github.com/http-kit/http-kit/releases/tag/v2.8.0-RC1">http-kit v2.8.0-RC1</a> (tons of new stuff in here!), <a href="https://github.com/taoensso/tempel/releases/tag/v1.0.0-RC1">Tempel v1.0.0-RC1</a>, <a href="https://github.com/taoensso/nippy/releases/tag/v3.4.0-RC2">Nippy v3.4.0-RC2</a>, and <a href="https://github.com/taoensso/timbre/releases/tag/v6.5.0">Timbre v6.5.0</a>.</p>
<p>See <a href="https://www.taoensso.com/news#open-source">here</a> for the full list, and also <a href="https://www.taoensso.com/roadmap">here</a> for a new GitHub-hosted <strong>roadmap of my major upcoming open source work</strong>.</p>
<h3 id="new-tempel-explainer-video">New Tempel explainer video</h3>
<p>I recorded a short <a href="https://www.youtube.com/watch?v=sULZVFhR848">video</a> to explain the new/upcoming <a href="https://www.taoensso.com/tempel">Tempel</a> <strong>data security framework</strong>.</p>
<p>This hopefully helps makes it clearer where Tempel can be useful.</p>
<p>The ultimate goal is to try make it feasible for more Clojure devs to incorporate <strong>data security in their apps</strong>, and/or at least get more Clojure devs thinking about ways to protect their users’ data.</p>
<p>It can be easier than you expect, and I detail one example pattern in the video.</p>
<p>BTW please let me know if there&rsquo;s interest in me doing more of these kinds of videos in future.</p>
<h3 id="london-clojurians-talk">London Clojurians Talk</h3>
<p>On 20 Feb I gave an online talk at the London Clojurians Group. The talk&rsquo;s now <a href="https://www.youtube.com/watch?v=Jz9NcnQbH5I">on YouTube</a>.</p>
<p>Had a good time, was fun talking with folks there. A big thanks to <a href="https://x.com/BrunoBonacci">Bruno Bonacci</a> for organizing and hosting!</p>
<p>The talk was non-technical, titled:</p>
<blockquote>
<p><strong>Some controversial truths</strong>: challenging some commonly-held ideas about Clojure, software engineering, and startups; and sharing the 1 secret that will solve all your problems.</p>
</blockquote>
<p>Part of the talk&rsquo;s intention was to discuss some of the trade-offs that Clojure users/businesses should be aware of, but it looks like the Q&amp;A after was unfortunately not recorded.</p>
<p>Please ping if there&rsquo;s interest in me posting a write-up to summarize some of the key points discussed.</p>
<h3 id="interview-with-daniel-compton">Interview with Daniel Compton</h3>
<p>Had a really nice <a href="https://t.co/VmwvbxAzC5">chat</a> with <a href="https://x.com/danielwithmusic">Daniel Compton</a> about my open source work and other projects. (Thanks Daniel!)</p>
<p>To avoid possible confusion re: discussed dates/timelines, please note that this was recorded at the end of last year (2023).</p>
<h3 id="lots-of-work-on-telemere">Lots of work On Telemere</h3>
<p>Have been putting in a lot of work on the upcoming <a href="https://www.taoensso.com/telemere">Telemere</a> <strong>structured telemetry</strong> library for Clojure/Script.</p>
<p>Along with Tempel, this&rsquo;ll be my first all-new Clojure library in 7+ years.</p>
<p>Very happy with how it&rsquo;s coming along so far, and looking forward to sharing more closer to release (hopefully this <a href="https://www.taoensso.com/roadmap">April</a>).</p>
<p>In some ways Telemere represents the culmination and refinement of many years of ideas from some of my other libraries - notably <a href="https://www.taoensso.com/timbre">Timbre</a> and <a href="https://www.taoensso.com/tufte">Tufte</a>.</p>
<p>I think the result is going to be really nice - and something possible only in Clojure.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>All major upcoming work is now documented live <a href="https://taoensso.com/roadmap">here</a>. In addition to all the usual maintenance and support, my biggest objectives for this year are definitely <a href="https://www.taoensso.com/telemere">Telemere</a> and a major<a href="https://www.taoensso.com/carmine">Carmine</a> update.</p>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Feb. 2024 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/feb.-2024-short-term-project-updates/</link>
      <pubDate>Mon, 04 Mar 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/feb.-2024-short-term-project-updates/</guid>
      <description>CIDER, clojure-lsp, Jank, Scicloj, Sitefox, UnifyBio</description>
      <content:encoded><![CDATA[<br>
Our first round of reports is in from some of our Q1 2024 deveopers.  
<p><a href="#benjamin-kamphaus-unifybio">Benjamin Kamphaus: UnifyBio</a><br>
<a href="#chris-mccormack-sitefox">Chris McCormack: Sitefox</a><br>
<a href="#daniel-slutsky-scicloj">Daniel Slutsky: Scicloj</a><br>
<a href="#eric-dallo-clojure-lsp">Eric Dallo: clojure-lsp</a><br>
<a href="#jeaye-wilkerson-jank">Jeaye  Wilkerson: Jank</a><br>
<a href="#vemv-cider">VEMV: CIDER</a></p>
<h2 id="benjamin-kamphaus-unifybio">Benjamin Kamphaus: UnifyBio</h2>
<p>2024 Q1 Project Report 1. Published 15 February 2024.</p>
<p><strong>Accomplished so far:</strong></p>
<ul>
<li>Completed lightweight schema definition and spec, an example of which can be found
<a href="https://github.com/vendekagon-labs/unify/blob/main/test/resources/systems/patient-dashboard/schema/unify.edn">here</a></li>
<li>Users can now stand up a local system with the
<a href="https://github.com/vendekagon-labs/datomic-query-service">plain JSON datalog query service</a> and
<a href="https://github.com/vendekagon-labs/unify-schema-browser">schema browser</a> (see image below)
using docker compose</li>
<li>Very basic quickstart steps are now included in the updated README</li>
<li>Added the ability to retract a Unify managed dataset</li>
<li>Streamed on twitch for a few weeks but paused that, moving all Unify dev to YouTube (see more below).</li>
</ul>
<p><strong>For the short term, my goals are:</strong></p>
<ul>
<li>Prioritize dataset lifecycle management, dataset lifecycle scenario tests, tutorials</li>
<li>Delay work on additional backends and streaming processing until I hit a stable point re: ^
<img width="1368" alt="schema-view" src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/0a5eb26d-14a1-488e-ad3a-bbecefccfba1">
*View of the schema browser, now part of the local Unify system (adapted from alzabo by Mike Travers)</li>
</ul>
<p>At this point, Unify is in a decent shape as an alpha for prototyping/experimental work.
I’d hold on using it for production, though things are stabilizing pretty quickly.</p>
<p><strong>Two ways to make use of Unify that I think would be straightforward for its current state:</strong></p>
<ul>
<li>For anyone already using Datomic, who wants to import data that is in tabular form, or can be turned into a table,
they could have a go at
<a href="https://github.com/vendekagon-labs/unify/blob/main/test/resources/systems/candel/template-dataset/schema/metamodel.edn">adding Unify annotations</a>
to their existing schema and writing an
<a href="https://github.com/vendekagon-labs/unify/blob/main/test/resources/systems/candel/small-reference-import/config.edn">import config</a></li>
<li>For anyone wanting to start working incrementally at data modeling for a new domain, Unify can provide a good
interactive environment for vetting how data out in the world, e.g. in tables, might map on to your schema, and you can
visualize the data model and connections between entities as you go with the schema browser.</li>
</ul>
<p>Edges are sharp and documentation is still limited but more detailed tutorials are coming soon!</p>
<p>If anyone is interested in getting stated with using Unify for data integration, or just importing tables into their Datomic schema, but are a bit wary of jumping into this blind, I&rsquo;m on the Clojurians Slack as:<br>
<code>@Ben Kamphaus</code></p>
<p>In the channels:<br>
<code>[#unify, #datomic, #data-science, #data-engineering]</code></p>
<h3 id="notes-on-streaming">Notes on Streaming</h3>
<p>I started streaming dev on Unify with Twitch but have had some frustrations with the platform
and gotten feedback that YouTube would be better for streaming also, not just collecting videos.
It&rsquo;s not worth going into too much detail on this, mainly I want to point people to the
<a href="https://www.youtube.com/@VendekagonLabs">YouTube channel</a> if they want to follow along as I
get this aspect of the work going again.</p>
<p>Thanks to Clojurists Together and the Rare Cancer Research Foundation for supporting this work!  <br></p>
<hr>
<h2 id="chris-mccormack-sitefox">Chris McCormack: Sitefox</h2>
<p>2024 Q1 Project Report 1. Published 15 February 2024.</p>
<p>Hello! The first half of my Clojurists Together funded work on Sitefox is complete. I made around 50 commits to the project since the start of the year and this is a quick summary of the progress I&rsquo;ve made.</p>
<p>My broad goal with the Clojurists Together funding is to make it safer and easier for other people to get started and build sites and apps on Sitefox. There are two components to this:<br>
a) improving documentation and setup tooling<br>
b) improving security and stability</p>
<h3 id="updating-dependencies">Updating dependencies</h3>
<p>I started the process of updating dependencies with an <code>npm audit</code>. This command finds npm packages with known vulnerabilities. I updated the npm package <code>nodemailer</code> due to a vulnerability, and I also <code>express</code>, <code>nbb</code>, and <code>react</code>. I also updated Clojure deps Promsea, and js-interop. This was the first part of the dependency updates item.</p>
<p>The second part of the dependency updates item was to replace the deprecated <code>csurf</code> module. This Express module is responsible for securing POST requests against CSRF attacks. Express is the web server that Sitefox depends upon and they have decided to no longer provide this module themselves.</p>
<p>Replacing this module turned out to be a bigger task than I anticipated. I started by evaluating several libraries as replacement candidates. Next I created a branch to try out one of these replacements. At first it looked like the library was a good replacement, but it was only upon more rigorous testing that I realized it had serious flaws that made it unsuitable.</p>
<p>This experience made it clear to me that I needed comprehensive testing of the form submission and authentication flows in order to tell if a library was a good replacement and did not introduce any bugs or regressions. This led me to work on the second part of the work.</p>
<h3 id="end-to-end-testing">End-to-end testing</h3>
<p>I spent the greater proportion of the commits after this working on end-to-end tests of basic Sitefox functionality including:</p>
<ul>
<li>Tests for basic server functionality - does the web server run, render pages, and respond to requests?</li>
<li>Tests for the main authentication flows such as signing up, signing in, signing out, forgot password.</li>
<li>Tests for form submission and field validation, including CSRF protection.</li>
<li>Tests for CSRF protection on Ajax POSTs.</li>
</ul>
<p>I managed to get all of these tests implemented and passing except for the final Ajax test which I am still working on. After that I got the tests running headless on every commit via a GitHub action. This will ensure that the most basic functionality Sitefox offers won&rsquo;t be inadvertently broken when I make major changes in future. In particular I can ensure the CSRF protection continues to work after upgrading to a different CSRF library.</p>
<h3 id="what-is-next">What is next</h3>
<p>From my initial plan I have only managed to make progress on these two items. My goal for the remainder of Q1 is:</p>
<ol>
<li>Finish the CSRF Ajax testing.</li>
<li>Finish replacing the <code>csurf</code> dependency with a well-tested alternative.</li>
<li>Update the key-value database module list and filtering code.</li>
<li>Move the <code>npm create</code> helpers into the main repo, and document them properly.</li>
<li>Tutorials showing how to get started building on top of Sitefox.</li>
</ol>
<p>Given the progress of the first half of the quarter, I have tempered my goals a bit. If I can get these items done that will still provide a solid foundation for people wanting to get started with Sitefox and rely on it to build sites and apps.</p>
<p>You can see the board I am using to track progress here:
<a href="https://github.com/users/chr15m/projects/13/views/1">https://github.com/users/chr15m/projects/13/views/1</a></p>
<p>Thanks for your interest and your support!<br></p>
<hr>
<h2 id="daniel-slutsky-scicloj">Daniel Slutsky: Scicloj</h2>
<p>2024 Q1 Project Report 1. Published 29 February 2024.</p>
<p>February 2024 was the first of three months on the Clojurists Together project titled &ldquo;Scicloj Community Building and Infrastructure&rdquo;.</p>
<p>Scicloj is an open-source group developing Clojure tools and libraries for data and science.</p>
<p>As a community organizer at Scicloj, my current role is to help the emerging Scicloj stack become easier and more accessible for broad groups of Clojurians. This is done in collaboration with a few Scicloj members.</p>
<p>In February 2024, this has been about the following projects:</p>
<h3 id="clayhttpssciclojgithubioclay"><a href="https://scicloj.github.io/clay/">Clay</a></h3>
<p>Clay is a namespace-as-a-notebook tool for literate programming and data visualization developed in collaboration with Timorthy Prately. It is used for documenting <a href="https://scicloj.github.io/clay/#example-projects-using-clay">libraries and tutorials</a> as well as an analysis tool for dynamic data exploration.</p>
<p>In February 2024, Clay got five new releases, mostly around the following:</p>
<ul>
<li>improved compatibility of various visual elements with <a href="https://quarto.org/">Quarto</a></li>
<li>improved support for making books</li>
<li>simplified live-reload experience</li>
<li>support for <a href="https://observablehq.com/">Observable</a> visualizations</li>
<li>additional user-reported bugs and feature requests</li>
</ul>
<p>Many thanks to generateme for the extensive testing and the numerous issues discovered.<br>
In March 2024, the plan is mostly to continue user support and move from the alpha to the beta stage.</p>
<h3 id="nojhttpssciclojgithubionoj"><a href="https://scicloj.github.io/noj/">Noj</a></h3>
<p>Noj is a project that collects a few recommended libraries for data and science in a bundle and adds some convenience layers for using them together.</p>
<p>During February 2024, we had some rethinking of this project&rsquo;s scope and goals in discussion with Carsten Behring, who got involved in the project and has made some substantial contributions to its documentation.</p>
<p>My goal has been mostly to review Carsten&rsquo;s work and add some documentation. For March 2024, the hope is to clarify the project&rsquo;s goals and reorganize its relationships with other libraries accordingly.</p>
<h3 id="clojure-data-scrapbookhttpssciclojgithubioclojure-data-scrapbook"><a href="https://scicloj.github.io/clojure-data-scrapbook/">Clojure Data Scrapbook</a></h3>
<p>The Clojure Data Scrapbook is intended to be a community-driven collection of tutorials around data and science in Clojure.</p>
<p>In February 2024, I added a few tutorials and made some changes to the project structure. For March 2024, the main goal is to clarify the contribution workflow and encourage contributions.</p>
<h3 id="dev-and-study-groupshttpssciclojgithubiodocscommunitygroups"><a href="https://scicloj.github.io/docs/community/groups/">Dev and study groups</a></h3>
<h3 id="visual-toolshttpssciclojgithubiodocscommunitygroupsvisual-tools"><a href="https://scicloj.github.io/docs/community/groups/visual-tools/">visual-tools</a></h3>
<p>In the visual-tools group, we began <a href="https://clojureverse.org/t/visual-tools-meeting-21-ggplot-study-session-1-summary-recording/10604">a new series</a> of study sessions around <a href="https://ggplot2.tidyverse.org/">ggplot2</a> and the grammar of graphics.</p>
<p>The intention is to implement a similar library in Clojure.</p>
<p>In February 2024, my attention has been around prototyping possible solutions, <a href="https://scicloj.github.io/clojure-data-scrapbook/projects/datavis/ggplot/index.html">exploring ggplot and its internals</a>, and creating a group of people who are interested in learning it. A few datavis-minded Clojurians have gathered a group and started thinking together, <a href="https://www.youtube.com/watch?v=6BYObNV2pxk">in meeting</a> and <a href="https://scicloj.github.io/docs/community/chat/">over chat</a>.</p>
<p>In March 2024, we will keep learning together. Hopefully, the ideas will be clarified, and some of the group members will start building something.</p>
<h3 id="real-world-datahttpssciclojgithubiodocscommunitygroupsreal-world-data"><a href="https://scicloj.github.io/docs/community/groups/real-world-data/">real-world-data</a></h3>
<p>The real-world-data group will be a space for Clojure data and science practitioners to bring their own data projects, share experiences, and evolve common practices.</p>
<p>In February 2024, I restarted the group organization, mostly in one-on-one calls and chats with a few of the people who are planning to join.</p>
<p>In March 2024, we are expecting to have the first meeting.</p>
<h3 id="your-feedback-would-help">Your feedback would help</h3>
<p>Scicloj is in transition. On the one hand, quite a few of the core members have been very active recently, developing the emerging stack of libraries. At the same time, new friends are joining, and it seems like soon, more people will enjoy the Clojure for common data and science needs.</p>
<p>If you have any thoughts about the current directions, or if you wish to discuss how the evolving platform may fit your needs, please <a href="https://scicloj.github.io/docs/community/contact/">reach out</a>.  <br></p>
<hr>
<h2 id="eric-dallo-clojure-lsp">Eric Dallo: clojure-lsp</h2>
<p>2024 Q1 Project Report 1. Published 29 February 2024.</p>
<h3 id="january-2024-update">January 2024 Update:</h3>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlight is the new custom project tree feature which shows project source-paths, dependencies, jars and namespaces!
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/f501b1a0-3ffe-41e7-8d69-a35d9a359d55" alt="project-tree">
<br></p>
<h3 id="20240201-110159">2024.02.01-11.01.59</h3>
<ul>
<li>
<p>General</p>
<ul>
<li>Fix binary not wokring on some aarch64 linux. #1748</li>
<li>Add new <code>Project tree</code> feature via the <code>clojure/workspace/projectTree/nodes</code> custom method. #1752</li>
<li>Fix <code>--log-path</code> setting to work with <code>listen</code>/empty arg, starting clojure-lsp server and logging properly.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Fix <code>didChangeConfiguration</code> throwing exception. #1749</li>
<li>Fix <code>rename</code> of ns causing wrong ns names because of duplicate rename actions. #1751</li>
<li>Fix <code>range-formatting</code> throwing exceptions when unbalanced parens are sent from client. #1758</li>
<li>Fix rename functions need to clean up LSP state or restart in some clients implementing LSP method <code>didRenameFiles</code>. #1755</li>
<li>Fix <code>thread last all</code> failed after comment form <code>#_(...)</code>. #1745</li>
</ul>
</li>
</ul>
<p>Besides the clojure-lsp work, I worked too on some related projects that I think are important to improve clojure-lsp visibility and standardization as a tool, for example clojure-repl-intellij which without it make the use of clojure-lsp-intellij less valuable.</p>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h3 id="11416---11417">1.14.16 - 1.14.17</h3>
<ul>
<li>Bump clojure-lsp to <code>2024.02.01-11.01.59</code>.</li>
<li>Add shortcuts to backward slurp and barf.</li>
<li>Add shortcut documentation to all features, check the features doc page.</li>
<li>Fix Rename feature not being available for some cases.</li>
</ul>
<h3 id="clojure-repl-intellijhttpsgithubcomafucherclojure-repl-intellij"><a href="https://github.com/afucher/clojure-repl-intellij">clojure-repl-intellij</a></h3>
<ul>
<li>Support for starting local repl besides the already available remote repl.</li>
</ul>
<h3 id="february-2024-update">February 2024 Update</h3>
<h3 id="clojure-lsphttpsclojure-lspio-1"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlight is the new linter different-aliases helps guarantee consistency across alias in your codebase!<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/940cd94d-8714-4d67-90d7-30f204bd45cf" alt="different-aliases"></p>
<h3 id="20240301-113751">2024.03.01-11.37.51</h3>
<ul>
<li>
<p>General</p>
<ul>
<li>Bump clj-kondo to <code>2024.02.13-20240228.191822-15</code>.</li>
<li>Add <code>:clojure-lsp/different-aliases</code> linter. #1770</li>
<li>Fix unused-public-var false positives for definterface methods. #1762</li>
<li>Fix rename of records when usage is using an alias. #1756</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Fix documentation resolve not working for clients without hover markdown support.</li>
<li>Added setting to allow requires and imports to be added within the current comment form during code action and completion: <code>:add-missing :add-to-rcf</code> #1316</li>
<li>Fix <code>suppress-diagnostics</code> not working on top-level forms when preceded by comment. #1678</li>
<li>Fix add missing import feature on some corner cases for java imports. #1754</li>
<li>Fix semantic tokens and other analysis not being applied for project files at root. #1759</li>
<li>Add support for adding missing requires and completion results referring to JS libraries which already have an alias in the project #1587</li>
</ul>
</li>
</ul>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij-1"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h3 id="1148---11410">1.14.8 - 1.14.10</h3>
<ul>
<li>Fix exception when starting server related to previous version.</li>
<li>Fix some exceptions that can rarely occurr after startup.</li>
<li>Bump clojure-lsp to <code>2024.02.01-11.01.59</code>.  <br></li>
</ul>
<hr>
<h2 id="jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</h2>
<p>2024 Q1 Project Report 1. Published 26 February 2024.</p>
<p>tl;dr I&rsquo;m well ahead of schedule, so far this quarter! There&rsquo;s a more detailed update
here, with technical explanations: <a href="https://jank-lang.org/blog/2024-02-23-bindings/">https://jank-lang.org/blog/2024-02-23-bindings/</a></p>
<h3 id="dynamic-bindings">Dynamic bindings</h3>
<p>Dynamic bindings are implemented! I&rsquo;m starting to use these within the compiler,
as well, to track state. jank doesn&rsquo;t have <code>future</code> yet, but everything
is in place for binding conveyance. To go hand in hand with this, I tackled meta
hints next, allowing us to do things like <code>^:dynamic</code> on a var.</p>
<h3 id="meta-hints">Meta hints</h3>
<p>jank now supports hints in the form of <code>^:keyword</code>, as well as <code>^{:keyword true}</code>.
Multiple hints can be specified, they can be nested, etc. Not many parts
of jank are using these hints yet, since I didn&rsquo;t go through all existing code
to update usages, but we can do that iteratively.</p>
<h3 id="what-else">What else?</h3>
<p>Well, my quarter was booked for the following tasks:</p>
<ul>
<li>🗹 Dynamic vars</li>
<li>🗹 Meta hints</li>
<li>☐ Syntax quoting</li>
<li>☐ Normalized interpolation syntax</li>
</ul>
<p>The first two are done and the latter two remain, to be done in the next month.
But is that all I did in two months? Just dynamic vars and meta hints? Nah.</p>
<h3 id="support-for-exceptions">Support for exceptions</h3>
<p>I&rsquo;ve added support for the special <code>throw</code> form, as well as for <code>try/catch/finally</code>.
Previously, I was using inline C++ to throw exceptions, but the work on the
dynamic vars gave me a good excuse to get proper exception support in there. I
needed to ensure bindings were gracefully handled in exceptional scenarios!</p>
<p>My plan is to do a compiler deep dive, next post, going into how exceptions were
implemented in jank. Stay tuned for that.</p>
<h3 id="escaped-string-literals">Escaped string literals</h3>
<p>jank previously didn&rsquo;t properly support strings like <code>&quot;foo \&quot;bar\&quot; spam&quot;</code>, since
they require mutation in order to unescape them. This is an interesting edge
case, because all of the other tokens within jank&rsquo;s lexer work based on memory
mapped string views. String views allow jank&rsquo;s lexer to run without any dynamic
allocations at all. However, for escaped strings, we need to allocate a string,
since we need to mutate it when unescaping. It&rsquo;s straight-forward, but just
something I hadn&rsquo;t tackled yet.</p>
<h3 id="reader-macros">Reader macros</h3>
<p>Since I was improving the reader to support meta hints, I figured I&rsquo;d add reader
macro support. In jank, you can now use <code>#_</code> to comment out forms. Also, you can
use <code>#{}</code> to create sets. Finally, you can use <code>#?(:jank foo)</code> and <code>#?@(:jank [])</code> to
conditionally read in jank code. The <code>:default</code> option is supported, too.
Support for shorthand functions, regex values, and var quotes will be
coming soon.</p>
<h3 id="new-core-functions-and-macros">New core functions and macros</h3>
<p>While implementing the above features, I also added support for the following
vars in <code>clojure.core</code>:</p>
<ul>
<li><code>assert</code></li>
<li><code>when-not</code></li>
<li><code>comment</code></li>
<li><code>zipmap</code></li>
<li><code>binding</code></li>
<li><code>with-redefs</code></li>
<li><code>drop</code> (not lazy)</li>
<li><code>take-nth</code> (not lazy)</li>
</ul>
<p>Since jank doesn&rsquo;t have lazy sequences yet, some of these functions are a little
hacky. Lazy sequences come next quarter, though, as well as <code>loop</code> support!</p>
<h3 id="community-involvement">Community involvement</h3>
<p>jank received its first non-trivial code contributions
this quarter, from a helpful man named <a href="https://github.com/Samy-33">Saket Patel</a>.
He&rsquo;s working on a <a href="https://github.com/Samy-33/lein-jank">jank plugin</a> for leiningen
and it&rsquo;s currently in a state where you can set up a multi-file jank project and
use <code>lein jank run</code> to make magic happen. 😁 He&rsquo;s also submitted some C++
improvements to aid in that quest and to help jank compile on Apple M1 hardware.
I&rsquo;ll have a more detailed demonstration of this in my next development update.</p>
<p>On top of that, in order to get him set up for contributing, I&rsquo;ve done the
following:</p>
<ul>
<li>Added a <a href="https://github.com/jank-lang/jank/blob/main/CODE_OF_CONDUCT.md">Code of Conduct</a></li>
<li>Added a <a href="https://cla-assistant.io/jank-lang/jank">CLA</a>, which is managed by a
bot that will prompt you to sign upon submitting a PR with a large enough</li>
<li>Added automated code formatting and re-formatted the whole codebase, using
clang-format. I don&rsquo;t like the look of it, but at least it&rsquo;s consistent <br></li>
</ul>
<hr>
<h2 id="vemv-cider">VEMV: CIDER</h2>
<p>2024 Q1 Project Report 1. Published 7 February 2024.</p>
<p>January CT-sponsored work resulted in CIDER <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.13.0">1.13.0</a> (&ldquo;Santiago&rdquo;) and a subsequent <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.13.1">1.13.1</a> bugfix release.</p>
<p>Highlights have included:</p>
<ul>
<li>all-new Timbre compatibility for <a href="https://docs.cider.mx/cider/debugging/logging.html">cider-log-mode</a>.</li>
<li>misc bugfixes, a couple of which were highly requested over the Clojurians Slack <code>#cider</code> channel.</li>
</ul>
<p>There&rsquo;s also been some WIP to improve our cljfmt integration.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for Proposals. February 2024 Member Survey</title>
      <link>https://www.clojuriststogether.org/news/call-for-proposals.-february-2024-member-survey/</link>
      <pubDate>Tue, 13 Feb 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-proposals.-february-2024-member-survey/</guid>
      <description>We are awarding up to $44K for Q2 2024 Projects</description>
      <content:encoded><![CDATA[<br>
<h2 id="call-for-proposals">Call for Proposals.</h2>
<p>Greetings All! It&rsquo;s that time again.</p>
<p>Clojurists Together is pleased to announce that we are opening our Q2 2024 funding round for Clojure Open Source Projects.  Applications will be accepted through the 4th of March 2024 (midnight Pacific Time). We are looking forward to reviewing your proposals! <a href="https://clojuriststogether.org/open-source/">More information and the application can be found here.</a></p>
<p>We will be awarding up to $44,000 USD for a total of 6-8 projects. The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established. Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed. We expect projects to start on April 1, 2024.</p>
<p>We surveyed our members in February to find out what types of initiatives they would like us to focus on for this round of funding. Their responses are summarized below. In particular, it was great to see members' feedback relating to how often they used or referred to developers' work we have funded. Check this out!</p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/988c9baf-2811-4993-ac14-455d06935e4c" alt="Use of work Feb 2024"></p>
<p>If you are working on a Clojure open source project or have a new one in mind, especially one mentioned as a focus area for our members, consider applying. Or if you know someone that might be interested, please pass this information along. Let&rsquo;s get the word out!  If you have questions, please contact Kathy Davis at <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a>.</p>
<h2 id="our-members-speak-feedback-from-the-february-2024-survey">Our Members Speak: Feedback from the February 2024 Survey.</h2>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/761a93b3-c162-4b17-b7a9-e8ba124906fc" alt="platforms targeted feb 24"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/f67455b9-8fba-4701-b879-013568e50aae" alt="clojure improvement feb 24"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/0455fc0b-e743-4f5c-895d-c19b7b273f8d" alt="clojurescript improvements feb 24">
<br></p>
<hr>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<ul>
<li>Fractured build tooling. Deps feels like ant from java land still, every project a bit different with all the aliases. Lein was fine</li>
<li>A Clojure specific job platform would be great?</li>
<li>Development tools, AI/ML.</li>
<li>Data science/ML stack. Really don&rsquo;t want to use python if I can help it.</li>
<li>Visualisation</li>
<li>Tooling like CIDER</li>
<li>Evangelism, Attracting more new users</li>
<li>In-person conferences in Europe</li>
<li>The ecosystem could use more beginner material and ergonomic tooling to help beginners get started.</li>
<li>Newcomer DX. Otherwise, the community will die out.</li>
<li>The React story has been good at first but React&rsquo;s ecosystem is evolving and the ClojureScript counterparts aren&rsquo;t really keeping up. There&rsquo;s no common best practices for architecting SSR, code splitting etc.</li>
<li>Cljs build tools, type linters, DX</li>
<li>Documentation, Building and Test tooling-related areas</li>
<li>Better ways to build desktop applications.</li>
<li>Error messages, error messages, error messages. </li>
<li>I think the Google Closure Compiler is nearing the end of its life, so we should be supporting efforts that provide a more certain future for ClojureScript.</li>
<li>Malli schemas, datalog, electric, component<br></li>
</ul>
<hr>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong? </h3>
<ul>
<li>Too many to list! Clojure is just amazing - I just love coding in it.</li>
<li>Core language and Libs</li>
<li>Community.  Response from and helpfulness of community members. The community is also very kind.</li>
<li>Stability, backwards compatibility, performance</li>
<li>Shadow-cljs works great, most development tooling is quite good</li>
<li>Clojurian Slack - <a href="https://clojure.org/api/cheatsheet">https://clojure.org/api/cheatsheet</a></li>
<li>The overall API stability of the libraries - Babashka - ClojureScript and Shadow-cljs</li>
<li>IDE support, Linters, Data Analysis/Processing Frameworks
Language expressively, ability to write clean code, REPL-oriented development<br></li>
</ul>
<hr>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>(Number of mentions in parentheses):</p>
<ul>
<li>Malli (8) and code quality tools generally, things that address the misconception that dynamic typing is malpractice relative to stat</li>
<li>Shadow-cljs (5) </li>
<li>Cider (5)</li>
<li>Babashka  (4) and more libraries useable in this domain (e.g. writing Excel files) </li>
<li>Jank (4)</li>
<li>Clojure-lsp (3)</li>
<li>com.github.seancorfield/honeysql(3)</li>
<li>com.github.seancorfield/next.jdbc(3)   </li>
<li>metosin/reiti(3)</li>
<li>Clj-kondo (2)</li>
<li>uix v2 (2)</li>
<li>Calva (2) for an improved developer experience (not the same as more features). </li>
<li>Tech.ml.dataset (2) is looking really good - Chris&rsquo;s projects need to be included</li>
<li>Ring (4)</li>
<li>Re-frame(2)</li>
<li>Reagent(2)</li>
<li>Flowstorm (2)</li>
<li>Integrant (2)</li>
<li>Borkdude (2)</li>
<li>I still use lein for new projects because it is easy. It runs tests and the uberjar function is right there.</li>
<li>(1 each) Pathom and related, Asami, nt, uncomplicate libs, Data science stack, Core.typed, nbb, Clojure-ts-mode, Duct , Taoensso (tufte, timbre, sente), Weavejester (ragtime, crypto-password), Luminus/ring-undertow-adapter, com.fzakaria/slf4j-timbre, Conjure, ‘com.widdindustries/cljc.java-time, Datahike, Migratus, Hiccup, Oz, Scicloj</li>
<li>I would like a replacement for Oz to render vega/vega-lite, which isn&rsquo;t maintained anymore, and <a href="https://github.com/scicloj/viz.clj">https://github.com/scicloj/viz.clj</a> exists, which looks promising. Don&rsquo;t really care for the added layer of hanami in between-on top.</li>
<li>This Clojure Conj 2023 made me think that Clojure could rock really rock Data Science(2): <a href="https://www.youtube.com/watch?v=MguatDl5u2Q">https://www.youtube.com/watch?v=MguatDl5u2Q</a> </li>
<li>I don&rsquo;t mind using Java interop now and again, but I would like to avoid having to write extensive Java in Clojure syntax.
Currently high on my list: anything bbatsov does (Cider, of course)</li>
<li>Nikita&rsquo;s Humble UI is a big deal for me - I hope it will get desktop app development going in a bigger way with Clojure  <br></li>
</ul>
<hr>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h3>
<ul>
<li>Comments from several members: Grow the size of the community. more outreach, community building, more conferences and meetups</li>
<li>Supporting new community contributors, thinking about how the tech sector layoffs will impact clj community (where are the jobs?)</li>
<li>I&rsquo;d like to see even more newcomers and more support for those newcomers in the form of mentorship and up-to-date documentation, guides, and courses. I&rsquo;d also like to see more outreach by the Clojure community into broader programming communities to help bring in more newcomers.</li>
<li>Succession planning. What happens when @whilo, @tonsky, or @taoensso move on from open source dev?</li>
<li>I think the community is doing well, especially since Nubank upped its support for Clojure devs, as well as the great work you do at Clojurists Together. There&rsquo;s definitely increased motivation and focus on Clojure with a large number of devs whose tools I use regularly. More of this and I think the Clojure community will continue to be golden.</li>
<li>Do for clojure what typescript did for javascript and the userbase will get bigger</li>
<li>A strong competitor to CIDER in the emacs space</li>
<li>Consider tools / systems using capabilities of Java 21 (threads).</li>
<li>Optional type system, lsp-support</li>
<li>That people with design and UI skills help updating Clojure related websites to give a modern impression. Clojure related websites could be clojuredocs.org or planet.clojure.in but really anything with can be considered to be &ldquo;the face of the Clojure community to the outside&rdquo;. Just because Lisp is +70 years, doesn&rsquo;t mean our websites and tools have to look and feel like something from back then. </li>
<li>I also hope to finde more blog post about solving problems with Clojure - both big and small. Blog posts inspire me to try new things and push the limits of what is possible with Clojure. I prefer blog posts over videos because they are easy to &ldquo;scan&rdquo; and search because of the text format and examples are easily copy-pasted.</li>
<li>I&rsquo;d like a full visualisation stack in clojure that didn&rsquo;t depend upon javascript</li>
<li>I&rsquo;d like to see a foundation formed to tackle the things the core team is uninterested in.</li>
<li>A lighter weight polylith to organize code into components or modules</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>November and December 2023 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/november-and-december-2023-project-updates/</link>
      <pubDate>Mon, 22 Jan 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/november-and-december-2023-project-updates/</guid>
      <description>Cider/REPL, clj-kondo, basbashka, clojars, clojure-lsp, shadow, calva, malli, carmine V4, Humble UI and more .</description>
      <content:encoded><![CDATA[<br>  
There is a lot of work to report on folks! We're closing 2023 with two groups of updates:  
<ul>
<li>the 6th and final reports from our 2023 long-term developers</li>
<li>final updates from Q3 2023 projects Jank and Quil</li>
</ul>
<p>Thanks to all our 2023 developers for their incredible work throughout the year. We&rsquo;re looking forward to an awesome 2024!</p>
<p><strong>2023 Long-Term Developers:</strong><br>
<a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER/REPL <br>
<a href="#eric-dallo">Eric Dallo:</a> Clojure-lsp, clojure-repl-intellij, clojure-lsp-intellij<br>
<a href="#michiel-borkent">Michiel Borkent:</a> clj-kondo,babashka, squint, neil, CLI,clojure-mode, and more..<br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> Humble UI, Clojure Sublimed, DataScript, Sublime Executor<br>
<a href="#peter-stromberg">Peter Stromberg:</a> Calva, JavaScript REPL, Polylith <br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Carmine, Nippy, http-kit, Tempel, Telemere<br>
<a href="#sean-corfield">Sean Corfield:</a> clojure-doc.org, deps-new, honeySQL, expectations, next.jdbc, clj-Watson, org.clojure/java.data     <br>
<a href="#thomas-heller">Thomas Heller:</a> Shadow-cljs  <br>
<a href="#toby-crawley">Toby Crawley:</a> Clojars<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Malli, Reitit, Jsonista</p>
<p><strong>Q3 2023 Updates:</strong><br>
<a href="#jeaye-wilkerson-jank">Jeaye Wilkerson:Jank</a><br>
<a href="#charles-comstock-and-jack-rusher-quil">Charles Comstock and Jack Rusher: Quil</a>  <br></p>
<hr>
<h3 id="final-reports-2023-long-term-developers">Final Reports 2023 Long-Term Developers</h3>
<h3 id="bozhidar-batsov">Bozhidar Batsov</h3>
<p>Happy New Year, everyone!</p>
<p>November and December were a bit slower than the previous couple of months, but we still made some nice progress. During this period we&rsquo;ve continued the trend of refining the big changes introduced in CIDER 1.8.
We&rsquo;ve shipped 2 new releases - <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.11.0">CIDER 1.11</a> and <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.12.0">CIDER 1.12</a> - both of them feature mostly refinements to the Inspector functionality.</p>
<p>There&rsquo;s currently a bit of work-in-progress to refine <code>cider-log-mode</code> that will likely land in the next feature release. The work to add <code>clojure-ts-mode</code> support in CIDER in in progress as well.</p>
<p>I also wrote <a href="https://metaredux.com/posts/2023/12/23/cider-clojure-lsp-sitting-on-a-tree.html">an article on using clojure-lsp alongside CIDER</a> and I plan to do a bit more work in that direction (e.g. expand CIDER&rsquo;s documentation). And finally write some of the backlogged CIDER articles I have in my personal TODO list. :-)  <br></p>
<hr>
<h3 id="eric-dallo">Eric Dallo</h3>
<p>During these 2 months I spent a considerable time doing mostly 2 things:</p>
<ul>
<li>Working with <a href="https://github.com/afucher">@afucher</a> in a new IntelliJ Clojure repl plugin, so people can really use clojure-lsp-intellij plugin with an option to repl support</li>
<li>Moving to a new apartment in another city :)</li>
</ul>
<p>Even so, I can say I&rsquo;m proud of the ongoing work on IntelliJ side related to clojure-lsp support, and I hope in a few weeks we should announce the new clojure-repl-intellij plugin and how to use it with clojure-lsp.</p>
<h3 id="clojure-repl-intellijhttpsgithubcomafucherclojure-repl-intellij"><a href="https://github.com/afucher/clojure-repl-intellij">clojure-repl-intellij</a></h3>
<p>It&rsquo;s still pretty alpha and missing lots of REPL features, but this is how it&rsquo;s looking for now:<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/59fab2a4-d828-4b3d-b888-954e3361f673" alt="clojure-repl-intellij-demo"></p>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<p>clojure-lsp-intellij is way more stable, compatible with multiple intellij versions and other plugins like vim-intellij, also the main feature highlight is the new wizard to create new Clojure projects from Intellij itself:<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/3cc61bc3-b469-48c5-833c-09e338228692" alt="clojure-lsp-intellij-wizard"></p>
<h4 id="0131---0141">0.13.1 - 0.14.1</h4>
<ul>
<li>Bump clojure-lsp to <code>2023.12.29-12.09.27</code>.</li>
<li>Add wizzard to create multiple Clojure types of projects directly via Intellij.</li>
<li>Fix format for non clojure files. #28</li>
<li>Bump clojure-lsp to 2023.10.30-16.25.41-hotfix2 to fix settings merge during startup.</li>
<li>Fix exception during hover element.</li>
<li>Fix exception during find definition specific cases.</li>
<li>Fix support for older intellij.</li>
<li>Fix classpath lookup injecting user env on default classpath lookup commands.</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlights are performance improvements and fixes, there is a huge improvements in clojure-lsp API for the format task.</p>
<h4 id="20231229-120927">2023.12.29-12.09.27</h4>
<p><strong>General</strong></p>
<ul>
<li>Fix deep-merge of client settings with project settings.</li>
<li>Fix <code>max-line-length</code> on clean-ns feature not respecting some lines when contains a lot of refers. #1729</li>
<li>Bump cljfmt to 0.12.0.</li>
<li>Bump clj-kondo to <code>2023.12.15</code>.</li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>Fix edn tree visualization for keys with same name in the same level. #1558</li>
<li>Make clear when <code>hover</code> feature is in a calling and not in a specific symbol. #1281</li>
<li>Exclude keys that are already included in the function call from completion suggestions. #1720</li>
</ul>
<p><strong>API/CLI</strong></p>
<ul>
<li>Drastically improves performance of <code>format</code> task matching <code>cljfmt</code>, avoiding analyzing the project. #1723</li>
</ul>
<p>Happy new year, and thank you all for this amazing journey!  <br></p>
<hr>
<h3 id="michiel-borkent">Michiel Borkent</h3>
<h3 id="happy-new-year">Happy new year!</h3>
<p>First all, as this is the last day of 2023, I wish you all a happy new year. Hopefully many goods things may happen in the Clojure ecosystem. I&rsquo;m grateful many of you have sponsored my work in 2023!</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible. Without you, the below projects would not be as mature or wouldn&rsquo;t exist or be maintained at all. Top sponsors:</p>
<ul>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://github.com/pitch-io">Pitch</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways.  Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.  Thank you! On to the projects that I&rsquo;ve been working on!</p>
<h3 id="advent-of-code">Advent of Code</h3>
<p>It is Advent of Code time of year again. You can solve puzzles in an online <a href="https://github.com/squint-cljs/squint">squint</a> or <a href="https://github.com/squint-cljs/cherry">cherry</a> playground <a href="https://squint-cljs.github.io/squint/?src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4Cgo7OyBSZW1lbWJlciB0byB1cGRhdGUgdGhlIHllYXIgYW5kIGRheSBpbiB0aGUgZmV0Y2gtaW5wdXQgY2FsbC4KKGRlZiBpbnB1dCAoLT4%2BIChqcy1hd2FpdCAoZmV0Y2gtaW5wdXQgMjAyMiAxKSkKICAgICAgICAgICAgICNfc3B5CiAgICAgICAgICAgICBzdHIvc3BsaXQtbGluZXMKICAgICAgICAgICAgIChtYXB2IHBhcnNlLWxvbmcpKSkKCihkZWZuIHBhcnQtMQogIFtdCiAgKC0%2BPiBpbnB1dAogICAgKHBhcnRpdGlvbi1ieSBuaWw%2FKQogICAgKHRha2UtbnRoIDIpCiAgICAobWFwICMoYXBwbHkgKyAlKSkKICAgIChhcHBseSBtYXgpKSkKCihkZWZuIHBhcnQtMgogIFtdCiAgKC0%2BPiBpbnB1dAogICAgKHBhcnRpdGlvbi1ieSBuaWw%2FKQogICAgKHRha2UtbnRoIDIpCiAgICAobWFwICMoYXBwbHkgKyAlKSkKICAgIChzb3J0LWJ5IC0pCiAgICAodGFrZSAzKQogICAgKGFwcGx5ICspKSkKCih0aW1lIChwYXJ0LTEpKQojXyh0aW1lIChwYXJ0LTIpKQ%3D%3D&amp;boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&amp;repl=true">here</a>.</p>
<p>Change the <code>/squint/</code> part of the url to <code>/cherry/</code> to switch ClojureScript dialect versions. You can read more about the playground <a href="https://blog.michielborkent.nl/squint-advent-of-code.html">here</a>.</p>
<h3 id="november-2023-updates">November 2023 Updates</h3>
<ul>
<li><a href="https://blog.michielborkent.nl/archive.html">blog</a> I&rsquo;ve written two blog posts this month:
<ul>
<li><a href="https://blog.michielborkent.nl/squint-cloudflare-bun.html">Writing a Cloudflare worker with squint and bun</a></li>
<li><a href="https://blog.michielborkent.nl/squint-advent-of-code.html">Playing Advent of Code with Squint</a>.</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler<br>
Lots of stuff happened in November with squint! You could say that I&rsquo;ve grown a little addicted to improving this project currently, driven by how users use it and also while developing the <a href="https://squint-cljs.github.io/squint/?src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4Cgo7OyBSZW1lbWJlciB0byB1cGRhdGUgdGhlIHllYXIgYW5kIGRheSBpbiB0aGUgZmV0Y2gtaW5wdXQgY2FsbC4KKGRlZiBpbnB1dCAoLT4%2BIChqcy1hd2FpdCAoZmV0Y2gtaW5wdXQgMjAyMiAxKSkKICAgICAgICAgICAgICNfc3B5CiAgICAgICAgICAgICBzdHIvc3BsaXQtbGluZXMKICAgICAgICAgICAgIChtYXB2IHBhcnNlLWxvbmcpKSkKCihkZWZuIHBhcnQtMQogIFtdCiAgKC0%2BPiBpbnB1dAogICAgKHBhcnRpdGlvbi1ieSBuaWw%2FKQogICAgKHRha2UtbnRoIDIpCiAgICAobWFwICMoYXBwbHkgKyAlKSkKICAgIChhcHBseSBtYXgpKSkKCihkZWZuIHBhcnQtMgogIFtdCiAgKC0%2BPiBpbnB1dAogICAgKHBhcnRpdGlvbi1ieSBuaWw%2FKQogICAgKHRha2UtbnRoIDIpCiAgICAobWFwICMoYXBwbHkgKyAlKSkKICAgIChzb3J0LWJ5IC0pCiAgICAodGFrZSAzKQogICAgKGFwcGx5ICspKSkKCih0aW1lIChwYXJ0LTEpKQojXyh0aW1lIChwYXJ0LTIpKQ%3D%3D&amp;boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs&amp;repl=true">playground</a>, a lot of potential improvements emerged. <a href="https://blog.michielborkent.nl/oss-updates-nov-2023.html">See blog for more detail</a></li>
<li><a href="https://jsfiddle.net/xbgj6v1q/1/">scittle-hoplon</a>: a custom scittle distribution with Hoplon. I helped developing the SCI configuration for Hoplon.</li>
<li><a href="https://github.com/squint-cljs/squint/tree/main/examples/threejs">gespensterfelder</a>: a demo that Jack Rusher wrote using Three.js ported to squint.</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.63 released which adds mvn search and some bugfixes</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!
<ul>
<li>Small bugfix around priority of <code>:exec-args</code> and <code>default</code></li>
</ul>
</li>
<li><a href="https://github.com/borkdude/aoc-proxy">aoc-proxy</a>: a Cloudflare worker that can be used to fetch Advent of Code puzzle input from the browser (see <a href="https://squint-cljs.github.io/squint/examples/aoc/index.html">Advent of Code playground</a>)</li>
<li><a href="https://github.com/squint-cljs/squint-macros">squint-macros</a>: a couple of macros that stand-in for <a href="https://github.com/applied-science/js-interop">applied-science/js-interop</a> and <a href="https://github.com/funcool/promesa">promesa</a> to make CLJS projects compatible with squint and/or cherry.</li>
<li><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a>: Clojure/Script mode for CodeMirror 6.
<ul>
<li>Ported the eval-region extension to squint so you can use it straight from JS. This is used in the <a href="https://squint-cljs.github.io/squint/?repl=true">squint playground</a> when you press Cmd-Enter after an expression.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.
<ul>
<li>A helper macro was improved such that you can define macros that are usable in SCI</li>
<li>The re-frame configuration now has support for <code>re-frame.alpha</code>. See <a href="https://babashka.org/sci.configs/">playground</a>.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting. A new release: 1.3.186! <a href="https://blog.michielborkent.nl/oss-updates-nov-2023.html">See blog for more detail</a></li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs \ Released version 0.8.41  <a href="https://blog.michielborkent.nl/oss-updates-nov-2023.html">See blog for more detail</a></li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler
<ul>
<li>Released version 0.1.10 which catches up with the latest compiler improvements in squint</li>
</ul>
</li>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>New <code>:condition-always-true</code> and <code>:underscore-in-namespace</code> linters + couple of bugfixes. Release expected in December.</li>
</ul>
</li>
</ul>
<h3 id="december-2023-updates">December 2023 Updates</h3>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy. Released 2023.12.15
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1990">#1990</a>: Specify <code>:min-clj-kondo-version</code> in config.edn and warn when current version is too low (<a href="https://github.com/snasphysicist">@snasphysicist</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1753">#1753</a>: New linter <code>:underscore-in-namespace</code> (<a href="https://github.com/cosineblast">@cosineblast</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2207">#2207</a>: New <code>:condition-always-true</code> linter, see <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2235">#2235</a>: New <code>:multiple-async-in-deftest</code> linter: warn on multiple async blocks in <code>cljs.test/deftest</code>, since only the first will run.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2013">#2013</a>: Fix NPE and similar errors when linting an import with an illegal token (<a href="https://github.com/cosineblast">@cosineblast</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2215">#2215</a>: Passthrough hook should not affect linting</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2232">#2232</a>: Bump analysis for clojure 1.12 (partitionv, etc)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2223">#2223</a>: Do not consider classes created with <code>deftype</code> a var that is referred with <code>:refer :all</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2236">#2236</a>: <code>:line-length</code> warnings cannot be <code>:clj-kondo/ignore</code>d</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2224">#2224</a>: Give <code>#'foo/foo</code> and <code>(var foo/foo)</code> the same treatment with respect to private calls</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2239">#2239</a>: Fix printing of unresolved var when going through <code>:macroexpand</code> hook</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka v0.3.3 - v0.3.6 released
<ul>
<li>Fix caching in watch mode</li>
<li><a href="https://github.com/borkdude/quickblog/issues/86">#86</a>: group archive page by year</li>
<li><a href="https://github.com/borkdude/quickblog/issues/85">#85</a>: don&rsquo;t render discuss links when <code>:discuss-link</code> isn&rsquo;t set</li>
<li><a href="https://github.com/borkdude/quickblog/issues/84">#84</a>: sort tags by post count</li>
<li><a href="https://github.com/borkdude/quickblog/issues/80">#80</a>: Generate an <code>about.html</code> when a template exists (<a href="https://github.com/elken">@elken</a>)</li>
<li><a href="https://github.com/borkdude/quickblog/issues/78">#78</a>: Allow configurable :page-suffix to omit <code>.html</code> from page links (<a href="https://github.com/anderseknert">@anderseknert</a>)</li>
<li><a href="https://github.com/borkdude/quickblog/pull/76">#76</a>: Remove livejs script tag on render. (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li><a href="https://github.com/borkdude/quickblog/pull/75">#75</a>: Omit preview posts from index. (<a href="https://github.com/jmglov">@jmglov</a>)</li>
<li>Support capitalization of tags</li>
<li><a href="https://github.com/borkdude/quickblog/issues/66">#66</a>: Unambigous ordering of posts, sorting by date (descending), post title, and then file name. (<a href="https://github.com/UnwarySage">@UnwarySage</a>)</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler<br>
Lots of stuff happened in December with squint! Too many to mention here, just check the <a href="https://github.com/squint-cljs/squint/blob/main/CHANGELOG.md">CHANGELOG.md</a></li>
<li><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a>: Clojure/Script mode for CodeMirror 6.
<ul>
<li>Improved the eval-region extension: when you evaluate <code>#_(+ 1 2 3)|</code> the expression <code>(+ 1 2 3)</code> is evaluated Test it in the <a href="https://squint-cljs.github.io/squint/?repl=true&amp;src=I18oKyAxIDIgMyk%3D">squint playground</a>.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure Released 0.5.20:
<ul>
<li><a href="https://github.com/babashka/fs/issues/119">#119</a>: <code>fs/delete-tree</code>: add <code>:force</code> flag to delete read-only directories/files. Set the flag to true in <code>fs/with-temp-dir</code> (<a href="https://github.com/jlesquembre">@jlesquembre</a>)</li>
<li><a href="https://github.com/babashka/fs/issues/102">#102</a>: add <code>gzip</code> and <code>gunzip</code> functions</li>
<li><a href="https://github.com/babashka/fs/issues/113">#113</a>: <code>fs/glob</code>: enable <code>:hidden</code> (when not already set) when <code>pattern</code> starts with dot (<a href="https://github.com/eval">@eval</a>).</li>
<li><a href="https://github.com/babashka/fs/issues/117">#117</a>: fix <code>fs/match</code> and <code>fs/glob</code> not finding files in root-folder (<a href="https://github.com/eval">@eval</a>).</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler
<ul>
<li>Released version 0.1.16 which catches up with the latest compiler improvements in squint and also adds the <code>clojure.set</code> namespace</li>
</ul>
</li>
<li><a href="https://github.com/babashka/http-server">http-server</a>: serve static assets
<ul>
<li>Released 0.1.12 with several new features</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.
<ul>
<li>Working towards a new release, planned for next month.</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I’m involved with but little to no activity happened in November and December. See final section of each report (“Other Projects”) for details.<br>
[https://blog.michielborkent.nl/oss-updates-nov-2023.html]<br>
[https://blog.michielborkent.nl/oss-updates-dec-2023.html]</p>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here<br>
</a> Published: 1 and 31 December, 2023 \ Tagged: clojure oss updates</p>
<br>
<hr>
<h3 id="nikita-prokopov">Nikita Prokopov</h3>
<p>Last update of the passing year, so pour yourself a warm drink, cover yourself with a cozy wool blanket and let’s see what are we ending the year with.</p>
<p><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a>:</p>
<ul>
<li>VDOM prototype implementation</li>
<li>Blog: <a href="https://tonsky.me/blog/humble-vdom/">Humble Chronicles: Managing State with VDOM</a></li>
</ul>
<p><a href="https://github.com/tonsky/datascript-storage-sql">DataScript SQL Storage</a>:</p>
<ul>
<li>A bit embarassing to miss at first, but we now support connection pooling for SQL connections. To be frank, I became too lazy and soft from using Datomic and forgot how hard “real programmers” have it with SQL databases.</li>
</ul>
<p><a href="https://github.com/tonsky/datascript">DataScript</a>:</p>
<ul>
<li>Migrated Conn to extend-clj atom (should be invisible for end users though).</li>
<li>Prevent explosion of redundant tuples during rule solving #456 #457, thx @RutledgePaulV</li>
<li>Fixed JS version bug caused by Conn rewrite</li>
</ul>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>:</p>
<ul>
<li>We now support a connection per widnow, so you can have multiple REPLs at the same time as long as they are in separate windows.</li>
<li>We also now support (non-standard) <code>.repl-port</code> files for Socket REPL. Turned out, with multiple REPLs, you can’t just bind them all to port 5555 anymore.</li>
<li>Fixed status eval not clearing on disconnect</li>
<li>Fixed error when reporting warnings</li>
</ul>
<p><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>:</p>
<ul>
<li>One execution per window, same as with Clojure Sublimed.</li>
<li>Added executor_clear_output command, with pair nicely e.g. right before reload namespaces or running test suite.</li>
<li>Ability to redirect output to a view</li>
</ul>
<p>To sum the whole year up, these are the most notable things that happened:</p>
<ul>
<li><a href="https://github.com/tonsky/datascript">DataScript</a> got <a href="https://github.com/tonsky/datascript-storage-sql">persistence</a>! You can now save it on disk, like a real database. Immediately did that with Grumpy Website.</li>
<li>Made <a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a> a world-class tool for Clojure development.</li>
<li>Did tons of research on <a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a> with intermediate results all published. It’s now on direct train for getting component model in early 2024.</li>
<li>Published widely popular <a href="https://tonsky.me/blog/unicode/">Unicode article</a></li>
<li>Released a few Clojure libraries:
<ul>
<li><a href="https://github.com/tonsky/datascript-storage-sql">datascript-storage-sql</a>,</li>
<li><a href="https://github.com/tonsky/extend-clj">extend-clj</a>,</li>
<li><a href="https://github.com/tonsky/toml-clj">toml-clj</a>,</li>
<li><a href="https://github.com/tonsky/clj-simple-router">clj-simple-router</a>.</li>
</ul>
</li>
<li>Made a macOS app: <a href="https://github.com/tonsky/DarkModeToggle">Dark Mode Toggle</a>. I use it almost every day myself, perfectly happy with effort/RoI ratio.</li>
<li>Left my day job and completely switched to open source/donation model.</li>
</ul>
<p>Thanks Clojurists Together and its sponsors for funding this work. This is a dream job for me and I’m very thankful for a chance to be doing it. 2024 is going to be a open-source-as-a-full-time-job year, so even crazier!</p>
<p>Happy New Year!  <br></p>
<hr>
<h3 id="peter-stromberg">Peter Stromberg</h3>
<p>This summarizes my last two month of long term funding 2023. I can&rsquo;t find words for how great this has been for me. Clojurists Together ROCKS! ❤️</p>
<h3 id="calva">Calva</h3>
<p>The changes to Calva were mostly about fixing bugs. User support revealed quite a few places where Calva quality could be improved and was improved:</p>
<ul>
<li>A strange situation where <a href="https://github.com/AnalyticalGraphicsInc/gltf-vscode/issues/264">another VS Code extension</a> stopped Calva&rsquo;s nREPL client from working was fixed. Or, worked around rather, it is still unclear what the root cause is.</li>
<li>Instrumenting the REPL for utilities such as <code>doc</code>, and <code>pprint</code>, was failing.
<ul>
<li>This also caused plain ClojureScript (i.e. not shadow-cljs) projects to sometimes fail to connect to our nREPL client.</li>
</ul>
</li>
<li>Calva uses cljfmt for formatting. Mostly for performance reasons we have a separate, cljfmt.edn compliant, indenter for placing the cursor correctly when new lines are created. The indent configuration supports regular expressions, and we had bugs in this support.</li>
<li>We have been fighting lots of <code>npm audit</code> complaints. It&rsquo;s a never ending struggle, but now Calva has a lot fewer dependencies, which improves the situation. (And, right now the report says <strong>0 vulnerabilities detected</strong>.)</li>
<li>Word selection outside CLojure structural code (i.e. in line comments) was misbehaving.</li>
<li>It was discovered that Calva&rsquo;s nREPL client was sending non-compliant <code>eval</code> messages. Most nREPL servers are resilient to this, but there showed up one that wasn&rsquo;t (<strong>Squint</strong>). Fixing this we could also clean up a lot of code in Calva that compensated for the lacking compliance.
<ul>
<li>This also prevented Calva from working with the <a href="https://github.com/squint-cljs/squint">Squint</a> nREPL server.</li>
</ul>
</li>
<li>The Calva API was upgraded with namespace utilities.</li>
<li>A glitch made the error message return late for failed evaluations in some situations.</li>
<li>A bug prevented the <strong>Project Type</strong> REPL Jack-in from populating on the first jack-in attempt (for some projects).</li>
<li>Connecting to a remote nREPL server sometimes didn&rsquo;t work at all.</li>
<li>Manually breaking up line comments caused suprising, and sometimes rather messy reformatting of the code.</li>
<li>Connecting the shadow-cljs REPL failed for some projects</li>
<li>Glitches in including the doc string in hovers.</li>
<li>Duplicate definitions in hovers (both clojure-lsp and nREPL provides this)</li>
<li>Namespace alises shadowed local bindings in completions</li>
<li>Static definition lookup not working from project dependency files</li>
</ul>
<h3 id="joyride">Joyride</h3>
<p><strong>Clojure language support updates:</strong></p>
<ul>
<li>Add Clojure functions <code>tap&gt;</code>, <code>add-tap</code>, and <code>remove-tap</code></li>
<li>Conditional readers</li>
</ul>
<p><strong>Developer tooling:</strong></p>
<ul>
<li>Auto-create configuration and instructions for better clojure-lsp support
for Joyride scripts</li>
<li>Fix nREPL server bug causing compliant <code>eval</code> op messages to fail (bug
revealed when Calva started to send compliant <code>eval</code> messages)</li>
</ul>
<h3 id="squint">Squint</h3>
<p>I wanted to help test Squint and used it for solving some Advent of Code problems. Then I started instead to help fix some of the issues I reported as a result. Because Michiel Borkent is the way he is, helping with Squint development was more fun than solving AOC problems so I dropped out of AOC. My most significant contribution to Squint during this “sprint” was adding almost complete support for <code>clojure.set</code>.  <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and other sponsors of my open source work!</p>
<h3 id="recent-work">Recent work</h3>
<p>In November I released the first public alpha of <a href="https://www.taoensso.com/tempel">Tempel</a>, a new <strong>data security framework</strong> for Clojure - and my first all-new Clojure library in 7 (!) years.</p>
<p>Its main objective - to make it practical for more Clojure applications to use encryption and cryptographic best practices to protect user data and other sensitive info.</p>
<p>It offers a <em>particularly</em> high-level API focused on common tasks including logins, symmetric &amp; asymmetric encryption, end-to-end encryption, signing, and key management.</p>
<p>For lots more info (incl. beginner-oriented documentation), see the <a href="https://github.com/taoensso/tempel">Tempel GitHub page</a>.</p>
<p>Since then, I&rsquo;ve been mostly concentrating on <a href="https://www.taoensso.com/telemere">Telemere</a> - another all-new library focused on providing an idiomatic and flexible Clojure/Script API for structured telemetry. Support is planned for <a href="https://opentelemetry.io/">OpenTelemetry</a> and others.  Will share more info on this at release.</p>
<h3 id="upcoming-work">Upcoming work</h3>
<p>My current <a href="https://www.taoensso.com/clojure/roadmap">roadmap</a> includes:</p>
<ul>
<li>Next <a href="https://www.taoensso.com/http-kit">http-kit</a> beta mid January</li>
<li>First <a href="https://www.taoensso.com/tempel">Tempel</a> beta mid January</li>
<li>First <a href="https://www.taoensso.com/telemere">Telemere</a> alpha mid February</li>
</ul>
<h3 id="2023-recap">2023 recap</h3>
<p>I&rsquo;m happy to say that 2023 was a really productive year for my open source work. It was the first time I&rsquo;ve had support from <a href="https://www.clojuriststogether.org/">Clojurists Together</a> - and their backing along with my usual contributors meant that I could put more time + effort into open source than I&rsquo;ve been able to do in many years.</p>
<p>In particular, I took the opportunity to target some larger/hairier tasks that would have otherwise been infeasible. Some of that work has already borne fruit, some of it will bear fruit in the coming year.</p>
<p><strong>Some notable results this year:</strong></p>
<ul>
<li>37 public library <a href="https://www.taoensso.com/news#open-source">releases</a>, incl. 1 all-new library and another to come soon.</li>
<li>Major improvements to my workflow for writing and maintaining documentation.</li>
<li>Updated and expanded documentation for most of my libraries (a few still TBD).</li>
<li>Several other cross-project improvements (unit tests, Graal support, cljdoc support, improved Cljs documentation, etc.).</li>
<li>Laid significant foundations for future upcoming work :-)</li>
</ul>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a>  <br></p>
<hr>
<h3 id="sean-corfield">Sean Corfield</h3>
<p>In my <a href="https://corfield.org/blog/2023/10/31/long-term-funding-5/">previous Long-Term Funding update</a>
I said I would review and update of the
&ldquo;cookbooks&rdquo; section and make another pass of &ldquo;TBD&rdquo; items in the &ldquo;language&rdquo;
section.</p>
<h3 id="clojure-docorg"><code>clojure-doc.org</code></h3>
<p>I reviewed and updated the cookbooks for
<a href="https://clojure-doc.org/articles/cookbooks/files_and_directories/">Files and Directories</a>,
<a href="https://clojure-doc.org/articles/cookbooks/math/">Mathematics</a>,
<a href="https://clojure-doc.org/articles/cookbooks/middleware/">Middleware</a>,
<a href="https://clojure-doc.org/articles/cookbooks/parsing_xml_with_zippers/">Parsing XML in Clojure</a>, and
<a href="https://clojure-doc.org/articles/cookbooks/strings/">Strings</a>,
bringing them all up to Clojure 1.11 (and testing the examples &ndash; and
fixing the broken ones).</p>
<p>For the <strong>Mathematics</strong> cookbook, that meant rewriting the content that previously used Java interop and/or <a href="https://github.com/clojure/math.numeric-tower/">math.numeric-tower</a> to use the new-in-1.11 <code>clojure.math</code> namespace.</p>
<p><strong>Several cookbooks got minor updates</strong> to take advantage of functions in <code>clojure.core</code> and <code>clojure.string</code> that have been added since Clojure 1.4, when most of the original material on <code>clojure-doc</code> was written.</p>
<p><strong>I also went through all the Java documentation links</strong> and updated those to
point to the Java 17 versions (they were mostly pointing at Java 7 previously!).
These will get updated again once use of JDK 21 has become more widespread.</p>
<p>I&rsquo;ve been slowly working my way through the &ldquo;TBD&rdquo; items in the various
<strong>Language</strong> guides, including the <strong>Glossary</strong>, although some of them really need input from community members who have specialist knowledge in those areas. In particular, the
<a href="https://clojure-doc.org/articles/language/concurrency_and_parallelism/"><strong>Concurrency and Parallelism</strong></a> and
<a href="https://clojure-doc.org/articles/language/polymorphism/"><strong>Polymorphism</strong></a>
guides still have a number of &ldquo;TBD&rdquo; items that I don&rsquo;t feel qualified to write!
<strong>Volunteers welcome!</strong></p>
<p>Thank you to <a href="https://github.com/adham-omran">@adham-omran</a> for a PR that
added the <a href="https://clojure-doc.org/articles/cookbooks/date_and_time/">Date and Time cookbook</a>
and to <a href="https://github.com/samhedin">@samhedin</a> for a PR that added
a section about <a href="https://clojure-doc.org/articles/cookbooks/cli_build_projects/#including-java-code-in-a-clojure-project">adding Java code to Clojure projects</a> to the <code>tools.build</code> cookbook.</p>
<p>Finally, I made a logo and a favicon for the site with my very limited
artistic &ldquo;talents&rdquo;!</p>
<p>To wrap up the year of work on <code>clojure-doc.org</code>, I consider the Clojurists
Together funding to have been a massive success. The site has been completely
overhauled at this point, bringing it up to date with Clojure 1.11 and
removing all the outdated (and now-duplicated) material that was originally
missing from the official Clojure documentation. In addition, by raising the
profile of <code>clojure-doc.org</code> in the community, contributions have increased
with two new cookbooks added via Pull Requests and several other sections of
the site either getting PRs or being updated by me in response to extensive
feedback from the community (mostly on Slack).</p>
<p>Keeping the site updated now feels like a tractable problem and I&rsquo;m hoping
to find time in 2024 and beyond to add more content to the site, especially
when Clojure 1.12 is released and there are a lot of enhancements to Java
interop!</p>
<h3 id="deps-new"><code>deps-new</code></h3>
<p><a href="https://github.com/seancorfield/deps-new/"><code>deps-new</code></a> 0.6.0 was released
with several
documentation updates, a new <code>:src-dirs</code> option to make it
easier to use <code>deps-new</code> as a library and use templates from the local
file system, and a new <code>:post-process-fn</code> to make it possible to modify
the generated project programmatically.</p>
<h3 id="expectations">Expectations</h3>
<p>No new release yet but several documentation updates for
the <code>clojure.test</code>-compatible version of
<a href="https://github.com/clojure-expectations/clojure-test">Expectations</a>.</p>
<h3 id="honeysql">HoneySQL</h3>
<p><a href="https://github.com/seancorfield/honeysql/">HoneySQL</a> 2.5.1103
was released with smarter quoting of entities, smarter
handling of metadata in formatting, and new options to provide more control
over both of those features.</p>
<h3 id="nextjdbc"><code>next.jdbc</code></h3>
<p><a href="https://github.com/seancorfield/next-jdbc/"><code>next.jdbc</code></a> 1.3.909
brings improved compatibility with <code>clojure.java.jdbc</code> for
<code>insert-multi!</code> and adds a <code>:schema-opts</code> option to provide more control over
schema conventions for <code>datafy</code>/<code>nav</code>. There have also been several
documentation updates, in particular around how to use <code>next.jdbc/plan</code> and
<code>next.jdbc.sql/find-by-keys</code>. The <code>build.clj</code> has been updated to use the
<code>:pom-data</code> option introduced in <code>tools.build</code> 0.9.6, as a better example
for the community.</p>
<h3 id="clj-watson"><code>clj-watson</code></h3>
<p><a href="https://github.com/clj-holmes/clj-watson/"><code>clj-watson</code></a> is a great tool
for checking your dependencies for known security vulnerabilities. It&rsquo;s a
wrapper around
<a href="https://owasp.org/www-project-dependency-check/">OWASP Dependency Check</a>
and NIST is requiring users of its NVD (National Vulnerability Database)
to switch from using data feed downloads to a new API that requires a free key for
access. The DependencyCheck library that <code>clj-watson</code> uses has been updated
to use the new API, but it isn&rsquo;t backward compatible so <code>clj-watson</code> needed
changes to use the new version of the library &ndash; and to provide an easier
way for users to specify their own NVD API key.</p>
<p>Although the <code>clj-watson</code> maintainer has moved on from Clojure,
they&rsquo;ve been receptive to my Pull Requests to update the documentation,
update the library dependencies, add a new, optional properties file that
users can provide to override defaults, as well as a new command line option
to specify that file, if you don&rsquo;t want it on the classpath, and to update
the DependencyCheck library and provide documentation on how to obtain an
NVD API key and how to use it with <code>clj-watson</code>.</p>
<p>A v5.0.0 release of <code>clj-watson</code> has been made, with all these changes, and
is available as a git dependency. A Pull Request is pending with the README
updates.</p>
<h3 id="orgclojurejavadata"><code>org.clojure/java.data</code></h3>
<p>Finally, the <a href="https://github.com/clojure/java.data/"><code>java.data</code></a> Contrib
library has a new release, 1.1.103, which removes the dependency on
<code>org.clojure/tools.logging</code> &ndash; which in turn means that <code>next.jdbc</code> no longer
depends on <code>tools.logging</code>, reducing the chance of conflicts for users of
either library.
<br></p>
<hr>
<h3 id="thomas-heller">Thomas Heller</h3>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.26.2 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a>
<br></p>
<hr>
<h3 id="toby-crawley">Toby Crawley</h3>
<h3 id="november-2023">November 2023</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/d92cf1eb2f78e13894d37eb8e4b5fc070d9e00e0...efde442180ed43d323a3fff1061a2bd6f7dfd157"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/ad8335b312a81567a4c78ef4fe1587741794534c...30bab1d3eefea9963117496c9aa420680ee3efc2"><code>infrastructure</code></a></p>
<p>I <a href="https://github.com/clojars/clojars-web/pull/877">rewrote the permissions system</a> this month to support <a href="https://github.com/clojars/clojars-web/issues/709">project-level scoping</a>,
allowing delegation of deploy rights to a user for a subset of projects under a group. This was released in December.</p>
<p>I also made <a href="https://github.com/clojars/infrastructure/commit/30bab1d3eefea9963117496c9aa420680ee3efc2">improvements to the AMI release process</a>.</p>
<h3 id="december-2023">December 2023</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/efde442180ed43d323a3fff1061a2bd6f7dfd157...a24421654d39e01f8fadeaa7b7b878a3217ff581"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/30bab1d3eefea9963117496c9aa420680ee3efc2...f529f091d3b003d8a7d251c6afc6569e4fb607b4"><code>infrastructure</code></a></p>
<p>This month I released the <a href="https://github.com/clojars/clojars-web/pull/877">permissions system rewrite</a>, updated the release logic
to <a href="https://github.com/clojars/clojars-web/pull/875">require a license in the POM for all releases</a>, and made a few other minor improvements:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/8d5b8e2c4b93771a34ecb1b14e5d5cbf62d2491e">Use long polling with SQS</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/b60afa3cf8c181fe511b71a1ade27bd04c46110f">Throw on SQS receive-loop exception to force prcess to exit</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/785266dbcbc0ea3fea4ccf55a8992f2ed62183f4">Use mock mailer in development</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/d25bdccbfe32ad23b6b60906b596ed1b5d63cbad">Update logback to address CVE-2023-6378</a></li>
</ul>
<p>On the infrastructure front, I added <a href="https://github.com/clojars/infrastructure/compare/30bab1d3eefea9963117496c9aa420680ee3efc2...57142fd9726c1f6ba42abedfe696632893c58621">disk space and SQS queue delay alarms</a> so we
can be better informed of when things go wrong.  <br></p>
<hr>
<h3 id="tommi-reiman">Tommi Reiman</h3>
<p>Many improvements are in the works, but no releases on libraries. My work spread over the following:</p>
<p><strong>Working with Malli:</strong></p>
<ul>
<li>enchanced development mode, new extension apis &amp; pretty printing everything possible (screenshots below)</li>
<li>little progress on the <a href="https://github.com/metosin/malli/issues/264">new effective type system</a></li>
<li>thinking about schemas and global identity, entities and values. Goal is to allow decomplecting maps/keys/values with using local data / schema properties</li>
<li>learning how to program with TypeScript Types</li>
</ul>
<p><strong>Drafting a Clojure specification for a 1:1 <a href="https://xstate.js.org/">x-state</a> compatible FSM implementation(<a href="https://stately.ai/blog/2023-12-01-xstate-v5">xstate v5 released in december</a>)</strong></p>
<ul>
<li>Why? have used FSMs for 10+ years with Clojure with great results, mostly copy-pasting the project-spesific engine from one project to another</li>
<li>We have already many <a href="https://clojurians.slack.com/archives/C01C7RJA81M/p1649760505661159">great FSM libraries</a> for Clojure, but all differ with design objectives. I&rsquo;ll reach out to the library maintainers, e.g. could we have one new/great tool instead of many small ones? we have already depreceated <a href="https://github.com/metosin/tilakone">tilakone</a>.</li>
</ul>
<ul>
<li>organizing open source &amp; stable libraries in general - getting new maintainters for some of the projects</li>
<li>reviewing and merging pull requests</li>
</ul>
<h3 id="malli-development-mode">Malli Development Mode</h3>
<h4 id="coercion">Coercion</h4>
<p><img src="https://gist.githubusercontent.com/ikitommi/a1e62b3a35359259bfef94433ec2730b/raw/7e038854006f274cddcea212da566090dc370dc2/malli-coercion.png" alt="coercion"></p>
<h4 id="schema-creation">Schema creation</h4>
<p><img src="https://gist.githubusercontent.com/ikitommi/a1e62b3a35359259bfef94433ec2730b/raw/7e038854006f274cddcea212da566090dc370dc2/malli-schema-creation.png" alt="schema-creation"></p>
<h3 id="something-else">Something else</h3>
<p>Looking forward to 2024! Lot&rsquo;s of interesting things in the OS pipeline and thanks to new long-term funding, will continue to work on them. Also, New year starts with crispy -20 (in Celcius).</p>
<p><img src="https://gist.githubusercontent.com/ikitommi/a1e62b3a35359259bfef94433ec2730b/raw/7e038854006f274cddcea212da566090dc370dc2/winter.jpg" alt="tampere">
<br></p>
<hr>
<h2 id="q3-2023-project-reports">Q3 2023 Project Reports</h2>
<h3 id="charles-comstock-and-jack-rusher-quil">Charles Comstock and Jack Rusher: Quil</h3>
<p>We had hoped to have a new release by the time we submitted this
update, but we &ndash; by which I mean Charles &ndash; are down in the weeds
trying to get all of the test infrastructure to work for every major
platform in Github CI. The good news:</p>
<ul>
<li>we have managed to migrate all of the testing away <code>lein</code> to <code>deps.edn</code></li>
<li>tests all work properly from cider now</li>
<li>upgraded the Clojure test runner to Kaocha (thanks, plexus!)</li>
<li>moved browser testing for CLJS to Figwheel</li>
<li>Fixed some bugs around color processing (thanks, plexus!)</li>
<li>Foreign deps are better handled</li>
<li>we should have a new release either by the end of December or early
in January 2024</li>
</ul>
<p>Our plan is to continue the work a bit more in the new year to get
everything clean and maintainable, then train some other devs in the
community on the codebase.</p>
<p>Thanks for much for your help, Clojurists Together!<br>
Published 27 December 2023 <br></p>
<hr>
<h3 id="jeaye-wilkerson-jank">Jeaye Wilkerson: Jank</h3>
<p>I&rsquo;ve been quiet for the past couple of months, finishing up this work on jank&rsquo;s
module loading, class path handling, aliasing, and var referring. Along the way,
I ran into some very interesting bugs and we&rsquo;re in for a treat of technical
detail in this holiday edition of jank development updates! A warm shout out to
my <a href="https://github.com/sponsors/jeaye">Github sponsors</a>
and <a href="https://www.clojuriststogether.org/">Clojurists Together</a> for sponsoring this work.</p>
<h3 id="module-loading-progress">Module loading progress</h3>
<p>Ok, first and foremost, where is jank now with regard to module loading? I&rsquo;m
very pleased to say that everything I wanted to tackle this quarter has been
finished and even more on top of that. There&rsquo;s a PR up for the full changes
<a href="https://github.com/jank-lang/jank/pull/49">here</a>.</p>
<p>Let&rsquo;s break this down by section.</p>
<h3 id="class-paths">Class paths</h3>
<p>jank traverses a user-defined class path, which supports directories and JAR
files, and can use that to find modules when you use <code>require</code> and friends. This
is specifically designed to be compatible with the JVM, so once we hook in
Leiningen or Clojure CLI, your existing dependency management should work just
fine.</p>
<h3 id="necessary-core-functions">Necessary core functions</h3>
<p>The following functions have all been implemented, which were required for
module loading:</p>
<ul>
<li><code>require</code></li>
<li><code>alias</code></li>
<li><code>use</code></li>
<li><code>refer</code></li>
<li><code>load</code></li>
</ul>
<p>These take into account modules that are already loaded, flags for things like
reloading, excluding, etc. For most use cases, they&rsquo;re at functional parity with
Clojure on the happy path. Error handling will improve once I have some better
mechanisms for it.</p>
<p>Still, that&rsquo;s not a very big list of functions, I know. How about this one?</p>
<ul>
<li><code>compile</code></li>
<li><code>create-ns</code></li>
<li><code>find-ns</code></li>
<li><code>remove-ns</code></li>
<li><code>the-ns</code></li>
<li><code>ns-name</code></li>
<li><code>ns-map</code></li>
<li><code>ns-publics</code></li>
<li><code>var?</code></li>
<li><code>var-get</code></li>
<li><code>keys</code> (note - not using a custom seq yet)</li>
<li><code>vals</code> (note - not using a custom seq yet)</li>
<li><code>name</code></li>
<li><code>namespace</code></li>
<li><code>subs</code></li>
<li><code>gensym</code></li>
<li><code>concat</code></li>
<li><code>contains?</code></li>
<li><code>find</code></li>
<li><code>select-keys</code></li>
<li><code>map</code> (note - not lazy yet, no transducers)</li>
<li><code>mapv</code> (note - not lazy yet, no transducers)</li>
<li><code>mapcat</code> (note - not lazy yet, no transducers)</li>
<li><code>filter</code> (note - not lazy yet, no transducers)</li>
<li><code>complement</code></li>
<li><code>remove</code></li>
<li><code>set?</code></li>
<li><code>set</code></li>
<li><code>vector</code></li>
<li><code>doseq</code> (note - not supporting fancy <code>for</code> features yet)</li>
<li><code>list*</code></li>
<li><code>apply</code></li>
<li><code>some</code></li>
<li><code>not-any?</code></li>
<li><code>not=</code></li>
<li><code>symbol</code></li>
<li><code>var?</code></li>
<li><code>cond</code></li>
<li><code>and</code></li>
<li><code>or</code></li>
<li><code>ns</code></li>
</ul>
<p>All of these were needed by some of the above necessary functions, so I
implemented them as much as possible. Most of them have complete functional
parity with Clojure, but a few have interim implementations, especially since
jank doesn&rsquo;t yet have have an equivalent object type to Clojure JVM&rsquo;s <code>LazySeq</code>.
Still, jank feels, and looks, more and more like a proper Clojure every day.</p>
<h3 id="bonus-initial-aot-compilation">(Bonus) Initial AOT compilation</h3>
<p>You may have noticed, in that list, that <code>compile</code> has been implemented. This is
an initial step toward AOT compilation and it compiles jank files into C++ files
on the class path. Those can then be loaded in lieu of the jank files for a
performance win. I also added a CMake job to jank&rsquo;s build system to build the
jank Clojure libs along with the compiler, so we can always have those
pre-compiled and also always know they actually compile.</p>
<p>I&rsquo;m currently working with the Cling developers to get support added to Cling
for jank to pre-compile these C++ files into a closer equivalent to JVM class files.
In my local testing, the startup time improvements by doing this were 10x. I&rsquo;ll
have more info on this once the work picks up.</p>
<h3 id="bonus-cli-argument-parsing">(Bonus) CLI argument parsing</h3>
<p>In order to support things like user-defined class paths, I&rsquo;ve added a proper
CLI arg parser to jank. You can see the current options in the help output here:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">❯ ./build/jank -h
jank compiler
Usage: ./build/jank <span style="color:#f92672">[</span>OPTIONS<span style="color:#f92672">]</span> SUBCOMMAND

Options:
  -h,--help                   Print this help message and exit
  --class-path TEXT           A : separated list of directories, JAR files, and ZIP files to search <span style="color:#66d9ef">for</span> modules
  --output-dir TEXT           The base directory where compiled modules are written
  --profile                   Enable compiler and runtime profiling
  --profile-output TEXT       The file to write profile entries <span style="color:#f92672">(</span>will be overwritten<span style="color:#f92672">)</span>
  --gc-incremental            Enable incremental GC collection
  -O,--optimization INT:INT in <span style="color:#f92672">[</span><span style="color:#ae81ff">0</span> - 3<span style="color:#f92672">]</span>
                              The optimization level to use

Subcommands:
  run                         Load and run a file
  compile                     Compile a file and its dependencies
  repl                        Start up a terminal REPL and optional server
</code></pre></div><p>Each subcommand has its own help output, too. Speaking of subcommands, however,
jank now has a <code>repl</code> subcommand which spins up a terminal REPL client with
readline enabled for (single session) history and improved editing. This has
been very handy for me as I&rsquo;m testing out new things and was something that just
came naturally after implementing the CLI argument parsing.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#960050;background-color:#1e0010">❯</span> ./build/jank repl
&gt; (<span style="color:#66d9ef">ns </span>foo.bar)
nil
&gt; *ns*
foo.bar
&gt; (<span style="color:#66d9ef">def </span>wow <span style="color:#e6db74">&#34;WOW!&#34;</span>)
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;foo.bar/wow</span>
&gt; (<span style="color:#66d9ef">def </span>nice <span style="color:#e6db74">&#34;NICE!&#34;</span>)
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;foo.bar/nice</span>
&gt; (<span style="color:#66d9ef">ns </span>main)
nil
&gt; *ns*
main
&gt; (refer <span style="color:#e6db74">&#39;foo.bar</span> <span style="color:#e6db74">:only</span> <span style="color:#f92672">&#39;</span>[wow])
nil
&gt; wow
WOW!
&gt; (<span style="color:#a6e22e">alias</span> <span style="color:#e6db74">&#39;fb</span> <span style="color:#e6db74">&#39;foo.bar</span>)
nil
&gt; fb/nice
NICE!
&gt; (<span style="color:#66d9ef">ns </span>omg.wow (<span style="color:#e6db74">:use</span> [foo.bar <span style="color:#e6db74">:exclude</span> [wow]]))
nil
&gt; *ns*
omg.wow
&gt; nice
NICE!
&gt; (<span style="color:#a6e22e">native/raw</span> <span style="color:#e6db74">&#34;*((char*)0) = 0;&#34;</span>)
Segmentation fault (<span style="color:#a6e22e">core</span> dumped)
</code></pre></div><h3 id="bonus-maps-sets-keywords-as-functions">(Bonus) Maps, sets, keywords as functions</h3>
<p>As part of implementing all of the new core functions this quarter, I also
tackled these particular objects which behave as functions. Fortunately, because
of the new object model design, these objects can have this behavior without the
need for dynamic dispatch!</p>
<h3 id="there-will-be-bugs">There will be bugs</h3>
<p>jank is still pre-alpha software. I have an ever growing test suite, but no
battle testing yet. As I develop more functionality, I find more issues and
introduce more yet. That will remain the case until development can settle down
and stable APIs can be decided. jank still isn&rsquo;t ready to compile most Clojure
programs, since it lacks support for some basic features like destructuring,
lazy sequences, and even doc strings. While we&rsquo;re talking about bugs, though,
and since I&rsquo;ve shown everything else I&rsquo;ve built this quarter, let me tell you
about such an interesting bug I found and how I fixed it.</p>
<h2 id="variadic-argument-matching-bug">Variadic argument matching bug</h2>
<p>I fixed a few interesting bugs in the past couple of months, but this one was
the most intriguing by far. So, the problem showed up in this case:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defn </span>ambiguous
  ([a]
   <span style="color:#e6db74">:fixed</span>)
  ([a <span style="color:#f92672">&amp;</span> args]
   <span style="color:#e6db74">:variadic</span>))

(<span style="color:#a6e22e">ambiguous</span> <span style="color:#e6db74">:a</span>) <span style="color:#75715e">; =&gt; should be :fixed</span>
</code></pre></div><p>What jank was trying to do was call the variadic arity, with an empty seq for
<code>args</code>, rather than to call the fixed arity. This is because both of them
require one fixed argument first and the information I was storing for each
function object was the required fixed args prior to variadic arg packing.</p>
<p>The equivalent function in Clojure JVM is <code>RestFn.getRequiredArity</code>, which
returns the required fixed position arguments prior to the packed args. However,
where Clojure JVM differs from jank is that Clojure uses dynamic dispatch to
solve this ambiguity whereas jank does its own fixed vs variadic overload
matching, for performance reasons.</p>
<p>To actually solve this problem, we need to know three things:</p>
<ol>
<li>Is the function variadic?</li>
<li>Is there an ambiguous fixed overload?</li>
<li>How many fixed arguments are required before the packed args?</li>
</ol>
<p>We cannot perform the correct call without <em>all</em> of this information.
Also, function calls in a functional programming language like Clojure are on
the hottest of hot code paths, so I can&rsquo;t exactly add two more virtual functions
to jank&rsquo;s <code>callable</code> interface to get this data. In truth, even keeping one
function but putting all of this data in a struct proved too much of an impact
on the performance. Thus, we need to encode the data more compactly.</p>
<p>jank now packs all of this into a single byte. Questions 1 and 2 each get a high bit
and question 3 gets the 6 remaining bits (of which it uses 4) to store the fixed
arg count. So, this byte for our <code>ambiguous</code> function above would look like
this:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp"><span style="color:#ae81ff">1</span>  <span style="color:#ae81ff">1</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">0</span>  <span style="color:#ae81ff">1</span>
<span style="color:#f92672">^</span>  <span style="color:#f92672">^</span>  <span style="color:#f92672">^---------------</span>
<span style="color:#f92672">|</span>  <span style="color:#f92672">|</span>  <span style="color:#f92672">|</span>
<span style="color:#f92672">|</span>  <span style="color:#f92672">|</span>  <span style="color:#75715e">/* How many fixed arguments are required before the packed args? */</span>
<span style="color:#f92672">|</span>  <span style="color:#75715e">/* Is there an ambiguous overload? */</span>
<span style="color:#75715e">/* Is the function variadic? */</span>
</code></pre></div><p>From there, when we use it, we disable the bit for question 2 and we
<code>switch</code> on the rest. This allows us to do a <code>O(1)</code> jump on the combination of
whether it&rsquo;s variadic and the required fixed args. Finally, we only need the
question 2 bit to disambiguate one branch of each switch, which is the branch
equal to however many arguments we received.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cpp" data-lang="cpp">object_ptr <span style="color:#a6e22e">dynamic_call</span>(object_ptr <span style="color:#66d9ef">const</span> source, object_ptr <span style="color:#66d9ef">const</span> a1)
{
  <span style="color:#66d9ef">return</span> visit_object
  (
    [<span style="color:#f92672">=</span>](<span style="color:#66d9ef">auto</span> <span style="color:#66d9ef">const</span> typed_source) <span style="color:#f92672">-&gt;</span> object_ptr
    {
      <span style="color:#66d9ef">using</span> T <span style="color:#f92672">=</span> <span style="color:#66d9ef">typename</span> <span style="color:#66d9ef">decltype</span>(typed_source)<span style="color:#f92672">::</span>value_type;

      <span style="color:#66d9ef">if</span> <span style="color:#66d9ef">constexpr</span>(function_like<span style="color:#f92672">&lt;</span>T<span style="color:#f92672">&gt;</span> <span style="color:#f92672">||</span> std<span style="color:#f92672">::</span>is_base_of_v<span style="color:#f92672">&lt;</span>callable, T<span style="color:#f92672">&gt;</span>)
      {
        <span style="color:#75715e">/* This is the whole byte, answering all three questions. */</span>
        <span style="color:#66d9ef">auto</span> <span style="color:#66d9ef">const</span> arity_flags(typed_source<span style="color:#f92672">-&gt;</span>get_arity_flags());
        <span style="color:#75715e">/* We strip out the bit for ambiguous checking and switch on it. */</span>
        <span style="color:#66d9ef">auto</span> <span style="color:#66d9ef">const</span> mask(callable<span style="color:#f92672">::</span>extract_variadic_arity_mask(arity_flags));

        <span style="color:#75715e">/* We&#39;re matching on variadic + required arg position. */</span>
        <span style="color:#66d9ef">switch</span>(mask)
        {
          <span style="color:#66d9ef">case</span> callable<span style="color:#f92672">::</span>mask_variadic_arity(<span style="color:#ae81ff">0</span>)<span style="color:#f92672">:</span>
            <span style="color:#66d9ef">return</span> typed_source<span style="color:#f92672">-&gt;</span>call(make_box<span style="color:#f92672">&lt;</span>obj<span style="color:#f92672">::</span>native_array_sequence<span style="color:#f92672">&gt;</span>(a1));
          <span style="color:#66d9ef">case</span> callable<span style="color:#f92672">::</span>mask_variadic_arity(<span style="color:#ae81ff">1</span>)<span style="color:#f92672">:</span>
            <span style="color:#75715e">/* Only in the case where the arg count == the required arity do we
</span><span style="color:#75715e">               check the extra bit in the flags. */</span>
            <span style="color:#66d9ef">if</span>(<span style="color:#f92672">!</span>callable<span style="color:#f92672">::</span>is_variadic_ambiguous(arity_flags))
            { <span style="color:#66d9ef">return</span> typed_source<span style="color:#f92672">-&gt;</span>call(a1, obj<span style="color:#f92672">::</span>nil<span style="color:#f92672">::</span>nil_const()); }
            <span style="color:#75715e">/* We&#39;re falling through! */</span>
          <span style="color:#66d9ef">default</span><span style="color:#f92672">:</span>
            <span style="color:#75715e">/* The default case is not variadic. */</span>
            <span style="color:#66d9ef">return</span> typed_source<span style="color:#f92672">-&gt;</span>call(a1);
        }
      }
      <span style="color:#66d9ef">else</span>
      { <span style="color:#75715e">/* ... redacted error handling ... */</span> }
    },
    source
  );
}
</code></pre></div><p>The special case, which needs to check the ambiguous flag, incurs a performance
cost, due to the if. Every other case is unaffected. This was a challenge to
wrap my head around at first, but after I wrote out all the things I need to
know, as well as a test suite for each of the cases, I could work toward a
solution which addressed everything.</p>
<h2 id="whats-next">What&rsquo;s next?</h2>
<p>Firstly, dynamic vars. Once those are implemented, I&rsquo;ll need to go through all
of the different parts of the compiler and runtime to start filling in vars.
This will allow everything from improved error messages by tracking
file/line/function to cyclical dependency checks on module loading.</p>
<p>Also, in order for jank to operate alongside other Clojure dialects, we&rsquo;ll need
to support reader conditionals on the <code>:jank</code> key. Currently, jank doesn&rsquo;t
support any reader macros, so getting that system going will open up the door to
things like <code>#()</code> and <code>#{}</code> being supported.</p>
<p>Finally, I&rsquo;ll be improving the interop interpolation syntax to be consistent with
ClojureScript, adding meta hint support, and more. Stay tuned!<br>
Published 27 December 2023 <br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2024 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q1-2024-funding-announcement/</link>
      <pubDate>Wed, 10 Jan 2024 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2024-funding-announcement/</guid>
      <description>We are funding 8 projects for a total of $44K USD in Q1 2024.</description>
      <content:encoded><![CDATA[<p>Greetings as we start the new year! We’re excited to announce the projects we&rsquo;ll be funding for Q1 2024. (8 projects $44K USD in total).</p>
<p>There was a groundswell of great project proposals - so making a decision was definitely not easy.
The good news, however, is that new proposals will be automatically reconsidered for the next project cycle. We have supported many projects in the past that were funded in 2nd or even 3rd review.</p>
<p>Thanks to everyone for your hard work and creativity in putting these proposals together - this is the kind of thinking and sharing that makes the Clojurist Together community so awesome!</p>
<h3 id="q1-2024-projects-awarded-9k-usdbr">Q1 2024 Projects Awarded $9K USD<br></h3>
<p><a href="#cider-vemv">CIDER – VEMV</a><br>
<a href="#clojure-lsp-eric-dallo">Clojure-lsp – Eric Dallo</a><br>
<a href="#instaparse-mark-engelberg">Instaparse – Mark Engelberg</a><br>
<a href="#scicloj-daniel-slutsky">Scicloj – Daniel Slutsky</a></p>
<h3 id="q1-2024-projects-awarded-2k-usdbr">Q1 2024 Projects Awarded $2K USD<br></h3>
<p><a href="#jank-jeaye-wilkerson">Jank – Jeaye Wilkerson</a> <br>
<a href="#sitefox-chris-mccormick">Sitefox – Chris McCormick</a>. See his video.<br>
<a href="#unifybio-benjamin-kamphaus">UnifyBio – Benjamin Kamphaus</a>  <br>
<a href="#wolframite-thomas-clark-and-jakub-holy">Wolframite – Thomas Clark and Jakub Holy</a></p>
<p>Please join us in congratulating this talented group. We&rsquo;re looking forward to their project updates  in the coming months.</p>
<h3 id="q1-2024-projects-awarded-9k-usd">Q1 2024 Projects Awarded $9K USD</h3>
<h3 id="cider-vemv">CIDER: VEMV</h3>
<p>Work will be based on CIDER&rsquo;s issue trackers (cider, cider-nrepl, orchard).
Some of the larger themes will be: cider-inspector-mode refinements, cider-log-mode refinements, and refactoring our Java parsing machinery.</p>
<p><strong>Why is this project important to the Clojure community?</strong> Member <a href="https://www.clojuriststogether.org/news/call-for-proposals.-november-2023-member-survey/">survey</a> in November suggests there is a need for this work.   <br></p>
<hr>
<h3 id="clojure-lsp-eric-dallo">Clojure-lsp: Eric Dallo</h3>
<p>I will work on clojure-lsp project and related ones like lein-clojure-lsp, lsp4clj, and clojure-lsp-
intellij. My project will include adding missing LSP features, options to create clojure project from scratch for fast onboarding, better performance and stability.</p>
<p><strong>Why is this project important to the Clojure community?</strong>  For IntelliJ users, is the only open source free tool to use the main robust clojure-lsp and have static analysis features as an IDE like Calva for VScode, emacs and vim.</p>
<p><strong>I have in mind some activities like:</strong></p>
<ul>
<li>create a section in clojure-lsp webpage for guides and tutorials, with contents like for example &ldquo;how to work in mono-repo projects&rdquo;</li>
<li>Add more code actions and refactors, especially move-form and some highly requested by community</li>
<li>Improve the &ldquo;work out of the box&rdquo; experience for developers, requiring less configs or files to be able to use clojure-lsp features</li>
<li>Improve memory/performance, a tough constant work to make clojure-lsp a lightweight tool to run along with editors</li>
<li>Add more custom linters for diagnostics</li>
<li>Add more features to clojure-lsp-intellij, to make it a reliable tool for Clojure development on IntelliJ.
Besides those tasks, I&rsquo;ll keep actively helping the community in slack and github for LSP related issues and questions.  <br></li>
</ul>
<hr>
<h3 id="instaparse-mark-engelberg">Instaparse: Mark Engelberg</h3>
<p>My focus  will be on evaluating and incorporating pull requests for instaparse. Then, I will look at new features requested by the community. Along the way, I will make sure to keep the documentation updated.</p>
<p><strong>Why is this project important to the Clojure community?</strong> Instaparse has been incorporated into a number of other libraries, including some of the routing libraries (for parsing URLs) in some web stacks. Knowing how many libraries rely on its stability has placed an additional burden on me to carefully review and test pull requests. <br></p>
<hr>
<h3 id="scicloj-daniel-slutsky">Scicloj: Daniel Slutsky</h3>
<p>Scicloj is a Clojure group developing a stack of tools &amp; libraries for data science.
Alongside the technical challenges, community building has been an essential part of its
efforts since the beginning of 2019.<br>
Its current main community-oriented goal is making the existing data-science stack easy to
use. In particular, we need example-based documentation, easy setup, and recommended
workflows for common tasks. All these, and the tools to support them, need to grow
organically, driven by real-world use-cases.</p>
<p>I am currently working, in collaboration with others, on various components to support these
needs:</p>
<ol>
<li><a href="https://scicloj.github.io/">maintaining the Scicloj website</a></li>
<li><a href="https://scicloj.github.io/docs/community/groups/">running dev groups and study groups</a><br>
The most active ones are:<br>
2a. visual-tools &ndash; collaboration of tool-makers and discussion of literate programming, data
visualization, and UI design.<br>
2b. llm-meetups &ndash; discussions of the Clojure stack for large language models.<br>
2c. jointprob &ndash; studying probability &amp; statistics together with other tech communities.</li>
<li>developing tools &amp; libraries:<br>
3a. Kindly &ndash; a simple data-visualization standard to support compatibility across different
tools.<br>
3b. Clay &ndash; a notebook tool for interactive data exploration and literate programming.<br>
3c. Note-to-test &ndash; support for testable documentation.<br>
3d. Noj &ndash; a wrapper for a few of the relevant data-science libraries to support easy setup
and some convenience functions around it.</li>
<li>running public meetups.</li>
<li>helping out individuals to get started with data science in Clojure.</li>
</ol>
<p>Starting in Jan 2024, I am concentrating on two additional projects:<br>
6. clojure-data-scrapbook &ndash; a community space for documenting data analysis workflows &ndash;
similar to the clojure-data-cookbook, but less curated and more community-driven.<br>
7. real-world-data &ndash; a study group where individuals will bring their own data problems and
collaborate on common practices.</p>
<p>The project is to initiate items 6 &amp; 7 as a core activity of Scicloj to and keep maintaining
items 1-5, driven by the needs realised in 6 &amp; 7. Everything will be done.</p>
<p><strong>Why is this project important to the Clojure community?</strong> Clojure has a huge potential as a data science platform thanks to its REPL, simplicity, data-driven approach, visual support, interop support, and stability. This potential may apply not only to software developers and not only to scientists, but also to much broader crowds, practically anybody who has a data question.</p>
<p>Since 2019, Scicloj has been addressing this potential. On the technical side, the emerging stack of tools and libraries has matured very well. On the human side, there is still a long way to go till Clojure can become an obvious and welcoming choice for any person exploring some data. Even for people familiar with Clojure, some parts of the stack are not very well-known and not discoverable enough.</p>
<p>We have been continually addressing these challenges at Scicloj in multiple study groups and one-on-one sessions, and in developing tooling and workflows. Now, when the tooling is maturing, we are transitioning to the next phase, with the upcoming clojure-data-scrapbook and real-world-data projects. These will provide more Clojurians with the necessary support to get comfortable with their data analysis, and will allow us to keep evolving our workflows and documentation for more diverse workflows.</p>
<p>A well-documented and well-tested Clojure data science stack is expected to help many Clojure teams who often use Python when facing a data analysis need.</p>
<p>As a byproduct of our documentation efforts, some useful tools are emerging. We believe Clay and Note-to-test can be useful for documenting libraries in general, not just in the data-science scene.  <br></p>
<hr>
<h3 id="q1-2024-projects-awarded-2k-usdbr-1">Q1 2024 Projects Awarded $2K USD<br></h3>
<h3 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h3>
<p>There are some crucial missing pieces in jank which have been getting in the way of me reaching parity with Clojure. In order of importance, we have:</p>
<p><strong>Dynamic vars</strong><br>
Most people would be surprised how extensively the Clojure compiler and runtime use dynamic vars. Everything from the current locals in the scope to the current line/file info to the currently loaded namespaces and the current function is kept in dynamic vars. These vars are thread-local and stack-based; Clojure handles carrying them over to new threads automatically and pushes/pops new values to not clobber what was already there (i.e. binding).</p>
<p>So far, I&rsquo;ve worked around this by using mutable data, but that doesn&rsquo;t benefit from thread locality or the stack-based nature of dynamic vars. Having this support will allow me to go back and improve existing features, like parsing and module loading, to better keep track of this data (and be more easily parallelized).</p>
<p><strong>Syntax quoting</strong>
jank has macro support, currently, but no syntax quoting, unquoting, or splicing. That means writing non-trivial macros like ns, and, or, and defn is not sane, so jank either doesn&rsquo;t have them or has very stripped down versions of them. By supporting this, I can then go in and add these common macros and jank will immediately feel much more complete.</p>
<p><strong>Bonus</strong><br>
I think the above two items are fairly complex and I don&rsquo;t want to over-promise. However, I can see the possibility that I can push through them with some time remaining in the quarter, so I have a couple of other tasks I&rsquo;ll tackle if that happens.</p>
<p><strong>Meta hints</strong>
jank doesn&rsquo;t currently support ^:foo or ^{:foo true} meta hints on forms, though it does support functions like reset-meta!. Supporting these hints, in the lexer and parser, will clean up some existing jank code (which uses reset-meta! everywhere) and pave the way for type hinting, too.</p>
<p><strong>Normalized interpolation syntax</strong>
Within a native/raw, one can reach back into jank using the #{ foo } interpolation syntax. However, the community has pointed out that CLJS already uses ~{ foo } and it&rsquo;d be more consistent for jank to do the same. On top of that, jank&rsquo;s parsing for these interpolation forms is pretty rough right now and there is C++ code which would trip it up. It can be improved by hooking more tightly into jank&rsquo;s parser, but that will require adding metadata to the parsed forms to convey their line/column info.</p>
<p><strong>Why is this project important to the Clojure community?</strong> jank is the <em>only</em> native Clojure dialect which has its own JIT and embraces interactive programming. It unlocks REPL-driven development for a whole ecosystem previously unserved by Clojure.</p>
<p>Clojurists have demonstrated their desire for native executables with their use of GraalVM. Compared to Graal, jank will offer REPL support, better performance, better native interop, smaller binaries, and faster compilation times.  <br></p>
<hr>
<h3 id="sitefox-chris-mccormick">Sitefox: Chris McCormick</h3>
<p>Hear from Chris first-hand. <strong>Check out Chris' video about his Clojurists Together project <a href="https://youtu.be/DPT_METwf70?feature=shared">here.</a></strong></p>
<p>Here&rsquo;s what I would like to accomplish in Sitefox using the Clojurists Together funding:</p>
<ul>
<li>Bring dependencies up to date.</li>
<li>Tidy up the key-value database module &amp; write basic tests.</li>
<li>Improve the end-to-end tests to ensure greater reliability under change. * Improve error handling by making errors more verbose.</li>
<li>Test and document deployment of Sitefox sites on 3 or more Node.js providers.</li>
<li>Make two concise how-to videos showing people how to building simple sites and apps with Sitefox.</li>
<li>Edit together text tutorials based on AI transcripts of the videos.</li>
<li>Remove &ldquo;WIP&rdquo; from the project description and coordinate a &ldquo;ready for the public&rdquo; release</li>
</ul>
<p><strong>Why is this project important to the Clojure community?</strong> Sitefox is a full stack ClojureScript library. That means it is deployed on Node.js rather than Java. I think this architecture is under-explored and has benefits for people who come from the non-JVM side of things.  <br></p>
<hr>
<h3 id="unifybio-benjamin-kamphaus">UnifyBio: Benjamin Kamphaus</h3>
<p>Broad project scope: Converting the CANDELBio ecosystem I helped create at the Parker Institute for Cancer Immunotherapy from its open source, but semi-abandoned state to UnifyBio, a world class data harmonization platform: Clojure-first and permissively open source (Apache 2.0).</p>
<p>The successor to CANDELBio’s pret tool will be the more generally useful Unify, at <a href="https://github.com/vendekagon-labs/unify">https://github.com/vendekagon-labs/unify</a> and broadly useful for data harmonization or importing data into datalog-oriented stores. I’ll be streaming the dev process over video and sharing selection of this via YouTube.</p>
<p>The first major need I will be addressing under Clojurists Together funding is a documentation and tutorial overhaul: building out examples, CLI/API and use documentation, end-to-end tutorials, likely example Clerk notebooks (or comparable) showing all the steps from raw data collection, to the data-driven import process, to query, then analysis and visualization.</p>
<p>I&rsquo;ll also be getting an automated release process in place, with supporting CI/CD, etc. From there, I&rsquo;ll be looking to harden the existing functionality with better example systems and tests covering more use cases beyond biology.</p>
<p>From there, the priorities are:</p>
<ul>
<li>Vetting integration with other components of the Clojure data science stack and supporting use of data integrated via Unify (eg access data through tech.ml.dataset&rsquo;s api surface).</li>
<li>Building more compelling use cases for distributed processing for biology, especially around single cell and -omics data, expanding Unify’s functionality as necessary to do this.</li>
<li>Part of this will be assessing and possibly contributing to or deriving from or otherwise building successors to Onyx, Clojask, etc. (non-spark based Clojure distributed processing tools).</li>
<li>I’ll also be writing the current Datomic database layer backend to be more generalizable and able to be written to other stores, assessing Datahike as the first priority here.</li>
</ul>
<p>As the project hits the maturity point for use (anticipated very soon, likely early January) with sufficient docs, tutorials, and examples, I’ll be sharing in Clojure community channel areas, especially data-science, data-engineering, datomic users, etc. and spend time supporting users who think they might benefit. I will also reach out to former PICI informatics employees at several organizations that I know are having trouble with data integration, to let them know there’s a successor to CANDEL that’s open source and staffed/supported, to see if I can get inroads for adoption from external bio users not otherwise involved in Clojure.</p>
<p><strong>Why is this project important to the Clojure community?</strong> This is a pilot project that solves a variety of problems relevant to many, such as automating the process of converting ad hoc tables into harmonized entities that can be transacted into Datomic and other Datalog oriented databases. Also, this is already a first-in-class set of data harmonization tools for biological data science, some of which are being imitated by startups with many millions in funding. If it can be given more love and effort as an open source project, it can help establish Clojure in the life sciences, much like NextFlow did for Groovy.</p>
<p>The streams and dev blogs will also give provide a helpful resource for anyone who wants a better understanding of how production grade Clojure projects are built.  <br></p>
<hr>
<h3 id="wolframite-thomas-clark-and-jakub-holy">Wolframite: Thomas Clark and Jakub Holy</h3>
<p>Currently, there is an existing library for wolfram&lt;&gt;clojure interop but it&rsquo;s lack of documentation, reliability and usability mean that it is not widely used or known.  We hope to fix all of these issues and so bring wolfram interop up to the standards of similar bridges like clojisr and libpython-clj. Specifically, fundamental goals would be to:</p>
<ul>
<li>merge recent work</li>
<li>create comprehensive inline documentation</li>
<li>create big-picture example namespaces: including onboarding tutorials and real-world examples (publically available in visible places like the sci-cloj website and high-impact blogs).</li>
<li>expand kernel parallelism</li>
<li>expand wolfram external package integration</li>
<li>streamline user setup so that wolfram functions can be used almost as easily as other data libraries</li>
<li>build the foundations for closely integrating wolfram with the <a href="https://github.com/mentat-collective/emmy">emmy symbolic clojure system</a></li>
</ul>
<p><strong>Why is this project important to the Clojure community?</strong> Of the areas of desired improvement that the Clojure survey highlighted, this project would address the specific categories of data analysis, documentation and user growth.</p>
<p>Data analysis/processing, as also expressed by the Clojure leadership team, is a key growth area for the language but library coverage can be fragmented, with missing depth of functionality.</p>
<p>Having access to specialised algorithms/functions however, can make or break analysis projects and so reestablishing a stable bridge between clojure and a first-in-class analysis language like Wolfram would go a long way in reassuring language choosers that Clojure can always meet their needs, even when there is no pure clojure library available.</p>
<p>Another key community area is the expansion of the community itself. Following on from above, there is a large section of the numerical scientific community who are not programmers but who rely on tools like Mathematica and Matlab and so interop in these areas will be crucial for community cross-over in the future. Generalized language interop is particularly important for safe onboarding of new users and experience suggests that there is a willing &lsquo;market&rsquo; for integrating specialist tools within more comfortable general languages like Clojure.</p>
<p>Finally, this project would not only have its own benefits but it could lay the groundwork for future integration with the &lsquo;emmy&rsquo; symbolic physics library. The emmy system is bringing open-source symbolic computation to both the back- and front-ends but it is missing key features and advanced libraries. A wolfram bridge could serve as a sure foundation and help create the real possibility of an almost unique physics programming space that clojure would be a great fit for but is not quite ready for.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together 2024 Long-Term Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-2024-long-term-funding-announcement/</link>
      <pubDate>Sat, 23 Dec 2023 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-2024-long-term-funding-announcement/</guid>
      <description>Clojurists Together is funding 8 developers $1.5k/month for 12 months</description>
      <content:encoded><![CDATA[<p>The votes are in!! Clojurists Together members have voted to to fund 8 developers $1.5k/month for 12 months ($144k USD total!). We&rsquo;re pleased to announce the following developers/teams who will be funded:</p>
<ul>
<li><a href="#bozhidar-batsov">Bozhidar Batsov</a></li>
<li><a href="#kira-mclean">Kira McLean</a></li>
<li><a href="#michiel-borkent">Michiel Borkent</a></li>
<li><a href="#nikita-prokopov">Nikita Prokopov</a></li>
<li><a href="#peter-taoussanis">Peter Taoussanis</a></li>
<li><a href="#thomas-heller">Thomas Heller</a></li>
<li><a href="#toby-crawley">Toby Crawley</a></li>
<li><a href="#tommi-reiman">Tommi Reiman</a></li>
</ul>
<p>We are very excited to see what these developers will do over the next year. They will post updates every two months of what they&rsquo;ve been working on, and we&rsquo;ll share them in our regular monthly updates. Here&rsquo;s what each of these developers plan to work on (although this is just a starting point and they&rsquo;re free to change their plans as they see fit):</p>
<h3 id="bozhidar-batsov">Bozhidar Batsov</h3>
<p>Provide continued support for CIDER, nREPL and the related libraries and improve them in
various directions. Some ideas that I have in my mind:</p>
<ul>
<li>Make CIDER play better with alternative Clojure(Script) runtimes</li>
<li>Simplify some of CIDER&rsquo;s internals (e.g. jack-in, session management)</li>
<li>Improve CIDER&rsquo;s documentation</li>
<li>Provided out-of-the-box support for TreeSitter (via clojure-ts-mode)</li>
<li>Continue to move logic outside of cider-nrepl</li>
<li>Improvement to the nREPL specification and documentation; potentially built some test suite for nREPL specification compatibility</li>
<li>Various improvements to the nREPL protocol</li>
<li>Kick-off work on CIDER 2</li>
</ul>
<h3 id="kira-mclean">Kira McLean</h3>
<p>I&rsquo;ll use the time that this money frees up to work on projects that benefit the Clojure community, starting with educational materials for the scicloj community, and continuing on with various related projects as the year goes on.</p>
<h3 id="michiel-borkent">Michiel Borkent</h3>
<p>I&rsquo;ll continue to maintain and develop clj-kondo, babashka, SCI, cherry, squint and several all other related projects.</p>
<h3 id="nikita-prokopov">Nikita Prokopov</h3>
<p>I propose to work on the following open-sourse projects:</p>
<ul>
<li>Continue developing Humble UI, a UI framework in Clojure for building desktop applications</li>
<li>Documenting, promoting and teaching Humble UI</li>
<li>Develop data synchronization layer for DataScript, an in-memory database and Datalog engine</li>
<li>Support and extend Clojure Sublimed, a Sublime Text plugin for Clojure development</li>
</ul>
<h3 id="peter-taoussanis">Peter Taoussanis</h3>
<p>Planned work includes:</p>
<ul>
<li>Ongoing work for existing open-source libraries: improvements, maintenance, support, etc.</li>
<li>Stable releases for new libraries: Tempel (data security framework), and a structured telemetry library (final name TBD).</li>
<li>Continued work on updating Carmine core for latest Redis versions/features.</li>
<li>Detailed roadmap and timelines TBD based on demand/feedback, and how things progress.</li>
</ul>
<h3 id="thomas-heller">Thomas Heller</h3>
<p>I&rsquo;ll focus on maintenance and further development of shadow-cljs, and other shadow-themed projects.</p>
<h3 id="toby-crawley">Toby Crawley</h3>
<p>My focus will be the ongoing maintenance for Clojars - including:</p>
<ul>
<li>OS and system package upgrades</li>
<li>Reviewing and merging PRs</li>
<li>Deploying changes</li>
<li>Monitoring bandwidth/resource usage to detect anomalies</li>
<li>General operational tweaks and improvements</li>
<li>Tuning search algorithms</li>
<li>Security improvements, fixes, and responding to security reports</li>
</ul>
<h3 id="tommi-reiman">Tommi Reiman</h3>
<p>I will work with Clojure Open Source projects, malli being the propable main focus, but also with new libraries that I find useful and are missing from the Clojure community/ecosystem.</p>
<h2 id="thanks">Thanks</h2>
<p>Thank you to all of our members for selecting these developers. If it wasn&rsquo;t for your generous support, this wouldn&rsquo;t be possible. I wanted to add a special thanks to Latacora, Roam Research, Whimsical, Stylitics, Pitch, Nubank, Cisco, Logseq, JUXT, Metosin, Solita, Adgoji, Grammarly, Nextjournal, ClojureStream, Shortcut, Flexiana, Toyokumo, Griffin, doctronic, 180° Seguros, and Kroo Bank. They have all contributed significant amounts to Clojurists Together which lets us award $144,000 in long-term funding to Clojure developers.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Thanks..and More</title>
      <link>https://www.clojuriststogether.org/news/thanks..and-more/</link>
      <pubDate>Wed, 20 Dec 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/thanks..and-more/</guid>
      <description>Your support went a long way this year.</description>
      <content:encoded><![CDATA[<h2 id="thank-you">THANK YOU!</h2>
<p>As 2023 comes to a close we want to reach out and thank you for supporting Clojure, open-source, and the Clojurists Together community.</p>
<p>We&rsquo;ve been able to accomplish a lot this year with your support.  Your input on our quarterly surveys is critical to ensuring that we are funding work that is needed, valued, and adopted by the community at large. We appreciate your subscription to our regular news and updates dispatches - as we believe it encourages wider use of the tools and resources of the developers we have funded - strengthening and advancing the open-source and Clojure community.  It’s what we&rsquo;re all about.</p>
<p><strong>We’re hearing from about 25% of our members and subscribers</strong> on each of our quarterly surveys (which is actually pretty good as surveys go). In addition to requesting specific tools and improvements, we have heard a consistent call for better documentation (content, presentation, and organization) and more support for engaging and supporting new Clojure users. This year, we received and funded several proposals that focused on these needs and will continue to encourage work in these areas.</p>
<p><strong>In 2023, we funded 30 shorter-term projects ($150,000 USD). 11 developers received a monthly stipend for the year ($187,500 USD in long-term funding). In total, we  funded $337,500 of projects in 2023. Since 2018, Clojurists Together has awarded $935,000 to 76 developers working on more than 120 projects.</strong></p>
<p>We encourage everyone in the Clojurist community to stay involved - by providing input on surveys and submitting project ideas for funding.  In addition, members are able  to vote on the  annual Long Term Funding recipients as well as board members.  The more ideas, solutions, and engaged members, the better!!  And of course, as we increase membership funding, more resources will be available to fund important projects.  In 2023, 93% of our membership revenue was allocated to projects  – unheard of!!  (You can join as a <a href="https://www.clojuriststogether.org/developers/">Developer</a> or as a <a href="https://www.clojuriststogether.org/companies/">Company</a>).</p>
<h3 id="hear-from-a-few-of-our-2023-long-term-developers">Hear from a few of our 2023 long-term developers:</h3>
<p>    <em>“Clojurists Together has helped me maintain and improve babashka, SCI,      clj-kondo while working on new projects like squint. I’m grateful that CT exists      to help the Clojure open source ecosystem thrive.” - Michiel Borkent</em></p>
<p>    <em>“I greatly appreciate the funding from Clojurists Together to support my work     on Clojars! Clojars is a critical piece of infrastructure for the Clojure     community,and this funding allows me to focus on maintaining and     improving it.” - Toby Crawley</em></p>
<p>    <em>&ldquo;The continuous support for my work on CIDER by Clojurists Together     allowed me to keep it at the top of my OSS priorities and to provide a steady     stream of updates throughout the entire 2023. It&rsquo;s safe to say that without     Clojurists Together CIDER wouldn&rsquo;t be what it is today. Thanks a lot for your     support! You rock!&rdquo; - Bozhidar Batsov</em></p>
<p>    <em>&ldquo;Clojurists Together long-term funding has enabled me to take days off work      and dedicate them to opensource projects, as well as providing a great     incentive to turn weekends into opensource project time. This has enabled me      to spend a lot of time working on <a href="https://clojure-doc.org">https://clojure-doc.org</a> &ndash; both reviewing and      updating existing content as well as writing a lot of new content, to reflect the      changes in the Clojure ecosystem over the last decade (much of the existing      content dated back to Clojure 1.4!) &ndash; in addition to supporting regular updates      and releases of projects that I&rsquo;ve been maintaining somewhat irregularly over      the years.&rdquo; - Sean Corfield</em></p>
<p>    <em>&ldquo;Thanks to Clojurist Together Long Term Funding I’ve been able to find quality      time on developing and maintaining open source libraries including malli, reitit     and others. I feel privileged for the support.&quot;- Tommi Reiman</em></p>
<h3 id="fun-facts-and-thank-yous">FUN FACTS and THANK YOUS!</h3>
<p>We are truly an international group bringing a wide range of experience. From Q1 2022 to Q3 2023, we funded developers working in 18 countries including  Austria, Belgium, Brazil, Bulgaria, Canada, Denmark, England, Finland, France, Germany, Lithuania, Netherlands, Norway, Poland, Serbia, Sweden, UK and the US.</p>
<p><strong>Our members are committed and find mentorship rewarding.</strong></p>
<ul>
<li>66% have been members since 2020.</li>
<li>82% have been developing in Clojure for 5 years or more.</li>
<li>88% have mentored others (formally or informally) or taught classes.</li>
</ul>
<p><strong>This staggering amount of work has benefited our members and the broader Clojurist community.</strong> A thanks goes out to all the developers for their commitment and contributions to the community over the last 6 years: <em>Adam Helins, Alexander Oloo, Ambrose Bonnaire-Sergeant, Arne Brasseur, Ashima Panjwani, Baptiste Dupuch, Ben Brinckerhoff, Bobbi Towers, Bozhidar Batsov, Brandon Ringe, Bruce Hauman, Chris Badahdah, Charles Comstock, Christian Johansen, Christophe Grand, Dainius Jocas, Daniel Higginbotham, Danny Freeman, David Levy, David Nolen, Dragan Duric, Eric Dallo, Ethan Miller, Gert Goet, Grodziski, Henry Widd, Iizuka Masashi, Isaac Johnston, Jack Rusher, Jacob O&rsquo;Bryant, James Reeves, Jeaye Wilkerson, John Stevenson, Joakim Tengstrand, Joel Holdbrooks, José Luis Lafuente, Juho Teperi, Karol Wójcik, Kira McLean, Konrad Kühne, Lee Hinman, Lukas Domagala, Martin Kavalar, Matthew Davidson, Matthew Huebert, Matthew Ratzke, Michael Sappler, Michiel Borkent, Mike Fikes, Mitesh Shah, Nikita Prokopov, Oleksii Kachaiev, Oliver Caldwell, Othman Azil, Peter Stromberg, Peter Taoussanis, Sam Ritchie, Savo Djuric, Sean Corfield, Sebastian Zartner, Thomas Heller, Tim Pope, Toby Crawley, Tommi Jalkanen, Tommi Reiman, Vladislav Protsenko, William Acton, Zach Oakes, Žygis Medelis, and the team at Gaiwan.</em></p>
<p><strong>2023 developers receiving annual funding:</strong> Bozhidar Batsov, Michiel Borkent, Sean Corfield, Eric Dallo, Christophe Grand, Thomas Heller, Nikita Prokopov, Tommi Reiman, Peter Stromberg, Peter Taoussanis, and Toby Crawley.</p>
<p><strong>In 2023, our shorter-term projects included:</strong> Aleph/Manifold, Biff, Bosquet, Clerk, clj-kondo et al, clj-Nix, Clojure Camp, clojure-ts-mode, Custom Formatters/Firefox. Deps-try. Donut, Doxa, Emmy, Exercism, GDL, Jank, Lucene Grep, Uncomplicate Neanderthal, Deep Diamond, Portfolio, and Quil.</p>
<p><strong>Finally, a shout-out to the companies and organizations who have supported our work throughout the year and most for many years.</strong> They believe in Open Source development and have made a commitment to Clojure as an important tool for their product, service, and organizational projects. If your company might consider becoming a sponsoring member, please contact Daniel Compton at <a href="mailto:daniel@clojuriststogether.org">daniel@clojuriststogether.org</a>  to explore further.
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/2a4f571c-3394-4a19-855a-a0b2b5da3aae" alt="image"></p>
<p>Let’s join in celebrating this wonderful community - and hoping for peace in the New Year.</p>
<p>lvh, Maria, Daniel, Heather, Felix, Max (Clojurists Together Board), Kathy (Program Manager).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>November 2023 Short-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/november-2023-short-term-project-updates/</link>
      <pubDate>Wed, 06 Dec 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/november-2023-short-term-project-updates/</guid>
      <description>The latest from Biff, Bosquet, Clj-kondo, Deps-try,GDL,Quil, Uncomplicate</description>
      <content:encoded><![CDATA[<p>Check out the latest updates from Q2 and Q3 2023 Short Term Project developers. Thanks to members for your support - making this work possible!</p>
<p><a href="#biff-jacob-obryant">Biff: Jacob O’Bryant</a><br>
<a href="#bosquet-%C5%BEygis-medelis">Bosquet: Žygis Medelis</a><br>
<a href="#clj-kondo-babashka-cherry-sci-michiel-borkent">Clj-kondo, babashka, cherry, SCI: Michiel Borkent</a><br>
<a href="#deps-try-gert-goet">Deps-try: Gert Goet</a><br>
<a href="#gdl-michael-sappler">GDL: Michael Sappler</a><br>
<a href="#quil-jack-rusher-and-charles-comstock">Quil: Jack Rusher and Charles Comstock</a><br>
<a href="#uncomplicate-dragan-duric">Uncomplicate: Dragan Duric</a></p>
<h2 id="biff-jacob-obryant">Biff: Jacob O’Bryant</h2>
<p><strong>2023 Q3 Report 2. Published 30 November 2023.</strong></p>
<p>Since the <a href="https://www.clojuriststogether.org/news/october-2023-project-updates/#biff-jacob-o'bryant">first update</a>, I have completed:</p>
<ul>
<li>wrote the second half of <a href="https://biffweb.com/p/xtdb-compared-to-other-databases">XTDB compared to other databases</a>.</li>
<li>published another essay, <a href="https://biffweb.com/p/philosophy-of-biff/">Philosophy of Biff</a>.</li>
<li>added a <a href="https://biffweb.com/docs/get-started/should-you-use-biff/">Should you use Biff?</a> page to the Get Started docs.</li>
<li>published two how-to guides (including fully working example code): <a href="https://biffweb.com/p/how-to-use-postgres-with-biff/">How to use Postgres with
Biff</a> and <a href="https://biffweb.com/p/how-to-use-re-frame-with-biff">How to use re-frame with
Biff</a>.</li>
<li>finished <a href="https://github.com/jacobobryant/biff-docker2">the example code</a> for a future &ldquo;how to deploy Biff with Docker&rdquo; guide. That repo includes code for building an uberjar + Docker container, and I&rsquo;ve successfully deployed it to Fly.io and DigitalOcean App Platform.</li>
</ul>
<p>On the last point: I was going to write up a quick accompanying how-to post to go along with that Biff-Docker example repo. However, I don&rsquo;t really feel comfortable recommending Fly.io or DO App Platform at this stage. Fly.io had some weird, show-stopping networking errors when I tried to use it just recently. DO App Platform worked, but their UI around deployment/logs was clunky and didn&rsquo;t inspire confidence (I did also encounter at least one small bug). I am extremely wary of unreliable deployments which have been a pain point for me in the past. If you&rsquo;re small enough to consider using either of those platforms, I think you&rsquo;re far better off going with plain VMs (e.g. DigitalOcean droplets), which
is why that&rsquo;s the default in Biff.</p>
<p>IMO Docker-based deployment is a much better fit for organizations that are to the point where using
AWS/Azure/GCP/Kubernetes makes sense. As such, my plan is to get that example repo deployed on Kubernetes (DigitalOcean&rsquo;s managed offering, specifically) and then write a how-to guide to go along with that.</p>
<p>I will say that I am excited about Fly.io. Of all the &ldquo;next-gen Heroku&rdquo; platforms I&rsquo;m aware of (Fly, Render, Railway, DO App Platform), Fly is IMO the most promising. Making it easy to run any Docker-based app at the edge (instead of e.g. just Javascript apps) is a particularly good fit for apps that use htmx (like Biff apps, by default). I&rsquo;m guessing that the issues I&rsquo;ve experienced with Fly are due to them <a href="https://community.fly.io/t/reliability-its-not-great/11253">still having lots of growth and having trouble keeping up with it</a>, which seems like not the worst problem you could
have! After they&rsquo;ve become as reliable as DO droplets, I think there&rsquo;s a good chance I&rsquo;ll have Biff use them as the default deployment option.</p>
<p>Anyway: thank you for the grant! I&rsquo;m really happy with where Biff&rsquo;s documentation is now&ndash;it solidly covers the <a href="https://documentation.divio.com/">four main areas</a> of tutorials, reference, how-to guides and explanation (essays). I&rsquo;ve also been receiving some really kind feedback from the community as I&rsquo;ve been publishing these articles (<a href="https://www.reddit.com/r/Clojure/comments/17qqnav/philosophy_of_biff">for example</a>.<br></p>
<hr>
<h2 id="bosquet-žygis-medelis">Bosquet: Žygis Medelis</h2>
<p><strong>2023 Q3 Report 2. Published 30 October 2023.</strong></p>
<ol>
<li>Settle on Clerk-generated static content, published on GH Pages as the home for Bosquet documentation.</li>
<li><a href="https://zmedelis.github.io/bosquet/">Documentation</a>:
<ol>
<li>Getting Started guide</li>
<li>Configuration. Bosquet relies heavily on declaring how AI generation is executed. The parameter setting is getting quite rich.</li>
<li>Use cases. Generating interpretable code for math calculations</li>
<li>Papers. Implementation of various academic papers discussing LLM techniques.</li>
<li>Guide on how to use Short-term memory</li>
</ol>
</li>
<li>Substantial time was spent on a dead end trying to work out local embedding vector generation. The rationale was to have a self-contained system offering embeddings. <strong>Deeplearning4j</strong> and <strong>StandfordNLP</strong> Java libs proved to be too opaque, with no good implementations for this task.</li>
<li>Support for <em>OpenAI</em> <strong>embeddings</strong> added to Bosquet. Now library users can create and use OAI embeddings as part of memory-driven workflows.</li>
<li>To store and use Embeddings we need <strong>Vector DB</strong>. I have settled on using <a href="https://qdrant.tech/">Qdrant</a> as the database of choice. The implementation is still to be tested and changed with more rigorous testing and possibly various LLM papers implementations (see &lsquo;Papers&rsquo; in documentation)</li>
<li>With that done, two types of memory are now introduced
<ol>
<li><strong>Short-term memory</strong> acts as a simple illustration of memory and retrieval concepts</li>
<li><strong>Long-term memory</strong> using Qdrant and OAI embeddings (as noted above likely to evolve and change). Follow <code>:memory/long-term-embeddings</code> in <code>system.edn</code> to see how it is built.</li>
</ol>
</li>
<li>To aid in embeddingless (simple memory) scenarios, I have added <strong>similarity metrics</strong> support to compare different texts. It is based on <a href="https://commons.apache.org/proper/commons-text/apidocs/org/apache/commons/text/similarity/package-summary.html">Apache Commons</a> text package.</li>
<li>The <strong>caching</strong> of generation results is reintroduced. Now LLM requests can be fulfilled from the cache if prompt and parameters do not change. Great to boost development speed development and save on some costs.</li>
<li><strong>Output coercion</strong>. To achieve more complex chained prompt executions (or in agent use cases) where outputs the output from one LLM step needs to feed into the other we need well-defined in and out formats. Bosquet introduced the coercing of LLM outputs into <em>JSON</em> and <em>EDN</em> formats. See <a href="https://zmedelis.github.io/bosquet/notebook/papers/chain_of_density">Chain of Density</a> paper implementation for details.</li>
</ol>
<h4 id="2023-q3-report-3-published-30-november-2023">2023 Q3 Report 3. Published 30 November 2023</h4>
<ul>
<li><a href="https://github.com/zmedelis/hfds-clj">Hugging Face data set loader</a>. For the work related to memory and embedding handling, I needed easy access to HF datasets. An implementation used to download and cache them was initially done in Bosquet but then moved to an independent small lib.</li>
<li><a href="https://zmedelis.github.io/bosquet/notebook/text_splitting">Text splitters</a>. Building RAGs or dealing with long texts requires splitting them into chunks. Bosquet text splitting API supports choosing splitting units: sentence, token, and character. API allows specifying overlap between chunks counted in selected text units.</li>
<li><a href="https://zmedelis.github.io/bosquet/notebook/document_loading/index.html">Document loaders</a>. PDF, DOC any other sane format loading into LLM processing is now supported via the Apache Tika wrapping component.</li>
<li><a href="https://github.com/zmedelis/bosquet/blob/main/notebook/papers/llms_as_optimizers.clj">Experimental evaluation</a>. More complex or agent-based LLM processing needs automatic evaluation as a function guiding generation quality and direction. This is a very basic Q&amp;A evaluation implementation. Example use is documented in the linked &lsquo;LLMs as Optimizers&rsquo; paper implementation.</li>
<li><strong>Long-term memory</strong>. Qdrant and OAI embeddings-based memory implementation. Long-term memory is configured as a Bosquet component and LLM apps or agents can use it to create embeddings, store, and query them. See Evaluation and Scicloj recording for example use.</li>
<li><a href="https://zmedelis.github.io/bosquet/notebook/using_llms/index.html">Local LLM support</a>. Bosquet supports calling models hosted locally via <a href="https://lmstudio.ai">LM Studio</a>.</li>
<li><a href="https://www.youtube.com/watch?v=2JGQt9iW6dk">Scicloj Meetup 6</a>: &lsquo;LLMs as Optimizers&rsquo; (OPRO) implementation with Bosquet</li>
<li>Bug fixing component initialization and error handling  <br></li>
</ul>
<hr>
<h2 id="clj-kondo-babashka-cherry-sci-michiel-borkent">Clj-kondo, babashka, cherry, SCI: Michiel Borkent</h2>
<p><strong>2023 Q2 Report 3. Published 31 October and 30 November 2023.</strong> <br>
To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible! Open the details section for more info.</p>
<p><strong>Top sponsors:</strong></p>
<ul>
<li><a href="https://clojuriststogether.org">Clojurists Together</a></li>
<li><a href="https://roamresearch.com">Roam Research</a></li>
<li><a href="https://nextjournal.com">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp">Toyokumo</a></li>
<li><a href="https://www.cognitect.com">Cognitect</a></li>
<li><a href="https://kepler16.com">Kepler16</a></li>
<li><a href="https://github.com/pitch-io">Pitch</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.</p>
<h4 id="october-2023-updatehttpsblogmichielborkentnloss-updates-oct-2023html"><a href="https://blog.michielborkent.nl/oss-updates-oct-2023.html">October 2023 Update</a></h4>
<ul>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.
<ul>
<li><a href="https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar">Support self-contained binaries as uberjars!</a></li>
<li>Add <code>java.security.KeyFactory</code>, <code>java.security.spec.PKCS8EncodedKeySpec</code>, <code>java.net.URISyntaxException</code></li>
<li>Fix babashka.process/exec wrt <code>babashka.process/*defaults*</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1632">#1632</a>: Partial fix for <code>(.readPassword (System/console))</code></li>
<li>Enable producing self-contained binaries using <a href="https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar">uberjars</a></li>
<li>Bump httpkit to <code>2.8.0-beta3</code> (fixes GraalVM issue with virtual threads)</li>
<li>Bump <code>deps.clj</code> and <code>fs</code></li>
<li>Expose <code>taoensso.timbre.appenders.core</code></li>
<li>nREPL: implement <code>ns-list</code> op</li>
<li>SCI: optimize <code>swap!</code>, <code>deref</code> and <code>reset!</code> for normal atoms (rather than user-created <code>IAtom</code>s)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.
<ul>
<li>A configuration for <a href="https://github.com/hoplon/hoplon">hoplon</a> and <a href="https://github.com/hoplon/javelin">javelin</a> was added. You can play around with hoplon in a SCI-enabled environment  <a href="https://babashka.org/sci.configs/?gist=e83da19df3d2739861334171779f79d5">here</a></li>
</ul>
</li>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2207">#2207</a>: New <code>:condition-always-true</code> linter, see <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2013">#2013</a>: Fix NPE and similar errors when linting an import with an illegal token \<br>
Published a new version (2023.10.20) with these changes:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1804">#1804</a>: new linter <code>:self-requiring-namespace</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2065">#2065</a>: new linter <code>:equals-false</code>, counterpart of <code>:equals-true</code> (<a href="https://github.com/svdo">@svdo</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2199">#2199</a>: add <code>:syntax</code> check for var names starting or ending with dot (reserved by Clojure)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2179">#2179</a>: consider alias-as-object usage in CLJS for :unused-alias linter</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2183">#2183</a>: respect <code>:level</code> in <code>:discouraged-var</code> config</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2184">#2184</a>: Add missing documentation for <code>:single-logical-operand</code> linter  <a href="https://github.com/wtfleming">@wtfleming</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2187">#2187</a>: Fix type annotation of argument of <code>clojure.core/parse-uuid</code> from <code>nilable/string</code> to string (<a href="https://github.com/dbunin">@dbunin</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2192">#2192</a>: Support <code>:end-row</code> and <code>:end-col</code> in <code>:pattern</code> output format (<a href="https://github.com/joshgelbard">@joshgelbard</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2182">#2182</a>: Namespace local configuration does not silence <code>:missing-else-branch</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2186">#2186</a>: Improve warning when <code>--copy-configs</code> is enabled but no config dir exists</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2190">#2190</a>: false positive with <code>:unused-alias</code> and namespaced map</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2200">#2200</a>: include optional <code>:callstack</code> in analysis</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler<br>
Lots of stuff happened in October with squint!
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/350">#350</a>: <code>js*</code> should default to <code>:context :expr</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/352">#352</a>: fix <code>zero?</code> in return position</li>
<li>Add <code>NaN?</code> (<a href="https://github.com/sher">@sher</a></li>
<li><a href="https://github.com/squint-cljs/squint/issues/347">#347</a>: Add <code>:pre</code> and <code>:post</code> support in <code>fn</code></li>
<li>Add <code>number?</code></li>
<li>Support <code>docstring</code> in <code>def</code></li>
<li>Handle multipe source <code>:paths</code> in a more robust fashion</li>
<li><a href="https://github.com/squint-cljs/squint/issues/344">#344</a>: macros can&rsquo;t be used via aliases</li>
<li>Add <code>squint.edn</code> support, see <a href="https://github.com/squint-cljs/squint/tree/main/README.md#squintedn">docs</a></li>
<li>Add <code>watch</code> subcommand to watch <code>:paths</code> from <code>squint.edn</code></li>
<li>Make generated <code>let</code> variable names in JS more deterministic, which helps hot reloading in React</li>
<li>Added a <a href="https://github.com/squint-cljs/squint/blob/main/examples/vite-react">vite + react example project</a>.</li>
<li>Resolve symbolic namespaces <code>(:require [foo.bar])</code> from <code>:paths</code></li>
<li>Add <code>bit-and</code> and <code>bit-or</code></li>
<li>Include <code>lib/squint.core.umd.js</code> which defines a global <code>squint.core</code>   object (easy to use in browsers, see <a href="https://github.com/squint-cljs/squint/blob/main/README.md#compile-on-a-server-use-in-a-browser">docs</a>)</li>
<li>Add <code>subs</code>, <code>fn?</code>, <code>re-seq</code></li>
<li>Add <code>squint.edn</code> with <code>:paths</code> to resolve macros from (via <code>:require-macros</code>)</li>
</ul>
</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.62 released
<ul>
<li>Fix NPE during <code>neil dep upgrade</code></li>
</ul>
</li>
<li><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a>
<ul>
<li>Porting this CLJS project such that it can run with <a href="https://github.com/squint-cljs/squint">squint</a> also. You can now use this library directly from NPM as a JS library. See <a href="https://squint-cljs.github.io/squint/">this page</a> for a demo on how to use it directly from a CDN! This work is funded by <a href="https://nextjournal.com/">Nextjournal</a>.</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler
<ul>
<li>Released version 0.1.9</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes
<ul>
<li>Fix self-requiring namespace (which clj-kondo now also catches via optional linter!)</li>
</ul>
</li>
<li><a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a>: a leiningen plugin for clj-kondo
<ul>
<li>Bumped clj-kondo version</li>
</ul>
</li>
<li><a href="https://github.com/http-kit/http-kit">http-kit</a>: Simple, high-performance event-driven HTTP client+server for Clojure.
<ul>
<li><a href="https://github.com/http-kit/http-kit/issues/543">#543</a> Migrate away from <code>SimpleDateFormat</code> to <code>java.time</code>, fixes native-image issue and virtual threads</li>
</ul>
</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client
<ul>
<li>A number of small bugfixes and additions</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Expose <code>destructure</code> to scripts</li>
<li>Macroexpand <code>(.foo bar)</code> form in <code>macroexpand-1</code></li>
<li>Optimize <code>deref</code>, <code>swap!</code>, <code>reset!</code> for host values</li>
<li>Add <code>time</code> macro</li>
</ul>
</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI
<ul>
<li><code>sci.core</code> itself was exposed to nbb users</li>
</ul>
</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure
<ul>
<li>Minor fixes in <code>glob</code> by <a href="https://github.com/eval">@eval</a>, thanks!</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>Get home directory via environment variable rather than system property by <a href="https://github.com/DerGuteMoritz">@DerGuteMoritz</a>, thanks!</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka.nrepl">babashka.nrepl</a>: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs
<ul>
<li>Fix <code>classpath</code> op</li>
<li>Implement <code>ns-list</code> op</li>
</ul>
</li>
</ul>
<h4 id="november-2023-updatehttpsblogmichielborkentnloss-updates-nov-2023html"><a href="https://blog.michielborkent.nl/oss-updates-nov-2023.html">November 2023 Update</a></h4>
<h4 id="advent-of-code">Advent of Code</h4>
<p>It is Advent of Code time of year again. You can solve puzzles in an online <a href="https://github.com/squint-cljs/squint">squint</a> or <a href="https://github.com/squint-cljs/cherry">cherry</a> playground <a href="https://squint-cljs.github.io/squint/examples/aoc/index.html">here</a>.</p>
<p>Change the <code>/squint/</code> part of the url to <code>/cherry/</code> to switch ClojureScript dialect versions.</p>
<p>You can read more about the playground <a href="https://blog.michielborkent.nl/squint-advent-of-code.html">here</a>.</p>
<h4 id="november-updates">November Updates</h4>
<ul>
<li><a href="https://blog.michielborkent.nl/archive.html">blog</a> I&rsquo;ve written two blog posts this month:
<ul>
<li><a href="https://blog.michielborkent.nl/squint-cloudflare-bun.html">Writing a Cloudflare worker with squint and bun</a></li>
<li><a href="https://blog.michielborkent.nl/squint-advent-of-code.html">Playing Advent of Code with Squint</a>.</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler<br>
Lots of stuff happened in November with squint! You could say that I&rsquo;ve grown a little addicted to improving this project currently, driven by how users use it and also while developing the <a href="https://squint-cljs.github.io/squint/examples/aoc/index.html">playground</a>, a lot of potential improvements emerged.</li>
</ul>
<details> 
<summary>Open for Squint Details</summary>  
<ul>
<li>Restore backward compatibility with code that is compiled with older versions of squint</li>
<li>Optimize various outputs for smaller size</li>
<li>Add js-in</li>
<li>Support into + xform</li>
<li>Support sort on strings</li>
<li>#386: allow expression in value position in map literal</li>
<li>Improvements with respect to laziness in mapcat and concat</li>
<li>Do not array mutate argument in reverse</li>
<li>Escape JSX attribute vector value (and more)</li>
<li>map + transduce support</li>
<li>Fix for in REPL mode</li>
<li>Throw when object is not iterable in for</li>
<li>Make next lazy when input is lazy</li>
<li>Fix playground shim (fixes issue in older versions of Safari)</li>
<li>Add js-mod and quot</li>
<li>#380: Don&rsquo;t emit space in between #jsx tags</li>
<li>Add re-find</li>
<li>Add condp macro</li>
<li>Use compare as default compare function in sort (which fixes numerical sorting)</li>
<li>Allow assoc! to be called on arbitrary classes (regression)</li>
<li>Improve get to call get method when present.</li>
<li>Allow keywords and collections to be used as functions in HOFs</li>
<li>Make filter, etc aware of truthiness</li>
<li>Reduce code size for truthiness checks</li>
<li>Add str/split-lines</li>
<li>Add partition-by</li>
<li>Add parse-long</li>
<li>Add sort-by</li>
<li>Fix top level await</li>
<li>Support multiple dimensions in aset</li>
<li>Add coercive-= as alias for ==</li>
<li>Add js-delete</li>
<li>Fix min-key and max-key and improve tests</li>
<li>Add min-key and max-key</li>
<li>Fix defonce in REPL-mode</li>
<li>Fix doseq and for when binding name clashes with core var</li>
<li>Several REPL improvements</li>
<li>Improve <a href="https://squint-cljs.github.io/squint/">https://squint-cljs.github.io/squint/</a></li>
<li>Allow alias name to be used as object in REPL mode</li>
<li>Copy resources when using squint compile or squint watch</li>
<li>Return map when select-keys is called with nil</li>
<li>nREPL server: print values through cljs.pprint (@PEZ)</li>
<li>Initial (incomplete!) nREPL server on Node.js: npx squint nrepl-server :port 1888</li>
<li>Update/refactor threejs example</li>
<li>#360: assoc-in! should not mutate objects in the middle if they already exist</li>
<li>Evaluate lazy-seq body just once</li>
<li>Avoid stackoverflow with min and max</li>
<li>#360: fix assoc-in! with immutable objects in the middle</li>
<li>Add mod, object?</li>
<li>Optimize get</li>
<li>Add threejs example</li>
<li>#357: fix version in help text</li>
<li>Fix iterating over objects</li>
<li>Add clojure.string&rsquo;s triml, trimr, replace</li>
<li>Fix examples/vite-react by adding public/index.html</li>
<li>Add find, bounded-count, boolean?, merge-with, meta, with-meta, int?, ex-message, ex-cause, ex-info</li>
<li>Fix munging of reserved symbols in function arguments</li>
</ul>
</details>  
<ul>
<li><a href="https://jsfiddle.net/xbgj6v1q/1/">scittle-hoplon</a>: a custom scittle distribution with Hoplon. I helped developing the SCI configuration for Hoplon.</li>
<li><a href="https://squint-cljs.github.io/squint/examples/threejs/playground.html">gespensterfelder</a>: a demo that Jack Rusher wrote using Three.js ported to squint.</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.63 released which adds mvn search and some bugfixes</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!
<ul>
<li>Small bugfix around priority of <code>:exec-args</code> and <code>default</code></li>
</ul>
</li>
<li><a href="https://github.com/borkdude/aoc-proxy">aoc-proxy</a>: a Cloudflare worker that can be used to fetch Advent of Code puzzle input from the browser (see <a href="https://squint-cljs.github.io/squint/examples/aoc/index.html">Advent of Code playground</a></li>
<li><a href="https://github.com/squint-cljs/squint-macros">squint-macros</a>: a couple of macros that stand-in for <a href="https://github.com/applied-science/js-interop">applied-science/js-interop</a> and <a href="https://github.com/funcool/promesa">promesa</a> to make CLJS projects compatible with squint and/or cherry.</li>
<li><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a>: Clojure/Script mode for CodeMirror 6.
<ul>
<li>Ported the eval-region extension to squint so you can use it straight from JS. This is used in the <a href="https://squint-cljs.github.io/squint/?repl=true">squint playground</a> when you press Cmd-Enter after an expression.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.
<ul>
<li>A helper macro was improved such that you can define macros that are usable in SCI</li>
<li>The re-frame configuration now has support for <code>re-frame.alpha</code>. See <a href="https://babashka.org/sci.configs/">playground</a>.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting. A new release: 1.3.186!</li>
</ul>
<details> 
<summary> Open for Babashka Details</summary>  
<ul>
<li>Support self-contained binaries as uberjars!</li>
<li>Add java.security.KeyFactory, java.security.spec.PKCS8EncodedKeySpec, java.net.URISyntaxException, javax.crypto.spec.</li>
<li>IvParameterSpec</li>
<li>Fix babashka.process/exec wrt babashka.process/<em>defaults</em></li>
<li>#1632: Partial fix for (.readPassword (System/console))</li>
<li>Enable producing self-contained binaries using uberjars</li>
<li>Bump httpkit to 2.8.0-beta3 (fixes GraalVM issue with virtual threads)</li>
<li>Bump deps.clj and fs</li>
<li>Expose taoensso.timbre.appenders.core</li>
<li>nREPL: implement ns-list op</li>
<li>SCI: optimize swap!, deref and reset! for normal atoms (rather than user-created IAtoms)</li>
<li>Add test for #1639</li>
<li>Upgrade to GraalVM 21.0.1</li>
<li><strong>Still unreleased:</strong></li>
<li>Add java.util.ScheduledFuture</li>
<li>Support Runnable to be used without import</li>
<li>Allow catch to be used as var name</li>
</ul>
</details>  
<ul>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs<br>
Released version 0.8.41</li>
</ul>
<details>  
<summary> Open for SCI Details</summary>  
<ul>
<li>Bump edamame to 1.3.23</li>
<li>#889: allow (def foo/foo 1) when inside namespace foo</li>
<li>#891: reset file metadata on var when it&rsquo;s re-evaluated from other file</li>
<li>#893: expose sci.async/eval-form and sci.async/eval-form+</li>
<li>Improve sci.async/eval-string, respect top-level do forms</li>
<li>Add experimental new :static-methods option to override how static methods get evaluated.</li>
<li>Expose destructure</li>
<li>Macroexpand (.foo bar) form</li>
<li>Optimize deref, swap!, reset! for host values</li>
<li>Add time macro to core namespace</li>
<li>#896: allow catch to be used as var name</li>
</ul>
</details>  
<ul>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler
<ul>
<li>Released version 0.1.10 which catches up with the latest compiler improvements in squint</li>
</ul>
</li>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>New <code>:condition-always-true</code> and <code>:underscore-in-namespace</code> linters + couple of bugfixes. Release expected in December.</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in the past month.
Click for more <a href="https://github.com/borkdude/blog/discussions/categories/posts">details</a>. Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.<br>
_Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <br></p>
<hr>
<h2 id="deps-try-gert-goet">Deps-try: Gert Goet</h2>
<p><strong>2023 Q3 Report 2. Published 4 December 2023.</strong></p>
<p>I&rsquo;ve been working on recipe functionality for deps-try (a tool to quickly try out Clojure libraries on rebel-readline), and I am happy to announce this functionality got released as deps-try v0.10.0.</p>
<p>Recipes practically function as &lsquo;walkthroughs for the REPL&rsquo; as steps get front-loaded in the REPL-history and a user can work their way through by submitting steps.</p>
<p>As recipe namespaces list required dependencies and requires, they can also simply be used as a way to jumpstart a REPL-session to work on a particular domain using the &ndash;recipe-ns flag (e.g. connect to a PostgreSQL database having all necessary libraries loaded).</p>
<p>I added some built-in recipes to get started (see below) and it was fun to explore writing tutorials in this format.</p>
<p>There&rsquo;s more recipes in draft and a lot of ways I can see this functionality being extended. I&rsquo;m also curious how others will use it and what recipes they come up with: if you have ideas for a recipe that others can benefit from, don&rsquo;t hesistate to open a PR.</p>
<p>A big thanks to (everyone supporting) Clojurists Together 🙏!</p>
<p>Built-in recipes:</p>
<table>
<thead>
<tr>
<th style="text-align:left">NAME</th>
<th style="text-align:left">TITLE</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">deps-try/recipes</td>
<td style="text-align:left">Introducing recipes</td>
</tr>
<tr>
<td style="text-align:left">malli/malli-select</td>
<td style="text-align:left">Introduction to malli-select, a library for spec2-inspired selection of Malli-schemas</td>
</tr>
<tr>
<td style="text-align:left">next-jdbc/intro-sqlite</td>
<td style="text-align:left">A next-jdbc introduction using SQLite</td>
</tr>
<tr>
<td style="text-align:left">portal/intro</td>
<td style="text-align:left">Introduction to portal, a Clojure tool to navigate data</td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td style="text-align:left">_________________________</td>
<td style="text-align:left">________________________________________________________________</td>
</tr>
<tr>
<td style="text-align:left"><br></td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="gdl-michael-sappler">GDL: Michael Sappler</h2>
<p><strong>2023 Q3 Report 2. Published 30 November 2023</strong></p>
<p>I am taking an experimental approach to developing this game&amp;engine by working bottom-up and fixing/evolving the code before focusing on new/more features.</p>
<p>Also I want to create a simple GUI for editing the sounds/animations/properties of the game entities. This could lead to an action RPG-maker which can easily be modded or even a general 2D game maker tool.</p>
<p>The main problems right now in the codebase (because it is basically a legacy codebase from a game I wrote more than 10 years ago during my studies) are lots of global state and hardcoded properties (sounds, images, animations, creature, projectile properties are all over the place and hard to change).</p>
<p>I have focused on simplifying the lower level functions and moving side effects and dependencies to higher level code, thus making them easier to understand and read and not hiding side-effects like &lsquo;swap! entity &hellip;&rsquo; in them.</p>
<h3 id="the-engine-gdlhttpsgithubcomdamngdl">The engine <a href="https://github.com/damn/gdl">GDL</a></h3>
<p>In gdl I have investigated what changes would be required to remove the global states and dependencies between namespaces. For example in the gdl.audio/play function which receives a sound-file parameter string depends on asset-manager to get the sound asset.</p>
<p>If I want to remove this dependency I found out I have to fix all the hard coded sound values in CDQ and move them to the properties.edn file, which I can then edit and view with the property-editor GUI.</p>
<p>So it is quite interesting that refactoring the play-sound function would lead to such dramatic and interesting changes, also it lead me to find out that animations are in many cases played together with a sound and will be moved together into an audiovisual &lsquo;effect&rsquo; property.</p>
<h3 id="the-game-cyber-dungeon-questhttpsgithubcomdamncyber-dungeon-quest">The game <a href="https://github.com/damn/Cyber-Dungeon-Quest">Cyber Dungeon Quest</a></h3>
<ul>
<li>
<p>Cleanup: Remove a lot of unused code/files</p>
</li>
<li>
<p>Remove data-based hitpoints/mana effects and just directly change those entity values</p>
</li>
<li>
<p>In data.val-max (functions for operating on health/mana/damage values) removed the complicated &lsquo;affect-val-max-stat!&rsquo; function</p>
</li>
<li>
<p>Simplify deal-damage! swaps! (Use 1 instead of 3)</p>
</li>
<li>
<p>Simplify game.utils.counter (only work with maps, atom swaps! move to higher level code)</p>
</li>
<li>
<p>Add skill usable-state function for player info messages -</p>
<ul>
<li>return exact keywords for skill usage so can display info messages/sounds later</li>
<li>also simplifies skills component by moving player handling more &lsquo;up&rsquo;</li>
<li>skill is  either on :cooldown, :not-enough-mana, :invalid-params, or :usable</li>
<li>skill effect params are for example the skill requires a target chosen or a free space</li>
</ul>
</li>
<li>
<p>game.entities.animation =&gt; game.entities.audiovisual</p>
</li>
<li>
<p>Move audiovisual effects into properties.edn<br></p>
</li>
</ul>
<hr>
<h2 id="quil-jack-rusher-and-charles-comstock">Quil: Jack Rusher and Charles Comstock</h2>
<p><strong>2023 Q3 Report 2. Published 20 November 2023</strong></p>
<p>In this cycle, we&rsquo;ve made an official release of version 4.3.1323!
Here are the release highlights:</p>
<ul>
<li>New automated test harness for assertions of Processing and P5js behaviors</li>
<li>Clojar release automation using Github Actions to generate snapshot and tagged jar files</li>
<li>Github Actions test harness for existing lein test (Linux)</li>
<li>Fix for #cljs.core/abs compile warning</li>
<li>Implement fract calculation</li>
<li>Fix canvas resize and fullscreen behavior for p5js sketches</li>
<li>Fix exception on exit when the applet has no window</li>
<li>Added :mouse-buttons option to navigation-2d</li>
<li>New calculation tests that don&rsquo;t require image generation</li>
<li>Modernized quil-examples and tested them on Linux amd64/MacOS M1</li>
<li>Added initial Clojure CLI documentation (was <code>lein</code>-only)</li>
<li>Added the SCM block to pom + add a tag version if the release is not a SNAPSHOT build</li>
<li>Pushed an updated version of the <code>lein</code> templates for new projects
that uses this release. Currently, this is only for JVM projects
because we don&rsquo;t yet have access to the right Clojars group for the
CLJS template 🙈</li>
<li>Triaged many old issues</li>
</ul>
<p><strong>Upcoming work:</strong></p>
<ul>
<li>Continue to improve the test harness, try to get CI working for
MacOS/M1</li>
<li>Complete Clojure CLI docs for quil (both in the repo and wiki)</li>
<li>Update interactive website and quil.info/api</li>
<li>Quil deps-new templates for cljs and clj<br></li>
</ul>
<hr>
<h2 id="uncomplicate-dragan-duric">Uncomplicate: Dragan Duric</h2>
<p><strong>2023 Q3 Report 2. Published 31 October 2023</strong></p>
<p>My goal with this round is to polish Uncomplicate libraries (mainly Neanderthal, Deep Diamond, ClojureCUDA, ClojureCL, ClojureCPP),
rather than develop new functionality.</p>
<p>In this month, I&rsquo;ve continued with Deep Diamond coding related to the port to JavaCPP. I&rsquo;ve updated DNNL
to version 3.3, ported dense and RNN layers in the DNNL engine to (Clojure CPP) JavaCPP, updated tests
and made them pass. Then I ported the cuDNN GPU engine to Clojure CPP, and made all tensor,
directed and RNN tests pass. Along the way, I fixed many bugs caused by differences between how JavaCPP
and JCuda work. I updated Fluokitten support.</p>
<p>While working on Deep Diamond&rsquo;s port, I&rsquo;ve discovered many opportunities to improve and polish Clojure CPP,
so my major efforts went toward understanding and fixing everything in Clojure CPP, so it&rsquo;s ready for
the first release. This includes complete documentation and test suite.</p>
<p>I&rsquo;ve also cleaned up and polished new version of ClojureCUDA that is based on Clojure CPP. I completed
documentation and polished the test suite. I&rsquo;ve cleaned up Neanderthal&rsquo;s port to Clojure CPP, worked
on some bugs/issues, and managed to polish the transition to Clojure CPP, and fixed the test suite..</p>
<p>Assorted bugfixes and improvements in all libraries. I&rsquo;ve also identified places for further improvements and cleanups.</p>
<p>Although there&rsquo;s places for countless improvements in all libraries, the current progress in the short
term is:</p>
<ul>
<li>Commons: fairly ready for release and documented</li>
<li>Clojure CPP: fairly ready for release and documented</li>
<li>ClojureCUDA: fairly ready for release and documented</li>
<li>Neanderthal: almost ready but needs more polishing, and documentation update</li>
<li>Deep Diamond: needs more testing and bugfixing, and new documentation</li>
</ul>
<p>In the third month, the majority of my efforts will go to Deep Diamond and Neanderthal.</p>
<p>The non-snapshot release will have to wait for the next release of JavaCPP, as now most Uncomplicate
projects use its dependencies, which I expect in the following
few months. Hopefully by the end of the year.</p>
<p><strong>2023 Q3 Report 3. Published 30 November 2023</strong>  <br>
My goal with this round was to polish Uncomplicate libraries (mainly Neanderthal, Deep Diamond, ClojureCUDA, ClojureCL, ClojureCPP), rather than develop new functionality.</p>
<p>In the third month, the majority of my efforts went to Deep Diamond. I wrote documentation, fixed lots of bugs, updated deps to new versions, and wrote fluokitten implementation. I&rsquo;ve resolved some outstanding issuses.
However, it still needs more polishing, especially the RNN part. In Neanderthal I discovered a bug in JavaCPP implementation (didn&rsquo;t find a culprit). I tidied up metadata and licenses.</p>
<p>Although there&rsquo;s places for countless improvements in all libraries, the current progress in the short term is:</p>
<ul>
<li>Commons: ready for release and documented</li>
<li>Clojure CPP:  ready for release and documented</li>
<li>ClojureCUDA: ready for release and documented</li>
<li>Fluokitten: ready for release</li>
<li>Neanderthal: ready for release</li>
<li>Deep Diamond: ready for release, but RNN regressed during the JavaCPP port, and I didn&rsquo;t manage to find the culprit.</li>
</ul>
<p>Since now ClojureCUDA, Neanderthal, and Deep Diamond depend on JavaCPP, and I used new JavaCPP features that are present only in snapshots, I have to wait for the next official release of JavaCPP 1.5.10 to be able to publish official jars to Clojars. Of course, everything is on GitHub, so whoever needs these new versions, can build them from the source. JavaCPP is usually released twice a year, so I expect it in December, or at least before the next spring.</p>
<p>In short, here&rsquo;s the final state of what I&rsquo;ve proposed to do:</p>
<ul>
<li>DONE Do a thorough re-visiting of existing code in major Uncomplicate libraries.</li>
<li>DONE (to a fair extent) Read the code without rushing to implement new features.</li>
<li>DONE (not as much as I hoped) Write more tests for edge cases.</li>
<li>DONE (not all, of course) Discover bugs and fix them.</li>
<li>DONE (but not as much as I hoped) Discover places where code could be improved (without rushing the new functionality).</li>
<li>DONE Re-visit documentation and improve it to better match the current state of Uncomplicate libraries.</li>
<li>DONE If opportunities arise, implement some new functionality based of all the aforementioned items.</li>
</ul>
<p>In even shorter terms, I proposed to do some hammock time, combined with some un-exciting chores that enhance the stability and user-friendliness of Uncomplicate libraries. I completed a lot of chores, and lots of development of the loose ends from the previous round. I am satisfied how I managed to fulfill this for Clojure CPP, ClojureCUDA, Neanderthal, and Fluokitten, fairly satisfied with ClojureCL,
and almost satisfied with Deep Diamond (where I had to deal with changes in new DNNL and cuDNN versions while porting to JavaCPP, so I did not manage to iron out RNN).</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>September &amp; October 2023 Long-Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/september-october-2023-long-term-project-updates/</link>
      <pubDate>Sun, 19 Nov 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/september-october-2023-long-term-project-updates/</guid>
      <description>Cider/REPL, clj-kondo, basbashka, clojars, clojure-lsp, shadow, calva, malli, carmine V4, Humble UI and more .</description>
      <content:encoded><![CDATA[<br>  
<p>Thanks to our 2023 long-term developers for this amazing body of work. This is the 5th report of the year - with one more to come around the new year. (Projects listed are only some of what they are covering in this post).</p>
<p><a href="#bozhidar-batsov">Bozhidar Batsov:</a> CIDER/REPL  <br>
<a href="#michiel-borkent">Michiel Borkent:</a> clj-kondo,babashka, squint, neil, CLI,clojure-mode, and more..<br>
<a href="#sean-corfield">Sean Corfield:</a> clojure-doc.org, toolsbuild, deps-new, honey-SQL, expectations   <br>
<a href="#toby-crawley">Toby Crawley:</a> Clojars<br>
<a href="#eric-dallo">Eric Dallo:</a> Clojure-lsp, intellij<br>
<a href="#christophe-grand">Christophe Grand:</a> ClojureDart et.al.<br>
<a href="#thomas-heller">Thomas Heller:</a> Shadow-cljs  <br>
<a href="#nikita-prokopov">Nikita Prokopov:</a> new projects, Clojure Sublimed, DataScript, Sublime Executor<br>
<a href="#tommi-reiman">Tommi Reiman:</a> Malli, Reitit, Jsonista<br>
<a href="#peter-stromberg">Peter Stromberg:</a> Calva, JavaScript REPL, Polylith <br>
<a href="#peter-taoussanis">Peter Taoussanis:</a> Carmine, Nippy, http-kit, Tempel, Telemere<br>
<br></p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>I&rsquo;m happy to report that after numerous delays the long-awaited CIDER 1.8 (&ldquo;Geneva&rdquo;) was shipped on October 13th (which also happened to be my 39th birthday)! This was a truly colossal release that addressed many long-standing issues and introduced some impressive new features (e.g. much improved enrich-classpath, cider-log-mode, a new way to display javadoc and many improvements to the tests runner).
See the <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.8.0">release notes</a> for more details.</p>
<p>This release was quickly followed by <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.9.0">CIDER 1.9</a> and <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.10.0">CIDER 1.10</a> - much smaller releases that mostly addressed some small issues and polished a bit some of the new functionality in CIDER 1.8.
All this work also resulted in the list of open issues on CIDER finally dipping under 100 (currently they stand at 85). That feels nice!</p>
<p>Now that this is done, my focus will switch to completing the support for <code>clojure-ts-mode</code> in CIDER and finally cutting an nREPL 1.1 (which will bring TLS support). <br></p>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>In this post I&rsquo;ll give updates about open source I worked on during September and October 2023.<br>
To see previous OSS updates, <a href="https://blog.michielborkent.nl/tags/oss-updates.html">go here</a>.</p>
<ul>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://github.com/pitch-io">Pitch</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch. On to the projects that I&rsquo;ve been working on!</p>
<h3 id="september-updates">September Updates</h3>
<p>I delivered my babashka talk at <a href="https://www.thestrangeloop.com/2023/babashka-a-meta-circular-clojure-interpreter-for-the-command-line.html">Strange loop</a> talk and much of my attention went to the preparation of that (slides <a href="https://speakerdeck.com/borkdude/babashka-a-meta-circular-clojure-interpreter-for-the-command-line-at-strange-loop-2023">here</a>). The talk is now available <a href="https://www.youtube.com/watch?v=DHtRfO3Bp90">here</a>.</p>
<p>I did manage to get some coding done as well, despite testing positive for COVID when I arrived back home&hellip; Here are updates about the projects/libraries I&rsquo;ve worked in September.</p>
<ul>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy. Published a new version (2023.09.07) with these changes:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1332">#1332</a>: New linter <code>:unused-alias</code>. See <a href="https://github.com/clj-kondo/clj-kondo/tree/master/doc/linters.md">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2143">#2143</a>: false positive type warning for <code>clojure.set/project</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2145">#2145</a>: support ignore hint on multi-arity branch of function definition</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2147">#2147</a>: use alternative solution as workaround for <a href="https://github.com/cognitect/transit-clj/issues/43">https://github.com/cognitect/transit-clj/issues/43</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2152">#2152</a>: Fix false positive with used-underscored-binding with core.match</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2150">#2150</a>: allow command line options = as in –fail-level=error</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2149">#2149</a>: <code>:lint-as clojure.core/defmacro</code> should suppress <code>&amp;env</code> as unresolved symbol</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2161">#2161</a>: Fix type annotation for <code>clojure.core/zero?</code> to number -&gt; boolean</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2165">#2165</a>: Fix error when serializing type data to cache</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2167">#2167</a>: Don&rsquo;t crash when <code>:unresolved-symbol</code> linter config contains unqualified symbol</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2170">#2170</a>: <code>:keyword-binding</code> linter should ignore auto-resolved keywords</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2172">#2172</a>: detect invalid amount of args and invalid argument type for <code>throw</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2164">#2164</a>: deftest inside let triggers :unused-value</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2154">#2154</a>: add <code>:exclude</code> option to <code>:deprecated-namespace</code> linter</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2134">#2134</a>: don&rsquo;t warn on usage of private var in <code>data_readers.clj(c)</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2148">#2148</a>: warn on configuration error in <code>:unused-refeferred-var</code> linter</li>
<li>Expose more vars in <code>clj-kondo.hooks-api</code> interpreter namespace</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting. Version 1.3.185 released!</p>
<ul>
<li><a href="https://github.com/babashka/babashka/pull/1624">#1624</a>: Use Oracle GraalVM 21 (<a href="https://github.com/lispyclouds">@lispyclouds</a>)</li>
<li>Use PGO to speed up loops (now 2-3x faster for <code>(time (loop [val 0 cnt 10000000] (if (pos? cnt) (recur (inc val) (dec cnt)) val)))</code>!)</li>
<li>Bump babashka.http-client to v0.4.15</li>
<li>Bump rewrite-clj to v0.1.1.47</li>
<li><a href="https://github.com/babashka/babashka/issues/1619">#1619</a>: Fix reflection issue with <code>Thread/sleep</code> in <code>core.async/timeout</code></li>
<li>Support interop on <code>java.util.stream.IntStream</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1513">#1513</a>: Fix interop on <code>Thread/sleep</code> with numbers that aren&rsquo;t already longs</li>
<li>Bump babashka.cli to 0.7.53</li>
<li>Fix <a href="https://github.com/babashka/babashka.nrepl/issues/66">#babashka.nrepl/66</a></li>
<li>Various nREPL server improvements (classpath op, file lookup information for <code>cider-find-var</code>)</li>
<li>Bump cheshire to 5.12.0</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler A lot of happened in squint this month:</p>
<ul>
<li>Many core var implementations got added: <code>reduce-kv</code>, <code>max</code>, <code>min</code>, <code>every-pred</code>, <code>into-array</code>, <code>some-fn</code>, <code>keep-indexed</code>, <code>iterate</code>, <code>juxt</code>, <code>compare</code>, <code>to-array</code>, <code>fn?</code></li>
<li>Bun compatibility</li>
<li>Lots of bug fixes</li>
<li>REPL improvements</li>
<li>Adopt CLJS truth semantics: <code>0</code> and <code>&quot;&quot;</code> are no longer considered falsey</li>
<li>Lots more coming next month!</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.61 released</p>
<ul>
<li><a href="https://github.com/babashka/neil/issues/181">#181</a>: fix <code>neil --version</code></li>
<li>fix tests by referring to latest hiccup (<a href="https://github.com/teodorlu">@teodorlu</a>)</li>
<li><a href="https://github.com/babashka/neil/issues/180">#180</a>: <code>neil dep upgrade</code>: allow upgrading from an unstable version to the latest unstable version (<a href="https://github.com/teodorlu">@teodorlu</a>)</li>
<li><a href="https://github.com/babashka/neil/issues/180">#180</a>: <code>neil dep upgrade</code>: with <code>--unstable</code>, opt-into unstable library updates (<a href="https://github.com/teodorlu">@teodorlu</a>)</li>
<li><a href="https://github.com/babashka/neil/issues/183">#183</a>: Don&rsquo;t drop <code>:exclusions</code> when running <code>neil dep add</code> or <code>neil dep upgrade</code> ([@borkdude] and [@teodorlu])</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</p>
<ul>
<li>Small release with the option to add your own header on top of <code>format-opts</code>, thanks to <a href="https://github.com/Sohalt">@Sohalt</a></li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client</p>
<ul>
<li>A number of small bugfixes and additions</li>
</ul>
</li>
<li>
<p>A number of experiments around <a href="https://github.com/squint-cljs/squint">squint</a>:</p>
<ul>
<li><a href="https://github.com/borkdude/bun-squint-loader">bun-squint-loader</a>: a demo of how to implement a loader for <a href="https://github.com/oven-sh/bun">bun</a> which lets you directly load <code>.cljs</code> files which are then compiled using</li>
<li>squint <a href="https://github.com/borkdude/squint-bun-cloudflare">cloudflare worker</a></li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/rewrite-edn">rewrite-edn</a>: Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments</p>
<ul>
<li>Fixed a round-tripping issue by bumping rewrite-clj</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and <a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>: use tools.deps directly from babashka</p>
<ul>
<li>aarch64 binary (thanks @TimoKramer for contributing)</li>
<li>update upstream projects</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Bump shared compiler code with squint and publish new version</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Bumped tools jar and fixed a bug concerning SHA comparison</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</p>
<ul>
<li>Add experimental <code>:static-methods</code> override to control how a static method is invoked. This allowed a fix in babashka for <code>Thread/sleep</code> on non-longs and for <code>Class/forName</code> which works arond a bug in Oracle GraalVM 21.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</p>
<ul>
<li><a href="https://github.com/holyjak">@holyjak</a> made a configuration for <a href="https://github.com/fulcrologic/fulcro">Fulcro</a> which can be seen live in action <a href="https://blog.jakubholy.net/2023/interactive-code-snippets-fulcro/">here</a></li>
</ul>
</li>
</ul>
<h3 id="october-updates">October Updates</h3>
<ul>
<li>
<p><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li><a href="https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar">Support self-contained binaries as uberjars!</a></li>
<li>Add <code>java.security.KeyFactory</code>, <code>java.security.spec.PKCS8EncodedKeySpec</code>, <code>java.net.URISyntaxException</code></li>
<li>Fix babashka.process/exec wrt <code>babashka.process/*defaults*</code></li>
<li><a href="https://github.com/babashka/babashka/issues/1632">#1632</a>: Partial fix for <code>(.readPassword (System/console))</code></li>
<li>Enable producing self-contained binaries using <a href="https://github.com/babashka/babashka/wiki/Self-contained-executable#uberjar">uberjars</a></li>
<li>Bump httpkit to <code>2.8.0-beta3</code> (fixes GraalVM issue with virtual threads)</li>
<li>Bump <code>deps.clj</code> and <code>fs</code></li>
<li>Expose <code>taoensso.timbre.appenders.core</code></li>
<li>nREPL: implement <code>ns-list</code> op</li>
<li>SCI: optimize <code>swap!</code>, <code>deref</code> and <code>reset!</code> for normal atoms (rather than user-created <code>IAtom</code>s)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</p>
<ul>
<li>A configuration for <a href="https://github.com/hoplon/hoplon">hoplon</a> and <a href="https://github.com/hoplon/javelin">javelin</a> was added. You can play around with hoplon in a SCI-enabled environment <a href="https://babashka.org/sci.configs/?gist=e83da19df3d2739861334171779f79d5">here</a></li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2207">#2207</a>: New <code>:condition-always-true</code> linter, see <a href="https://github.com/clj-kondo/clj-kondo/tree/master/doc/linters.md">docs</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2013">#2013</a>: Fix NPE and similar errors when linting an import with an illegal token<br>
Published a new version (2023.10.20) with these changes:</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1804">#1804</a>: new linter <code>:self-requiring-namespace</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2065">#2065</a>: new linter <code>:equals-false</code>, counterpart of <code>:equals-true</code> (<a href="https://github.com/svdo">@svdo</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2199">#2199</a>: add <code>:syntax</code> check for var names starting or ending with dot (reserved by Clojure)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2179">#2179</a>: consider alias-as-object usage in CLJS for :unused-alias linter</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2183">#2183</a>: respect <code>:level</code> in <code>:discouraged-var</code> config</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2184">#2184</a>: Add missing documentation for <code>:single-logical-operand</code> linter (<a href="https://github.com/wtfleming">@wtfleming</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2187">#2187</a>: Fix type annotation of argument of <code>clojure.core/parse-uuid</code> from <code>nilable/string</code> to string (<a href="https://github.com/dbunin">@dbunin</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2192">#2192</a>: Support <code>:end-row</code> and <code>:end-col</code> in <code>:pattern</code> output format (<a href="https://github.com/joshgelbard">@joshgelbard</a>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2182">#2182</a>: Namespace local configuration does not silence <code>:missing-else-branch</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2186">#2186</a>: Improve warning when <code>--copy-configs</code> is enabled but no config dir exists</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2190">#2190</a>: false positive with <code>:unused-alias</code> and namespaced map</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2200">#2200</a>: include optional <code>:callstack</code> in analysis</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler<br>
Lots of stuff happened in October with squint!</p>
<ul>
<li><a href="https://github.com/squint-cljs/squint/issues/350">#350</a>: <code>js*</code> should default to <code>:context :expr</code></li>
<li><a href="https://github.com/squint-cljs/squint/issues/352">#352</a>: fix <code>zero?</code> in return position</li>
<li>Add <code>NaN?</code> (<a href="https://github.com/sher">@sher</a>)</li>
<li><a href="https://github.com/squint-cljs/squint/issues/347">#347</a>: Add <code>:pre</code> and <code>:post</code> support in <code>fn</code></li>
<li>Add <code>number?</code></li>
<li>Support <code>docstring</code> in <code>def</code></li>
<li>Handle multipe source <code>:paths</code> in a more robust fashion</li>
<li><a href="https://github.com/squint-cljs/squint/issues/344">#344</a>: macros can&rsquo;t be used via aliases</li>
<li>Add <code>squint.edn</code> support, see <a href="https://github.com/squint-cljs/squint/tree/main/README.md#squintedn">docs</a></li>
<li>Add <code>watch</code> subcommand to watch <code>:paths</code> from <code>squint.edn</code></li>
<li>Make generated <code>let</code> variable names in JS more deterministic, which helps hot reloading in React</li>
<li>Added a <a href="https://github.com/squint-cljs/squint/blob/main/examples/vite-react">vite + react example project</a>.</li>
<li>Resolve symbolic namespaces <code>(:require [foo.bar])</code> from <code>:paths</code></li>
<li>Add <code>bit-and</code> and <code>bit-or</code></li>
<li>Include <code>lib/squint.core.umd.js</code> which defines a global <code>squint.core</code> object (easy to use in browsers, see <a href="https://github.com/squint-cljs/squint/blob/main/README.md#compile-on-a-server-use-in-a-browser">docs</a>)</li>
<li>Add <code>subs</code>, <code>fn?</code>, <code>re-seq</code></li>
<li>Add <code>squint.edn</code> with <code>:paths</code> to resolve macros from (via <code>:require-macros</code>)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects Version 0.2.62 released</p>
<ul>
<li>Fix NPE during <code>neil dep upgrade</code></li>
</ul>
</li>
<li>
<p><a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a></p>
<ul>
<li>Porting this CLJS project such that it can run with <a href="https://github.com/squint-cljs/squint">squint</a> also. You can now use this library directly from NPM as a JS library. See <a href="https://squint-cljs.github.io/squint/">this page</a> for a demo on how to use it directly from a CDN! This work is funded by <a href="https://nextjournal.com/">Nextjournal</a>.</li>
</ul>
</li>
<li>
<p><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</p>
<ul>
<li>Released version 0.1.9</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</p>
<ul>
<li>Fix self-requiring namespace (which clj-kondo now also catches via optional linter!)</li>
</ul>
</li>
<li>
<p><a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a>: a leiningen plugin for clj-kondo</p>
<ul>
<li>Bumped clj-kondo version</li>
</ul>
</li>
<li>
<p><a href="https://github.com/http-kit/http-kit">http-kit</a>: Simple, high-performance event-driven HTTP client+server for Clojure.</p>
<ul>
<li><a href="https://github.com/http-kit/http-kit/issues/543">#543</a> Migrate away from <code>SimpleDateFormat</code> to <code>java.time</code>, fixes native-image issue and virtual threads</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/http-client">http-client</a>: babashka&rsquo;s http-client</p>
<ul>
<li>A number of small bugfixes and additions</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</p>
<ul>
<li>Expose <code>destructure</code> to scripts</li>
<li>Macroexpand <code>(.foo bar)</code> form in <code>macroexpand-1</code></li>
<li>Optimize <code>deref</code>, <code>swap!</code>, <code>reset!</code> for host values</li>
<li>Add <code>time</code> macro</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</p>
<ul>
<li><code>sci.core</code> itself was exposed to nbb users</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</p>
<ul>
<li>Minor fixes in <code>glob</code> by <a href="https://github.com/eval">@eval</a>, thanks!</li>
</ul>
</li>
<li>
<p><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</p>
<ul>
<li>Get home directory via environment variable rather than system property by <a href="https://github.com/DerGuteMoritz">@DerGuteMoritz</a>, thanks!</li>
</ul>
</li>
<li>
<p><a href="https://github.com/babashka/babashka.nrepl">babashka.nrepl</a>: The nREPL server from babashka as a library, so it can be used from other SCI-based CLIs</p>
<ul>
<li>Fix <code>classpath</code> op</li>
<li>Implement <code>ns-list</code> op</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in September and October.  See final section of each report (“Other Projects”) for details.<br>
<a href="https://blog.michielborkent.nl/oss-updates-sep-2023.html">https://blog.michielborkent.nl/oss-updates-sep-2023.html</a> <br>
<a href="https://blog.michielborkent.nl/oss-updates-oct-2023.html">https://blog.michielborkent.nl/oss-updates-oct-2023.html</a></p>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a><br>
Published: 31 October and 30 September, 2023<br>
Tagged: clojure oss updates  <br></p>
<hr>
<h2 id="sean-corfield">Sean Corfield</h2>
<p>:tags [&ldquo;clojure&rdquo; &ldquo;clojure-doc.org&rdquo; &ldquo;expectations&rdquo; &ldquo;honeysql&rdquo; &ldquo;jdbc&rdquo; &ldquo;open source&rdquo; &ldquo;community&rdquo; &ldquo;clojurists together&rdquo;]}</p>
<p>In my <a href="https://corfield.org/blog/2023/08/31/long-term-funding-4/">previous Long-Term Funding update</a>
I said I would review/overhaul the &ldquo;ecosystem&rdquo; and &ldquo;tutorials&rdquo; sections
(once I&rsquo;d finished the &ldquo;language&rdquo; section).</p>
<h3 id="clojure-docorg"><code>clojure-doc.org</code></h3>
<p>I finished reviewing and updating the last three language sections to Clojure  <strong>1.11</strong><br>
(<a href="https://clojure-doc.org/articles/language/concurrency_and_parallelism/">Concurrency and Parallelism</a>,
<a href="https://clojure-doc.org/articles/language/macros/">Macros</a>,
and <a href="https://clojure-doc.org/articles/language/laziness/">Laziness</a>), and I
added a new section about transducers to the
<a href="https://clojure-doc.org/articles/language/collections_and_sequences/">Collections and Sequences</a>
section. In the next period, I&rsquo;ll revisit the &ldquo;TBD&rdquo; items in the language
section to see what I can do to address them.</p>
<p>I rewrote the
<a href="https://clojure-doc.org/articles/ecosystem/generating_documentation/">Generating Documentation</a>
section (ecosystem) to focus on <a href="https://cljdoc.org/">cljdoc.org</a>
and removed the outdated content.</p>
<p>The <a href="https://clojure-doc.org/articles/ecosystem/web_development/">Web Development</a>
section (ecosystem) also got a major rewrite, adding a lot of new content,
removing outdated content, and incorporating a lot of community feedback
on a draft version (thank you!).</p>
<p>Finally, I added a new section to the
<a href="https://clojure-doc.org/articles/cookbooks/cli_build_projects/"><code>tools.build</code> Cookbook</a>
about template <code>pom.xml</code> file and the <code>:pom-data</code> approach (new in <code>tools.build</code> 0.9.6).</p>
<h3 id="toolsbuild-and-deps-new"><code>tools.build</code> and <code>deps-new</code></h3>
<p>Following on from the <code>tools.build</code> Cookbook update, I updated
<a href="https://github.com/seancorfield/deps-new"><code>deps-new</code></a> to use that new
release of <code>tools.build</code> and updated all the project templates to use
<code>:pom-data</code> for generating <code>pom.xml</code> files.
See the <a href="https://github.com/seancorfield/deps-new/releases/tag/v0.5.3">v0.5.3</a>
Release</p>
<p>I need to do the same for <code>clj-new</code> at some point &ndash; perhaps in the next period!</p>
<h3 id="honeysql">HoneySQL</h3>
<p>HoneySQL also saw a lot of work with two releases that mostly focused on
improving BigQuery support (array subquery, select as struct, create or replace,
ignore/respect nulls, and new <code>:distinct</code> and <code>:expr</code> clauses to facilitate
certain non-standard queries), and introducing basic support for NRQL (New Relic Query Language) as a new dialect.</p>
<p>NRQL has non-standard quoting rules, non-standard entity names, and inlines
all expression values, since it is mostly used directly within the New Relic
web UI or via their CLI, neither of which support parameterized queries. New
clauses and helpers have been added for <code>:compare-with</code>, <code>:since</code>, <code>:timeseries</code>,<code>until</code>, and <code>:facet</code>.</p>
<p>In addition, an important bug in the helper merge functions was fixed that
affected anyone using the quoted-symbol style of DSL (instead of the keyword
style).</p>
<p>See <a href="https://github.com/seancorfield/honeysql/releases">HoneySQL releases</a>
for more details of these two new versions.</p>
<h3 id="expectations">Expectations</h3>
<p><a href="https://github.com/clojure-expectations/clojure-test">Expectations</a> also saw
two new releases this period. The first release focused on improving the
way test failures are reported to be more consistent and informative. The
second release was a minor one to improve <code>clj-kondo</code> support for <code>more-of</code>.</p>
<p>See <a href="https://github.com/clojure-expectations/clojure-test/releases">Expectations releases</a>
for more details on these two new versions.</p>
<h3 id="nextjdbc"><code>next.jdbc</code></h3>
<p>Finally, <code>next.jdbc</code> <a href="https://github.com/seancorfield/next-jdbc/releases/tag/v1.3.894">1.3.894</a>
provides variants of <code>with-transaction</code> and <code>on-connection</code> that will rewrap an
options-wrapped connectable. This was a long-requested feature that I had
struggled with finding an elegant solution for. In addition, I updated most of
the JDBC drivers that <code>next.jdbc</code> is tested against, to flush out any issues
with those newer versions. Notably, SQLite no longer supports <code>:return-generated-keys true</code> but you can specify <code>RETURNING *</code> in your SQL instead.</p>
<h3 id="whats-next">What&rsquo;s Next?</h3>
<p>In November/December, I&rsquo;m hoping to complete a review and update of the
&ldquo;cookbooks&rdquo; section and make another pass of &ldquo;TBD&rdquo; items in the &ldquo;language&rdquo;
section.  <br></p>
<hr>
<h2 id="toby-crawley">Toby Crawley</h2>
<h3 id="clojars-worklog">Clojars Worklog</h3>
<h3 id="september-2023">September 2023</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/0a5eb2175e7b417fc9e64bcb6fb87f6d15cbddbc...3dfeb61890e1f61c54e334dabe5c5e5bcccaeb67"><code>clojars-web</code></a></p>
<p>Most of September was vacation, but I did make a few improvements towards the
end of the month:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/29b5d25cdc8ede87a35967691110f84a4a8c23d1">Prevent memory leak from in-memory session store</a> This was the source of intermittent OOMs for years, and I finally tracked it down.</li>
<li><a href="https://github.com/clojars/clojars-web/pull/874">Require a license in the POM for new projects</a></li>
</ul>
<h3 id="october-2023">October 2023</h3>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/3dfeb61890e1f61c54e334dabe5c5e5bcccaeb67...d92cf1eb2f78e13894d37eb8e4b5fc070d9e00e0"><code>clojars-web</code></a></p>
<p>The work this month was modernization: we moved away from   <a href="https://github.com/krisajenkins/yesql">yesql</a> in favor of<br>
<a href="https://github.com/seancorfield/honeysql">honeysql</a>, and to  <a href="https://github.com/seancorfield/next-jdbc">next.jdbc</a> from  <a href="https://github.com/clojure/java.jdbc">clojure.java.jdbc</a>:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/2d09602722df78ef40e30f5d9bcf01df011af27e">Convert from yesql to honeysql for SQL queries</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/1116f6c6b3a5cc7b484fdb24175127f43f232d83">Convert from java.jdbc to next.jdbc</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/07603ad74ea21f722ef7184f200b04ff6e75b30e">Don’t send password change email when just profile email address changed</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/f1b251f4e788798a61cdb0d72023a00f7525945f">Adjust dependencies to address CVEs</a>  <br></li>
</ul>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>During these months I worked a lot on clojure-lsp-intellij to make it stable and allow IntelliJ users have the same experience of using clojure-lsp in other editors, the plugin is way more stable now, and I&rsquo;ve been working with @afucher in a clojure-repl-intellij OSS plugin which should work pretty well with this plugin so users will be able to have both REPL access and LSP features in Intellij, we should announce it soon!</p>
<p>For that to work and scale, I extracted all the clojure integration part from clojure-lsp-intellij to a separated library called <code>clj4intellij</code>, this new library allows the creation of Intellij plugins in Clojure without too much effort, this was the result of months of research and headaches about how IntelliJ&rsquo;s API could work with Clojure, we are already successfully using it in clojure-repl-intellij!</p>
<h3 id="clj4intellijhttpsgithubcomericdalloclj4intellij"><a href="https://github.com/ericdallo/clj4intellij">clj4intellij</a></h3>
<h4 id="031">0.3.1</h4>
<ul>
<li>Support custom nrepl ports</li>
<li>Add NREPL and logger support.</li>
<li>Include clojure source to jar.</li>
<li>Add <code>com.github.ericdallo.clj4intellij.app-manager</code> namespace with functions to access <code>ApplicationManager</code>.</li>
<li>First release</li>
</ul>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h4 id="090---0130">0.9.0 - 0.13.0</h4>
<ul>
<li>Add support for paredit actions: slurp, barf, raise and kill.</li>
<li>Bump clojure-lsp to <code>2023.10.30-16.25.41</code>.</li>
<li>Allow specifying a server log-path to better troubleshooting.</li>
<li>Fix find definition to work for external deps as well.</li>
<li>Improve troubleshooting section</li>
<li>Use nrepl and logger from clj4intellij.</li>
<li>Improve line indent to recognize some macros.</li>
<li>Fix exception on startup related to status bar.</li>
<li>Implement lineIdentProvider to handle enters and move cursor to correct position.</li>
<li>Start LSP server only when opening clojure files, avoiding starting on non Clojure projects. #20</li>
<li>Fix LSP not being disconnected on project close/switch.</li>
<li>Bump clj4intellij to <code>0.2.1</code>.</li>
<li>Fix language attribute in intentionAction from plugin.xml. #18</li>
<li>Fix documentationProvider plugin.xml. #19</li>
<li>Extract Clojure intellij integration to separated lib clj4intellij.</li>
<li>Fix Find definition to work with Ctrl+B + Ctrl+click.</li>
<li>Add support for <code>textDocument/didSave</code> notification.</li>
<li>Fix rename refactor when file is not opened.</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlights are performance and memory improvement along with paredit features for <code>clojure-lsp-intellij</code> and other editors.</p>
<h4 id="20231030-162541">2023.10.30-16.25.41</h4>
<ul>
<li>
<p>General</p>
<ul>
<li>Bump clj-kondo to <code>2023.10.21-20231022.204832-4</code>.</li>
<li>Fix move-to-let/expand-let bug for multi-arity functions #1283</li>
<li>Fix <code>:dependency-scheme</code> setting for .java files from jars #1653</li>
<li>Bump graalvm to 21.</li>
<li>Improve overall performance using GraalVM 21 PGO (Profile-Guided Optimizations).</li>
<li>Extract the responsibility for merging clj-depend config #1265</li>
<li>Support passing configurations to clj-depend via CLI #1694</li>
<li>Bump clj-depend to <code>0.9.2</code></li>
<li>Performance: remove keyword-usages elements from external analysis as they are not used for any feature and for big projects may affect memory. #1700</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>New paredit refactorings:
<ul>
<li><code>forward-slurp</code></li>
<li><code>forward-barf</code></li>
<li><code>backward-slurp</code></li>
<li><code>backward-barf</code></li>
<li><code>raise</code></li>
<li><code>kill</code></li>
</ul>
</li>
<li>Improve rename to avoid internal errors and show proper error messages. #1691</li>
<li>Exclude unused-public-vars when inside a comment block.</li>
<li>Add <code>:analysis-summary</code> field to <code>serverInfo</code> command to get information about project for performance analysis.</li>
<li>Add <code>:analysis</code> settings, with options to disable specific analysis for better performance on huge projects. #1700
<br></li>
</ul>
</li>
</ul>
<hr>
<h2 id="christophe-grand">Christophe Grand</h2>
<h3 id="clojuredart">ClojureDart</h3>
<ul>
<li>ClojureDart channel on Clojurians' Slack is getting close to 500 members.</li>
<li>We demoed ClojureDart at the London Clojurians meetup (<a href="https://www.youtube.com/watch?v=pkw_0I6iTYE&amp;t=2263s">video</a>).</li>
<li>We didn&rsquo;t had time to work on the REPL or multimethods (still planning to).</li>
</ul>
<h3 id="improvements">Improvements</h3>
<ul>
<li>In <code>cljd.flutter</code>, <code>:watch</code> now always deduplicate values. Previously deduplication only happened when destructuring was used; the rationale for the change is that if <code>:watch</code> returns the same values the generated UI will be the same. The only exception is when mutable objects are repeatedly returned. That&rsquo;s why there&rsquo;s now the <code>:dedup false</code> option to turn off deduplication of a given watch binding.</li>
<li>We reimplemented dynamic bindings on top of Dart Zones, this has two benefits:
<ul>
<li>making bindings conveyance automatic across all async mechanisms,</li>
<li>allowing to catch async errors! There&rsquo;s a new <code>*async-error-handler*</code> dynamic var which can be bound to a function taking two arguments (exception and stacktrace), when bound it will catch uncaught errors happening in async mechanisms (futures, streams, async/await) started directly or indirectly by code under this binding!</li>
</ul>
</li>
<li>In <code>cljd.flutter</code> we added helper directives for common widgets and cut on the boilerplate: <code>:color</code>, <code>:height</code>, <code>:width</code> and <code>:padding</code>.</li>
<li>This one is big for the ecosystem: we made it possible for cljd deps (managed via <code>deps.edn</code>) to have dependencies on Dart packages. This is big because it means that cljc or cljd libraries can use Dart dependencies without their own consumers having to redeclare them. The only requirement is for library authors when packaging to jars: copy pubspec.yaml` in the jar (or put a copy of it on the classpath before creating the jar).</li>
<li>We added a new special form: <code>dart/async-barrier</code>. Basically it&rsquo;s a <code>do</code> which prevents <code>await</code> from leaking outside of the <code>do</code> (so the <code>do</code> form will evaluate to a <code>Future</code>). This is important when writing macros to prevent user code (which may contain <code>await</code>) from contamining macro-generated code.</li>
<li>In <code>cljd.flutter</code> we added a <code>get-of</code> helper to retrieve widget-scope values bound with <code>:bind</code> from a <code>BuildContext</code> object.</li>
<li>We ported <code>clojure.data</code> to <code>cljd.data</code>.</li>
<li>We added <code>instance?</code> to ClojureDart. This is something I have been reluctant to do because in Dart you can&rsquo;t test an instance against a type value only against a type literal. That&rsquo;s why we have <code>dart/is?</code> which is a special form and not a function. However when porting code to ClojureDart having to rewrite all <code>instance?</code> calls to <code>dart/is?</code> is tedious &ndash; and most of the time the type is passed as a literal to <code>instance?</code>. So to make porting easier we added an <code>instance?</code> function which throws when called as a function but is otherwise inline as a <code>dart/is?</code>. We do have <a href="https://github.com/tensegritics/ClojureDart/issues/11">plans for a true <code>instance?</code></a>.</li>
<li>We added <code>into-array</code> which suffer from a similar problem to <code>instance?</code>: the type of an array has to be statically known in Dart, it can&rsquo;t be specified as a value. Here we followed CLJS lead and ignored the type for compatibility. Most certainly a behaviour which will have to be revisited when more libs are ported.</li>
<li>Last we added the possibility to have conflicting method definitions in a <code>deftype</code>/<code>defrecord</code>/<code>reify</code>. However one of the conflicting methods must have an <code>^:override</code> meta. This was done to port some libraries with hacks around <code>defrecord</code>.</li>
</ul>
<h3 id="fixes">Fixes</h3>
<p>Several fixes to the compiler, cljd.core.  Amongst them:</p>
<ul>
<li>type inference on <code>reify</code></li>
<li><code>apply</code> with some native Dart functions</li>
<li><code>not-empty</code> inline was causing double evaluations</li>
<li>bug on <code>dissoc!</code> on transient hash maps</li>
<li>fix field lookup on defrecords fields whose names are not valid Dart names</li>
<li><code>##NaN</code>, <code>##Infinite</code> and <code>##-Infinite</code> were not properly compiled</li>
<li>fix propagation of return-type hint in <code>defn</code> argvecs.</li>
</ul>
<h3 id="future-work">Future work</h3>
<h3 id="clojuredart-1">ClojureDart</h3>
<p><strong>New items:</strong></p>
<ul>
<li>Migrate from Clojure&rsquo;s own reader to <code>tools.reader</code>. Currently ClojureDart uses <code>LispReader</code> from Clojure but this reader doesn&rsquo;t allow to ignore the <code>:clj</code> feature when reading <code>cljc</code> so it requires to modify a lot of reader conditionals, even some which shouldn&rsquo;t concern ClojureDart, and to order them precisely.</li>
<li>Value semantics on closures (not by default, as an option), this has the potential of simplifying caching in Flutter code.</li>
</ul>
<p><strong>Existing items:</strong></p>
<ul>
<li>Publish the Flutter-only REPL</li>
<li>Multimethods to allow more libs to be ported</li>
<li>Look into porting SCI to ClojureDart</li>
<li>New APIs to leverage our persistent data structures:<br>
** maps (hash and sorted) in ClojureDart are original implementations (not the same as CLJ/CLJS) &ndash; hash maps could be seen as another refinement of the original, sorted maps constitute a novel implementation.<br>
** Sorted colls should be good enough for direct use by Datascript.<br>
** Both hash and sorted maps can support accelerated merge/diff/join/etc. operations.</li>
<li><code>cljd</code> CLI written in <code>cljd</code> for easier project creation etc.</li>
<li>gen tests</li>
<li>&hellip; <br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<h3 id="shadow-cljs">shadow-cljs</h3>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (e.g. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.52.10 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<h3 id="notable-updates">Notable Updates</h3>
<ul>
<li>Fixed some <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#dev-http">:dev-http</a> issues that prevented proxying websockets or self-signed SSL certificates.</li>
<li>Fixed some node REPL issues, hopefully making it more reliable overall  <br></li>
</ul>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>(aka Niki Tonsky)</p>
<p>Must be something in the air that makes you start new projects in the Fall. Three new ones has popped up:</p>
<h4 id="new-project---clj-simple-routerhttpsgithubcomtonskyclj-simple-router">New project - <a href="https://github.com/tonsky/clj-simple-router">clj-simple-router</a>:</h4>
<ul>
<li>A minimal, order-independent Ring router</li>
<li><a href="https://tonsky.me/blog/simple-router/">An introductory blog post</a></li>
</ul>
<h4 id="new-project---toml-cljhttpsgithubcomtonskytoml-clj">New project - <a href="https://github.com/tonsky/toml-clj">toml-clj</a>:</h4>
<ul>
<li>Fast TOML parser for Clojure</li>
<li>2000x faster than existing Instaparse-based ones</li>
<li>30x faster than tomlj (Java)</li>
</ul>
<h4 id="new-project---extend-cljhttpsgithubcomtonskyextend-clj">New project - <a href="https://github.com/tonsky/extend-clj">extend-clj</a>:</h4>
<ul>
<li>Easily extend clojure.core built-in protocols</li>
<li>Both Clojure and ClojureScript</li>
<li>First version let you implement your own Atoms</li>
<li>More to come</li>
</ul>
<p>Old projects also have seen some love:</p>
<h4 id="datascripthttpsgithubcomtonskydatascript"><a href="https://github.com/tonsky/datascript/">DataScript</a>:</h4>
<ul>
<li>:xform is not called on ref attributes #455</li>
<li>Work started on automatic client-server synchronization. Don’t tell anyone, but you can <a href="https://github.com/tonsky/datascript/commits/sync">follow progess in the branch</a></li>
</ul>
<h4 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>:</h4>
<ul>
<li>Socket REPL: handle exceptions in lookup</li>
<li>Do not silence exception during lazy seq printing</li>
<li>Report number of reflection warnings in status bar</li>
<li>Eval inside already evaled region re-evals same region instead of going to top form</li>
<li>Printer can display newlines</li>
</ul>
<h4 id="sublime-executorhttpsgithubcomtonskysublime-executor"><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>:</h4>
<ul>
<li>Don’t die if project has non-existing folders</li>
</ul>
<p>And, of course, blogging. Unicode article has seen its five minutes of fame:</p>
<ul>
<li><a href="https://tonsky.me/blog/unicode/">The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!)</a>  <br></li>
</ul>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Working mostly with Malli and Reitit. Will do an open source retreat to get planned things out in 2023.</p>
<h3 id="malli">Malli</h3>
<ul>
<li>Still WIP with the <a href="https://github.com/metosin/malli/issues/264">new effective type system</a>.</li>
<li>Lot&rsquo;s of small improvements released and waiting for a release.</li>
</ul>
<h4 id="0130-2023-09-24">0.13.0 (2023-09-24)</h4>
<ul>
<li><strong>BREAKING</strong> Fallback to use result of first branch when decoding <code>:or</code> and <code>:orn</code>, <a href="https://github.com/metosin/malli/pull/946">#946</a></li>
<li><strong>BREAKING</strong>: <code>decode</code> for <code>:double</code> and <code>double?</code> in cljs doesn&rsquo;t allow trailing garbage any more <a href="https://github.com/metosin/malli/pull/942">#942</a></li>
<li>Faster generators for <code>:map</code>,  <a href="https://github.com/metosin/malli/pull/948">#948</a> &amp; <a href="https://github.com/metosin/malli/pull/949">#949</a></li>
<li>FIX: <code>:altn</code> can&rsquo;t handle just one child entry when nested in sequence schema <a href="https://github.com/metosin/malli/pull/945">#945</a></li>
<li>Officially drop Clojure 1.10 support. Tests haven&rsquo;t passed for some time with Clojure 1.10, but this was not noticed due to a faulty CI setup.</li>
<li>Use type inferrer when encoding enums  <a href="https://github.com/metosin/malli/pull/951">#951</a></li>
<li>Use <code>bound-fn</code> in <code>malli.dev/start!</code> to preserve <code>*out*</code>  <a href="https://github.com/metosin/malli/pull/954">#954</a></li>
<li>FIX: Malli generates invalid clj-kondo type spec for [:map [:keys [:+ :keyword]]] <a href="https://github.com/metosin/malli/pull/952">#952</a></li>
<li>FIX: <code>malli.experimental.describe</code> descriptions of <code>:min</code> and <code>:max</code> are backwards <a href="https://github.com/metosin/malli/pull/959">#959</a></li>
<li>FIX: Malli tuple should generate clj-kondo seqable <a href="https://github.com/metosin/malli/pull/962">#962</a></li>
</ul>
<h3 id="reitit">Reitit</h3>
<h4 id="070-alpha7-2023-10-03">0.7.0-alpha7 (2023-10-03)</h4>
<ul>
<li>Revert the group id change from alpha6</li>
<li>New release to bring alpha6 changes to the old group id</li>
<li>Updated dependencies:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[metosin/ring-swagger-ui <span style="color:#e6db74">&#34;4.19.1&#34;</span>] is available but we use <span style="color:#e6db74">&#34;4.18.1&#34;</span>  
</code></pre></div><h4 id="070-alpha6-2023-09-11">0.7.0-alpha6 (2023-09-11)</h4>
<ul>
<li><strong>BREAKING</strong>: require Clojure 1.11, drop support for Clojure 1.10</li>
<li><strong>BREAKING</strong>: new syntax for <code>:request</code> and <code>:response</code> per-content-type coercions. See <a href="https://github.com/metosin/reitit/blob/master/doc/ring/coercion.md">coercion.md</a>. <a href="https://github.com/metosin/reitit/issues/627">#627</a></li>
<li><strong>BREAKING</strong>: replace the openapi <code>:content-types</code> keyword with separate <code>:openapi/request-content-types</code> and <code>:openapi/response-content-types</code>. See <a href="https://github.com/metosin/reitit/blob/master/doc/ring/openapi.md">openapi.md</a></li>
<li><strong>NOTE!</strong>: all reitit libraries are now under the <code>fi.metosin</code> group on clojars instead of <code>metosin</code>. Use <code>fi.metosin/reitit</code> in your dependencies instead of <code>metosin/reitit</code> to get new versions.
<ul>
<li><strong>Reverted in alpha7 due to problems with renaming artifacts</strong></li>
</ul>
</li>
</ul>
<h3 id="jsonista">Jsonista</h3>
<ul>
<li>A maintanance release</li>
</ul>
<h3 id="something-else">Something else</h3>
<p>We had a family vacation in the Rhodes Island, which had massive wildfires earlier this year</p>
<p><img src="https://gist.github.com/ikitommi/a1e62b3a35359259bfef94433ec2730b/raw/cb2161b4b8a75b38190940731cc02c01b407396a/image.png" alt="image"></p>
<br>
<hr>
<h2 id="peter-stromberg">Peter Stromberg</h2>
<h3 id="calva">Calva</h3>
<p>I had a bit of vacation from hacking on Calva during September. Which does not mean I had (or need ??) a vacation from Calva, I kept pretty busy with user support. And it was not all pause on the hacking either, more that I couldn&rsquo;t really get a hold on some bugs and after some fruitless hunts I decided to wait for more information. Which I got, both from users and from my own investigations. There was also an issue with VS Code Insider builds, <a href="https://github.com/BetterThanTomorrow/calva/issues/2317">stopping our CI pipeline completely</a>. Calva uses the Insider branch of VS Code for integration testing. I was pretty sure the VS Code team would fix it, so I waited that out instead of installing workarounds. But not without spending considerable time on the issue before figuring out that it was upstream, and where upstream.</p>
<p>The major issue hitting users was quite awful. <a href="https://github.com/BetterThanTomorrow/calva/issues/2299">A hang in Calva&rsquo;s structural editor</a>, which mostly manifested itself in moments of total Calva unresponsiveness. With the help of <a href="https://github.com/ingydotnet">Ingy döt Net</a>&rsquo;s ever more minimal reproductions we finally understood the problem and could fix it. ?? There is also some other hang hitting users of WSL, that we haven&rsquo;t figured out yet&hellip;</p>
<p>Calva user <a href="https://github.com/AlbertSnows">Albert Snow</a> discovered that <a href="https://github.com/BetterThanTomorrow/calva/issues/2325">Calva&rsquo;s ClojureScript Quick Start REPLs were broken on Windows</a>. He set the Calva development environment up and we could pair on finding the issue, which he then fixed! ??</p>
<p>Also fixed:</p>
<ul>
<li>An annoying glitch with <a href="https://github.com/BetterThanTomorrow/calva/issues/2309">some Calva REPL commands not working when the cursor was inside the ns form</a>.</li>
<li>Another annoying glitch where<a href="https://github.com/BetterThanTomorrow/calva/issues/2301">disconnecting and then reconnecting a REPL didn&rsquo;t work</a></li>
</ul>
<h3 id="giving-myself-a-javascript-repl-with-joyride">Giving myself a JavaScript REPl with Joyride</h3>
<p>As a not-too-frequent user of JavaScript, I often find myself lacking an easy way to experiment with JS code, especially in the way I am used to being able to experiment with Clojure code. I decided to use <a href="https://github.com/BetterThanTomorrow/joyride/tree/master">Joyride</a> for it, and created a script that gives me a JavaScript REPL, right there in VS Code. It&rsquo;s still very simple, and I plan to return to it, making it a bit more sophisticated, but it is already pretty useful.</p>
<ul>
<li>Joyride Examples entry: <a href="https://github.com/BetterThanTomorrow/joyride/tree/master/examples#give-yourself-a-javascript-repl">Give yourself a JavaScript REPL</a></li>
</ul>
<h3 id="polylith-real-world-example-in-the-browser">Polylith Real World example in the browser</h3>
<p>When helping Joakim Tengstrand with feedback on an article about Polylith (pending), we realized that it would be very good with a way to test Polylith without having to set your machine up for Clojure development. So I created an experience for that, leveraging Gitpod and <a href="https://github.com/furkan3ayraktar">Furkan Bayraktar</a>&rsquo;s Real World example app.</p>
<ul>
<li><a href="https://github.com/furkan3ayraktar/clojure-polylith-realworld-example-app/blob/master/gitpod.md">Hack on Real World Polylith in your Browser</a></li>
<li>CalvaTV: <a href="https://www.youtube.com/watch?v=FjdXjwcXaZg">The Polylith Real World Example, with an IDE Running in The Browser</a></li>
</ul>
<p>Related: I also wrote about observing when <a href="https://blog.agical.se/en/posts/to-chatgpt-a-picture-says-more-than-a-thousand-words/">ChatGPT taught itself about Polylith from only a single diagram</a> from that coming article.</p>
<h3 id="image-composition-using-babashka--membrane">Image composition using Babashka &amp; Membrane</h3>
<p>But not together. Though enabling using <a href="https://github.com/phronmophobic/membrane">Membrane</a> to <a href="https://babashka.org">Babashka</a> does present itself as something I might try to do one of these days.</p>
<p>Some venturing into image and text composition lead me to two different solutions. One invloving ImageMagick and Babashka, plus it had me create a missing Docker image. And one involving the super exciting Clojure UI library, Membrane:</p>
<ul>
<li>Imagemagick + Pango + Babashka:
<ul>
<li>Write up: <a href="https://blog.agical.se/en/posts/imagemagick--x--pango--x--babashka--x---x--x-/">ImageMagick + Pango + Babashka = ??</a></li>
<li>CalvaTV: <a href="https://youtu.be/fa5ig2cIWnU">Interactive Shell Scripting with Babashka</a></li>
<li>Docker image <a href="https://hub.docker.com/repository/docker/cospaia/magick-pango-babashka/">cospaia/magick-pango-babashka</a></li>
</ul>
</li>
<li>Membrane
<ul>
<li>Example project: <a href="https://github.com/PEZ/x-meta-image">REPL Playground for adding back article info to links shared on X/Twitter</a></li>
<li>Write up: Pending&hellip;</li>
<li>CalvaTV: <a href="https://www.youtube.com/watch?v=ImBji-1bKkc">Interactive Programming with Clojure &amp; Membrane</a><br>
<br></li>
</ul>
</li>
</ul>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<h3 id="open-source-update">Open source update</h3>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="/sponsors">other sponsors</a> of my open source work!</p>
<h3 id="recent-work">Recent work</h3>
<p>This was another productive period with 100% of my time going to open source. Highlights:</p>
<ul>
<li>The usual support, hotfixes, etc.</li>
<li><a href="https://www.taoensso.com/clojure/news">14 library releases</a> including:
<ul>
<li>
<p><a href="https://github.com/taoensso/carmine/releases/tag/v3.3.0">Carmine v3.3.0</a> with the first stable release of a significantly improved message queue <a href="https://github.com/taoensso/carmine/wiki/0-Breaking-changes#architectural-improvements">architecture</a> and <a href="https://github.com/taoensso/carmine/wiki/0-Breaking-changes#api-improvements">API</a>.</p>
</li>
<li>
<p><a href="https://github.com/taoensso/nippy/releases/tag/v3.3.0">Nippy v3.3.0</a> with updated <a href="https://github.com/taoensso/nippy#performance">benchmarks</a>, efficiency improvements, and experimental transducer support.</p>
</li>
<li>
<p><a href="https://github.com/taoensso/nippy/releases/tag/v3.4.0-beta1">Nippy v3.4.0-beta1</a> with significant compression performance improvements, support for <a href="http://facebook.github.io/zstd/">Zstandard</a>, and a much improved <code>freezable?</code> util.</p>
</li>
<li>
<p><a href="https://github.com/http-kit/http-kit/releases/tag/v2.8.0-beta2">http-kit v2.8.0-beta2</a> with auto Java 21+ virtual threads for both client+server, extensive new <a href="https://github.com/http-kit/http-kit/wiki/4-Benchmarking">benchmark suite and results</a>, early support for Ring-style async handlers, and more.</p>
</li>
</ul>
</li>
<li>Continued work on <a href="https://www.taoensso.com/tempel">Tempel</a>, an upcoming <strong>data security framework</strong> for Clojure.</li>
<li>Continued work on <a href="https://www.taoensso.com/telemere">Telemere</a>, an upcoming <strong>structured telemetry library</strong> for Clojure/Script.</li>
<li>Did an interview with <a href="https://twitter.com/danielwithmusic">Daniel Compton</a> to be published soon.</li>
</ul>
<h3 id="upcoming-work">Upcoming work</h3>
<ul>
<li><a href="https://www.taoensso.com/tempel">Tempel</a> is nearing completion, I&rsquo;m down to the final polishing and documentation. Aiming for the first public pre-release <strong>early November</strong>.</li>
<li><a href="https://www.taoensso.com/telemere">Telemere</a>&rsquo;s first pre-release is then planned for <strong>~mid December</strong>.</li>
</ul>
<p>- <a href="https://www.taoensso.com">Peter Taoussanis</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Long-Term Funding for 2024</title>
      <link>https://www.clojuriststogether.org/news/long-term-funding-for-2024/</link>
      <pubDate>Fri, 10 Nov 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/long-term-funding-for-2024/</guid>
      <description>We will be awarding $126K to 7 deveopers in 2024</description>
      <content:encoded><![CDATA[<br>
<p>Clojurists Together is excited to announce that we will be awarding each of 7 developers $1,500 USD/month for 12 months in 2024 (a total of $126,000).</p>
<p>This is the 3rd year that we have been able to fund a significant number of longer-term project developers. This is due to the generous support from our membership, particularly from companies whose major contributions have made this number of annual awards possible. A shout out to: <a href="https://www.latacora.com/">Latacora</a>, <a href="https://roamresearch.com/">Roam Research</a>, <a href="https://whimsical.com/">Whimsical</a>, <a href="https://pitch.io/">Pitch</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.cisco.com/">Cisco</a>, <a href="https://www.metosin.fi/">Metosin</a>, <a href="https://stylitics.com/">Stylitics</a>, <a href="https://logseq.com/">Logseq</a>, <a href="https://juxt.pro/">JUXT</a>, <a href="http://www.solita.fi/en">Solita</a>, <a href="http://www.adgoji.com/">adgoji</a>, <a href="https://app.grammarly.com/">Grammarly</a>, <a href="https://nextjournal.com/">Nextjournal</a>, <a href="https://clojure.stream/">ClojureStream</a>, <a href="https://www.shortcut.com/">Shortcut</a>, <a href="https://flexiana.com/">Flexiana</a>, <a href="https://toyokumo.co.jp/">Toyokumo</a>, <a href="https://www.griffin.sh/">Griffin</a>, <a href="https://www.doctronic.de/">Doctronic</a>, <a href="https://www.180s.com.br/">180 Seguros</a>, and <a href="https://www.kroo.com/">Kroo Bank</a>.</p>
<p>As in past years, we will be sending members a draft list of potential nominees to ask if there are additional folks they would like added to the ballot. The final ballot will go out to members using a <a href="https://www.rankedvote.co/guides/understanding-ranked-choice-voting/how-does-ranked-choice-voting-work">Ranked Vote</a> election to determine the final 7 recipients. As always, your input and participation is important and helps make Clojurists Together effective by ensuring members’ voices inform the work undertaken.</p>
<h3 id="developers-2023-updates">Developers’ 2023 Updates</h3>
<p>Updates from our Long-Term Developers are posted on our website every two months. They are testaments to the incredible and varied contributions they have been able to make because of this type of long-term support. Check out a few recent reports:<br>
<a href="https://www.clojuriststogether.org/news/july-and-august-2023-long-term-project-updates/">July/August 2023</a><br>
<a href="https://www.clojuriststogether.org/news/2023-long-term-projects-may-and-june-updates/">May/June 2023</a><br>
<a href="https://www.clojuriststogether.org/news/firefox-116.0-release/">Custom Formatters for Firefox (Release)</a><br>
<a href="https://www.clojuriststogether.org/news/2023-long-term-projects-march-april-updates/">March/April 2023</a><br>
<a href="https://www.clojuriststogether.org/news/march-2023-report-jan.-and-feb.-updates-for-2023-long-term-projects/">Jan/Feb 2023</a></p>
<h3 id="background">Background</h3>
<p>In 2021, we talked to developers to understand how Clojurists Together could better serve them. One of the things we heard was that developers were looking for more flexibility and stability in funding and that they appreciated <a href="https://www.cognitect.com/blog/2020/12/15/sponsoring-open-source-developers">Cognitect’s funding model</a>.</p>
<p>In response, we created a long-term funding program alongside our existing shorter-term project grants - giving funded developers $1.5k/month for 12 months. We have seen that giving developers flexible, long-term funding gives them the space to do high-impact work. This might be continuing maintenance on existing projects, new feature development, or perhaps a brand-new project. We’ve been excited with what they came up with in the last few years and are looking forward to seeing more great work in 2024! Thanks all!</p>
<h3 id="past-recipients">Past Recipients</h3>
<p><strong>2023 Recipients</strong><br>
· Bozhidar Batsov<br>
· Christophe Grand<br>
· Eric Dallo<br>
· Michiel Borkent<br>
· Nikita Prokopov<br>
· Peter Stromberg<br>
· Peter Taoussanis<br>
· Sean Corfield<br>
· Thomas Heller<br>
· Toby Crawley<br>
· Tommi Reiman</p>
<p><strong>2022-2023 Special Project</strong><br>
· Sebastian Zartner (Custom Formatters/FireFox)</p>
<p><strong>2021-2022 Recipients</strong><br>
· Bozhidar Batsov<br>
· Michiel Borkent<br>
· Dragan Djuric<br>
· Thomas Heller<br>
· David Nolen<br>
· Nikita Prokopov</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for Proposals. November 2023 Member Survey</title>
      <link>https://www.clojuriststogether.org/news/call-for-proposals.-november-2023-member-survey/</link>
      <pubDate>Sun, 05 Nov 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-proposals.-november-2023-member-survey/</guid>
      <description>We have $44K for Q1 2024 Projects</description>
      <content:encoded><![CDATA[<br>
<h2 id="call-for-proposals">Call for Proposals.</h2>
<p>Clojurists Together is pleased to announce that we are opening our Q1 2024 funding round for Clojure Open Source Projects. Applications are open until the 24th of November 2023 (midnight Pacific Time). We are looking forward to reviewing your proposals! <a href="https://clojuriststogether.org/open-source/">More information and the application can be found here.</a></p>
<p>We will be awarding a total of $44,000 USD for 8 projects – 4 projects at $2,000 each and 4 projects at $9,000 each. The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established. Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed. We expect projects to start on January 1, 2024.</p>
<p>We recently surveyed our members to find out what types of initiatives they would like us to focus on for this round of funding. Their responses are summarized below.  Thanks as always – it is extremely helpful in ensuring that the community is a vital source of input.</p>
<p>If you are working on a Clojure open source project or have a new one in mind, especially one mentioned as a focus area for our members, please consider applying. Or if you know someone that might be interested, please pass this information along. Let&rsquo;s get the word out!</p>
<h2 id="our-members-speak-feedback-from-the-octobernovember-2023-survey">Our Members Speak: Feedback from the October/November 2023 Survey.</h2>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/1e95be5c-b0ec-429a-a9fa-9b2e2de47549" alt="Platformchart"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/0380669b-4418-4dcf-bb58-bf42f7ebd32e" alt="clojureimprovechart"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/0a8c3ec1-e1db-40df-a9c5-1fb29abf6397" alt="clojurescriptimprovechart"></p>
<h2 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h2>
<h3 id="production-grade-documentation-and-libraries">Production-Grade Documentation and Libraries</h3>
<p>•	More Clojure (not ClojureScript) oriented server-side libraries and tools<br>
•	Documentation and tooling are still abysmal across the board.<br>
•	Documentation is something that could be extended; the official references sometimes can be cryptic when you&rsquo;re googling for something. A more verbose manual would be helpful.</p>
<h3 id="more-users-increased-beginner-adoption">More Users, Increased Beginner Adoption</h3>
<p>•	Evangelism, bringing in new developers<br>
•	Better new user onboarding, simpler initial setup<br>
•	Beginner learning material and outreach to other communities outside of the Clojure and ClojureScript community<br>
•	Community building and events<br>
•	Make Clojure CLI (deps.edn) easier to digest. I get the feeling that I should be an expert before using it. Lein with all its shortcomings, just gets you 90% of the way without you having to learn the tool. It just works. I still don&rsquo;t understand the difference between clj and Clojure (why are both needed) and can never remember the difference between -X -A -T -M and whatnot.</p>
<h3 id="frameworks-tools-and-functions-ensure-relevancy-in-the-eco-system">Frameworks, Tools, and Functions. Ensure relevancy in the eco-system.</h3>
<p>•	Improving linters and test frameworks. the windows instructions on how to install clojure to get more people in (&ldquo;An early release version of clj on Windows is available at..&rdquo; has been the state since forever)?<br>
•	I think it&rsquo;s time for a Rails-/Django-/Phoenix- like framework :-) Maybe more companies would jump in and use the language. I know it&rsquo;s a difficult thing to balance because if <em>I</em> were to build it I&rsquo;d base it on Hiccup, HTMX, HoneySQL and Component but the community likes to reinvent the Component library a lot. That would also not cover the database layer that well.<br>
•	I would love to see improved support for primitive math operations. I&rsquo;m constantly vexed by boxed loop variables.<br>
•	I would just generally say I find the experimental ClojureScript work Michiel Borkent is doing to be heading in a very interesting direction and would love to see it continue to be supported.<br>
•	I would like to get the &ldquo;feel&rdquo; that Clojure is modern. In many areas it feels like it has entered the 21st century.<br>
•	I feel like I am using xargs or sed for which I can never remember the arguments and have look them up again and again.<br>
•	The core language itself should be shored up: there are too many open bugs<br>
•	Anything that keeps Clojure/Clojurescript viable as a full stack ecosystem.<br>
•	Libs and tools around Datomic. Emacs IDEs which are not CIDER.<br>
o	IDE support, java 21 support<br>
•	Default MVC framework<br>
•	cljdart seems strategically important, and nativeimage perhaps<br>
•	Errors, async (for cljs)<br>
•	Squint</p>
<h3 id="data-science-ai">Data Science, AI</h3>
<p>•	Several comments about AI and Data Science in general.<br>
•	Small data analysis tooling, things like fancy pattern matching, specter, meander &amp;c</p>
<h2 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong-compilation">What areas of the Clojure and ClojureScript ecosystem are strong? (compilation)</h2>
<p>•	Stability, ability to use non-Clojure libraries via interop, I don&rsquo;t have to upgrade my build tooling every 3 weeks. Dev. Experience.<br>
•	Core library and frameworks. Both Clojure core and many libs are of high (code) quality (not always the documentation though)<br>
•	Routing libraries and React Wrappers (there are so many)<br>
•	Dedicated community. Clojurian Slack<br>
•	Probably the most senior developers who love their language
•	Building end user applications<br>
•	Clojure in general is excellent for my work!<br>
•	At this time I can do pretty much everything I want to do with full stack ClojureScript which is why I haven&rsquo;t nominated anything that needs attention in the previous questions. Everything is great already!<br>
•	Build tools esp shadow-cljs<br>
•	Web &ldquo;frameworks<br>
•	Api development<br>
•	Babashka, CIDER</p>
<h2 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported-listed-by-number-of-mentions">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported? (Listed by number of mentions):</h2>
<p>(4) Jank, Shadow-cljs<br>
(3) CIDER, ClojureDart Clj-kondo, tech.ml.dataset<br>
(2) Babashka, Calva, Datatomic, FlowStorm, Mali, Portal, Re-Frame, SciCloj projects, Tablecloth<br>
(1) Bifurcan (Zach Tellman), Bosquet, Clerk, Clj-mqtt-broker, Clojure Commons, Clojure2D, Clojure-lsp, Clojure-ts-mode, Cloverage, core.async, Cursive IDE, DataLevin, Deps, dtype-next, Electric Clojure, Fastmath, Fulcro, GraphQL, gRPC, datadog, Kaocha, Libpython-clj, Meander, Integrant, Nrepl, Open Telemetry, Pathom, Reagent, Snitch, sqlg-clj, thi.ng/geom<br>
•	More statistical programs build on neanderthal (generalized additive models, or Bayesian data analysis ala <a href="https://github.com/uncomplicate/bayadera)">https://github.com/uncomplicate/bayadera)</a>. Someone picking up the visualisation library oz (vega/vega-lite).<br>
•	Michael Borkent&rsquo;s work, Thomas Heller&rsquo;s work. I also use binaryage/devtools, promesa, and applied-science.js-interop in nearly every project. Borkdude ecosystem.<br>
•	Not only, but definitely Sean Corfield&rsquo;s, Peter Stromberg&rsquo;s and Michiel Borkent&rsquo;s projects</p>
<h2 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h2>
<h3 id="future-direction-and-improvements">Future Direction and Improvements</h3>
<p>•	Virtual threads seem like a big deal. My understanding is that Clojure&rsquo;s core uses object synchronization that makes virtual threads a nonstarter for many applications&ndash;I imagine rectifying that might be a high priority.<br>
•	Big picture stuff that leads to more developer productivity (like Clojure Electric compiling away the network).<br>
•	Clojure data science moving into the areas that R/python and even Excel are covering<br>
•	ClojureScript / browser target future</p>
<ul>
<li>Becoming relevant in currently growing fields (e.g., LLMs)</li>
<li>Reaching a mature state in the data-science field<br>
•	Catchup with Tooling aligned with JS/TS ecosystem<br>
•	Being less concentrated on ClojureScript is the improvement by itself for the Clojure community.</li>
</ul>
<h3 id="production-grade-documentation-and--libraries">Production-Grade Documentation and  Libraries</h3>
<p>•	I&rsquo;d love to see a focus on production-grade, usable, and documented libraries. Too many production stacks rely on poorly thought-out weekend projects and frameworks that are abandoned and do not cleanly operate with deployment technology released in the last decade.<br>
•	Better docs, smarter toolsets</p>
<h3 id="more-users-increased-beginner-adoption-1">More Users, Increased Beginner Adoption</h3>
<p>•	New people joining the Clojure ecosystem, leveraging the changes in the JVM<br>
•	Many more new users<br>
•	Getting the beginner adoption higher. Seems that even other Clojure devs sometimes see using Clojure as a vendor lock in even though it definitely is not a more difficult language to learn than the others.<br>
•	More projects that directly address the popularity question<br>
•	Making Clojure a clear and visible option for many people who haven&rsquo;t considered it yet<br>
•	Higher adoption<br>
•	Batteries-included starting journeys, now that deps replaced Lein</p>
<h3 id="community-and-convening">Community and Convening</h3>
<p>•	I wish there was an easy way to know of the CFPs of upcoming conferences so I don&rsquo;t miss them.<br>
•	Get some community building going. with Strangeloop gone, ClojureD not happening this year, there is a gap widening.<br>
•	I&rsquo;d like to see Clojure being talked about in the wider tech community, not just in Clojure-specific forums.  It would be great to see more Clojure talks at mainstream conferences for example.<br>
•	The community seems nice, don&rsquo;t touch anything!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2023 Annual Members&#39; Meeting</title>
      <link>https://www.clojuriststogether.org/news/2023-annual-members-meeting/</link>
      <pubDate>Tue, 24 Oct 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2023-annual-members-meeting/</guid>
      <description>Report from our October 2023 Meeting</description>
      <content:encoded><![CDATA[<br>
Clojurists Together held its Annual Membership meeting on 10 October 2023 (10-11 a.m. Pacific Time). A big thanks to all of you who were able to attend. For those of you who couldn’t, here is a summary of the meeting and subsequent discussion.<br>     
<br>  
<p><strong>Board Elections:</strong> The first order of business was to acknowledge our new board members and thank our departing members Chris Nuernberger and Ikuru Kanuma.
In October, Members elected 4 board members for two-year terms:</p>
<ul>
<li>Daniel Compton, Secretary-Treasurer (returning member)</li>
<li>Heather Moore-Farley (returning member)</li>
<li>Felix Barbalet (new to the board)</li>
<li>Max Penet (new to the board)</li>
</ul>
<p>In addition, two board members have 1 year remaining of their board term:</p>
<ul>
<li>lvh (Laurens Van Houtven), President</li>
<li>Maria Geller
<br></li>
</ul>
<p><strong>Summary of Presentation:</strong></p>
<ul>
<li>In 2023, we were able to draw down a significant reserve by funding more long-term developers and short-term projects - benefiting the Clojurists community and as a by-product providing some stability in a tech marketplace that has experienced major layoffs in the last year.</li>
<li>If we assume a minimal reserve and a similar level of membership revenue in 2024, we will need to decrease our funding of projects slightly  going forward - or focus on ways to increase company and individual memberships and/or membership contributions.</li>
<li>While growth of new memberships (both company and individuals) has slowed from previous years, our retention rate is remarkably high. (95%+)</li>
<li>We have been able to fund an incredible amount of quality work that has real value to both companies and individual developers. With added oversight of the board and regular input from the Clojurist community, the overall value and return on investment is very high. We provide proof of concept that “Sustainable open-source is sustainable”.</li>
<li>The hiring of a program manager has increased overhead slightly but improved the timeliness of payments and communication (Daniel was trying to do it all as a volunteer in his “spare time”). However, administrative expenses at 7% of revenue continue to run under average for non profits (15-20%) and Open Collective fees (10%).
<br></li>
</ul>
<p><strong>Summary of Funding Activities:</strong><br>
<img width="600" alt="projects202223" src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/10045d85-62dc-4c37-b2b5-53425a491ace">
<br><br>
<br></p>
<p><strong>Summary of 2023 Funding:</strong><br>
<strong>- Long-term funding:</strong> 10 developers, $18k each, $180k in total.
Bozhidar Batsov, Michiel Borkent, Sean Corfield, Eric Dallo, Christophe Grand, Thomas Heller, Nikita Prokopov, Tommi Reiman, Peter Stromberg, Peter Taoussanis, Toby Crawley (5 months $7.5K)<br>
<strong>- Funded 30 projects for $150k:</strong> 23 smaller projects ($130k total) in 2023 and 7 from Q3 2022 continued into 2023 ($20k). Adopted flexible funding, up to 12 months.<br>
<strong>- Q1 2023:</strong> Aleph/Manifold, Clerk, clojure-ts-mode, Donut, Doxa, Exercism, Neanderthal<br>
<strong>- Q2 2023:</strong> clj-kondo et al, clj-Nix, Clojure Camp, Emmy, Jank, Portfolio, Lucene Grep, Neanderthal<br>
<strong>- Q3 2023:</strong> Biff, Bosquet, Deps-try, Emmy, GDL, Jank , Neanderthal, Quil<br>
<strong>- Firefox Custom Formatters:</strong> Sebastian Zartner continued work to add Custom Formatters to Firefox. Released August, 2023. ($18k)<br>
<br></p>
<p><strong>Company Membership:</strong>
Thanks to all our company members (Map, Transduce, Filter Memberships)<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/3e9ccdea-cdd5-4848-b70e-996949a35ebe" alt="companysponsors2023a"></p>
<br>
<p><strong>Individual Members:</strong><br>
While we need to work on growing both our individual and company memberships to support more projects, our retention rate (95%) is incredibly high.<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/84360755-c046-4836-8a5f-9319495acb58" alt="membership2023"></p>
<br>
<p><strong>Summary of Financials:</strong><br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/ada062bd-4812-4186-ae63-35a2d242db9b" alt="finances2023"></p>
<br>
<p><strong>Discussion and Follow-Up:</strong><br>
<em>Has the board solicited major projects in the past - and how could we incorporate this approach as part of the funding model in addition to the open proposal model?</em></p>
<p>The board has solicited specific projects in the past (FireFox release a good example), however, it has been difficult to find developers that have both the specific expertise and the bandwidth to commit to major projects.<br>
<strong>Follow-Up:</strong> We can include more specific questions in the Long Term Survey about the types of projects we should champion.<br>
<strong>Follow-Up:</strong> We can connect with sponsor companies to understand more about their use and needs related to targeted platforms, developer tools, resources, etc.  <br></p>
<p><em>Is the current reporting format meeting the needs of the membership - are there suggestions for improvement? (The reports are quite detailed and are written and submitted by the developers on a regular basis).</em></p>
<p>While the reports provide a useful way for members to access new tools and information, they also provide a way of demonstrating the value of the work funded by companies and individual members. A membership supports REAL work!
Members attending scan current reports for the info that is most useful or interesting to them - so details are not a negative.<br>
<strong>Follow-up:</strong> We should consider highlighting 5-10 accomplishments - easy access, intriguing, problem-solved, etc. for marketing our unique value as a community and an organization.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>October 2023 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/october-2023-project-updates/</link>
      <pubDate>Mon, 23 Oct 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2023-project-updates/</guid>
      <description>Just in from Biff, Bosquet, Clojure Camp, Deps-try, GDL, Jank, Neanderthal, Quil</description>
      <content:encoded><![CDATA[<br>
Check out the latest reports from our developers working on shorter-term projects.
<p><a href="#biff-jacob-o'bryant">Biff: Jacob O’Bryant</a><br>
<a href="#bosquet-zygis-medelis">Bosquet: Zygis Medelis</a><br>
<a href="#clojure-camp-daniel-higginbotham">Clojure Camp: Daniel Higginbotham</a><br>
<a href="#deps-try-gert-goet">Deps-try: Gert Goet</a> <br>
<a href="#gdl-michael-sappler">GDL: Michael Sappler</a><br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
<a href="#neanderthal-dragan-duric">Neanderthal: Dragan Duric</a> <br>
<a href="#quil-jack-rusher-and-charles-comstock">Quil: Jack Rusher and Charles Comstock</a></p>
<h2 id="biff-jacob-obryant">Biff: Jacob O’Bryant</h2>
<p>2023 Q3 Funding Report 1. Published 15 October 2023.</p>
<ul>
<li>Published an essay <a href="https://biffweb.com/p/understanding-htmx/">Understanding htmx</a>. Seems to have
been well received. It&rsquo;s had 1.4k page hits.</li>
<li>Wrote the first half of another essay, <a href="https://forum.tfos.co/t/draft-how-does-xtdb-compare-to-other-databases">How does XTDB compare to other
databases?</a> (working title)</li>
<li>Studied some beginner SEO resources
(<a href="https://blog.hubspot.com/marketing/how-to-do-keyword-research-ht">this</a> and
<a href="https://moz.com/beginners-guide-to-seo">this</a>) and did some keyword research.</li>
</ul>
<p>My conclusion is that the only Clojure-related search query with enough traffic to be worth trying to rank for is simply &ldquo;clojure&rdquo; itself. (e.g. &ldquo;clojure web framework&rdquo; seems like an obvious candidate, but Google says it gets only 10 - 100 searches per month.)</p>
<p>Looking at the current Google results for &ldquo;clojure&rdquo;, it actually seems like it might be possible eventually to rank in the second half of the page. But either way, I don&rsquo;t think it&rsquo;s worth trying to write about any particular topics/go after any particular search keywords; I&rsquo;ll just keep writing whatever seems most useful based on community feedback/gut feel. And maybe at some point, I&rsquo;ll make sure I have a handful of pages that would at least be good candidates for the &ldquo;clojure&rdquo; results page&ndash;like my existing <a href="https://biffweb.com/p/why-i-like-clojure/">why
clojure</a> essay, and perhaps a curated list of learning resources.</p>
<p>I would&rsquo;ve liked to have written at least three essays at this point instead of just one and a half, but I had some stuff come up. The next six weekends are clear though :). Things I&rsquo;d like to get done in that time:</p>
<ul>
<li>Finish my current essay on XTDB</li>
<li>Write an essay about Biff&rsquo;s rationale and philosophy</li>
<li>Write a framework comparison document that describes the differences between Biff and Kit/Fulcro/rolling your own.</li>
<li>Write several how-tos focused on swapping out Biff&rsquo;s defaults: replace XTDB with Postgres/SQLite/Datomic; deploy with Docker instead of on a plain VM; replace htmx with re-frame.</li>
</ul>
<p>The remaining how-tos and the Biff-from-scratch guide (see the <a href="https://biffweb.com/docs/library/">content
library</a> roadmap) will need to wait until later.  <br></p>
<hr>
<h2 id="bosquet-zygis-medelis">Bosquet: Zygis Medelis</h2>
<p>2023 Q3 Funding Report 1. Published 30 September 2023.</p>
<h3 id="goals">Goals</h3>
<p>The main development direction for Bosquet is to provide an environment where LLM apps can execute autonomously. It needs to provide facilities for LLM agents to plan actions, use tools, and have memory access that enables this behavior. Initial functionality providing developers with prompt engineering, chaining, and completions remains Bosquet&rsquo;s integral part.</p>
<h3 id="changes">Changes</h3>
<h4 id="integrant-based-system-management">Integrant-based system management</h4>
<p>Autonomous agents need unified access to Memory, LLM Services, Planning, Tools, and other components. Integrant-based component management now added to Bosquet allows it. As part of the current release - LLM Services and Memory are declared via the Integrant system.</p>
<p>Bosquet Component configuration is implemented with <em>juxt/aero</em> library for added flexibility.</p>
<h4 id="multi-llm-service-support">Multi LLM service support</h4>
<p>Alongside previously available Open AI access (via <em>wkok/openai-clojure</em>), Bosquet now supports Cohere LLM (via <em>danielsz/cohere-clojure</em>).</p>
<p>Having access to different LLMs is not sufficient for autonomous agent execution. LLM Service components need to have well-defined input/output shapes for the agent to work with. Bosquet started adding schema definitions (done with <em>metosin/malli</em>) to declare the model&rsquo;s capabilities and data formats (initial development stage).</p>
<h4 id="chat-mode-support">Chat mode support</h4>
<p>Bosquet had a gap in its functionality by not supporting chat mode. Now supported and based on <em>ChatML</em>. Chat mode benefits from existing Bosquet prompt management facilities, like <em>Selmer</em> templating, and <em>Pathom</em> based template chaining.</p>
<h4 id="memory">Memory</h4>
<p>A critical component for further Bosquet development and coming up with a satisfactory architecture is proving to be hard. The current Bosquet release declares the Memory system that jacks into AI completion workflow to record AI interactions and inject relevant recalled memories into the prompt context.</p>
<p>Memory is implemented via Clojure protocols to enable pluggable memory storage, memory recall, and memory encoding algorithms. As part of the current release, a SimpleMemory is added. It uses an in-memory atom for storage and the most recent memory access recall.</p>
<h3 id="documentation">Documentation</h3>
<p>Bosquet already covers different and complex concepts of working with LLMs. It has accumulated out-of-order documents, descriptions that are obscure, or superseded. To address the lack of good Bosquet work explanations, I have started preparing a new documentation site <a href="https://zmedelis.github.io/bosquet/">https://zmedelis.github.io/bosquet/</a>
<br></p>
<hr>
<h1 id="clojure-camp-daniel-higginbotham">Clojure Camp: Daniel Higginbotham</h1>
<p>2023 Q2 Funding Report 3. Published 17 October 2023</p>
<p>Since our last update, we have continued exploring ways to partner with industry leaders to facilitate the process of connecting junior developers with Clojure jobs. We have a roadmap for engaging with partners over the next couple months, which will we be publicly sharing in the coming weeks.</p>
<p>Additionally, we&rsquo;ve spent significant time exploring options to incorporate paid training in our offerings. The motivation for this was to find ways to develop Clojure Camp more sustainably. We decided that, for the near future, we want to focus our efforts on our vision of fostering a free, welcoming, friendly, and diverse peer learning community.</p>
<p>In addition to this organizational, administrative work, we&rsquo;ve continued running our weekly study group sessions and improving our learning materials.</p>
<p>Finally, a piece of awesome news: one of our campers has landed a Clojure job! This is his her first programming job, and we are so thrilled for her!</p>
<p>Thank you, Clojurists Together, for your support in doing this work!  <br></p>
<hr>
<h2 id="deps-try-gert-goet">Deps-try: Gert Goet</h2>
<p>2023 Q3 Funding Report 1. Published 18 October 2023.</p>
<p>I&rsquo;ve been working on recipe functionality for deps-try (a tool to quickly try out Clojure libraries on rebel-readline).</p>
<p>I worked out a POC to explore what it would entail. The majority of the time went into working out some gnarly Java interop related to JLine&rsquo;s history classes.</p>
<p>With this hurdle taken, and having worked out most of the options and flags for the CLI, I&rsquo;m currently turning the POC into code for the mainline.<br>
I&rsquo;m looking forward to replace example code in some of my other projects, with a simple oneliner, e.g. <code>deps-try --recipe malli-select/intro</code>.</p>
<h3 id="planned-future-work">Planned future work</h3>
<ul>
<li>Listing recipes: Showing a table with all the recipes from the repository.</li>
<li>Allowing for recipe shortnames: Instead of providing a full url/path, just say <code>deps-try --recipe malli/data-generation</code>.</li>
<li>Having a <code>--recipe-ns</code> to only get the ns-form from the recipe in your history for when you only want the deps and the requires but nothing else in the history.</li>
<li>Turn some guides from clojure.org into recipes</li>
</ul>
<h3 id="potential-directions">Potential directions</h3>
<ul>
<li>Having repositories with recipes: This would allow for using shorter names to load recipes also for non-builtin recipes.</li>
<li>Supporting jvm-options and custom mvn-repositories: As this has potential security implications, this would best be combined with (trusted) repositories.</li>
<li>A repository can have a TRYME file which functions as a recipe</li>
</ul>
<p>Keep an eye on the <a href="https://github.com/eval/deps-try/releases/tag/unstable">unstable releases</a> the coming weeks if you want to testdrive the new functionality!  <br></p>
<hr>
<h2 id="gdl-michael-sappler">GDL: Michael Sappler</h2>
<p>2023 Q3 Funding Report 1. Published 15 October 2023.</p>
<p>What I have done in the last 1.5 months:</p>
<h3 id="gdlhttpsgithubcomdamngdl"><a href="https://github.com/damn/gdl">GDL</a></h3>
<ul>
<li>extended scene2d API
<ul>
<li>scene2d.ui is a simple&amp;powerful GUI library included in libgdx.
Example apps using it: <a href="https://hyperlap2d.rednblack.games/">hyperlap2d</a>, <a href="http://esotericsoftware.com/">spine</a>.</li>
<li>now 3 namespaces: <code>gdl.scene2d.ui</code> / <code>gdl.scene2d.actor</code> / <code>gdl.scene2d.stage</code> instead of <code>gdl.ui</code> (before).</li>
</ul>
</li>
<li>use <a href="https://github.com/kotcrab/vis-ui">vis-ui</a> for the scene2d GUI widgets (a java library advanced functionality based on top of libgdx.scene2d.ui ).</li>
<li>some simplifications/refactorings.</li>
<li>next goal: remove the global states and make code more functional.</li>
</ul>
<h3 id="cyber-dungeon-questhttpsgithubcomdamncyber-dungeon-quest"><a href="https://github.com/damn/Cyber-Dungeon-Quest">Cyber Dungeon Quest</a></h3>
<ul>
<li>together with the GDL scene2d API I have started developing the &lsquo;property-editor&rsquo; for all the game properties like creatures, items, weapons, spells, etc. This required changes to consolidate the different properties into one <code>.edn</code> file and namespace.</li>
</ul>
<p><img src="https://raw.githubusercontent.com/damn/Cyber-Dungeon-Quest/master/Screenshot%202023-10-15%20at%2012.34.37%20PM.png" alt=""></p>
<ul>
<li>a lot of cleanup/refactoring (the first version of the game I wrote 10 years back as a student so there is a lot of old code still included )</li>
<li>the next task is to refactor &lsquo;modifiers&rsquo; and &lsquo;effects&rsquo; to make them data-based and editable too, and also to remove a lot of global state and make the code here also more functional.  <br></li>
</ul>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>2023 Q3 Funding Report 1. Published 15 October 2023.</p>
<p>For the past month and a half, I&rsquo;ve been building out jank&rsquo;s support for
<code>clojure.core/require</code>, including everything from class path handling to
compiling jank files to intermediate code written to the filesystem. This is a
half-way report for the quarter.</p>
<h2 id="high-level-requirements">High level requirements</h2>
<h3 id="class-paths">Class paths</h3>
<p>Clojure JVM benefits a great deal from being built upon an existing VM. In the
native world, we don&rsquo;t have things like class paths. Maybe the closest things
would be include paths at compile-time and <code>LD_LIBRARY_PATH</code> at run-time, but
neither of those capture the flexibility of JVM&rsquo;s class paths, which work at both
compile-time and run-time.</p>
<p>So, to start with, jank needs a similar system. This is a common pattern for
jank, requiring me to implement not just Clojure, but a VM of my own, with the
necessary parts to reach parity.</p>
<h4 id="progress">Progress</h4>
<p>I&rsquo;ve built out class path traversing for jank, which supports both directories
and JAR files. This will allow jank to work out of the box with Clojure&rsquo;s
existing Maven dependencies and file structures, which is of course important.</p>
<p>jank traverses the class path exhaustively on startup and caches what it finds,
mapping the module name (ns name or ns name with a nested class, like
<code>clojure.core$foo</code>) to the relevant file. When a function like <code>require</code> or
<code>compile</code> is called, jank will find the most relevant source to work with.</p>
<h3 id="core-functions">Core functions</h3>
<p>There are a handful of related <code>clojure.core</code> functions for module loading, like
<code>require</code>, <code>compile</code>, <code>load-libs</code>, <code>load-lib</code>, <code>load-one</code>, <code>load-all</code>, <code>alias</code>, etc. The next step, after having class path support, is to implement these.</p>
<h4 id="progress-1">Progress</h4>
<p>I have a working implementation of <code>(require 'clojure.core)</code> and <code>(compile 'clojure.core)</code> now! They hook into the class path work and do the necessary work to require or compile. Compilation writes files to a particular directory, which is also in the class path. Requiring a module which is already loaded will not do anything.</p>
<p>There&rsquo;s still a lot of work to do to build out the necessary core functions and
have them work the same as in Clojure JVM. The implementations of <code>require</code> and
<code>compile</code> that I have right now only accept a single symbol, rather than
being variadic, supporting lib specs, flags, etc. So this is still an MVP, right
now, but it works!</p>
<h3 id="class-files">Class files</h3>
<p>There&rsquo;s no such thing as a class file in the native world. Maybe the closest
equivalent would be an object file or, for C++20, a pre-compiled module. Those
are both more limiting than a class file, though, since they&rsquo;re not portable;
compiled native code is generally targeting a specific platform/architecture.
Trying to share these in a Maven dependency, for example, is only going to help
those who are on the same hardware as you. Even then, we can run into ABI
Incompatibilities.</p>
<p>So, while I&rsquo;m interested in exploring support for intermediate object files and
pre-compiled modules, I&rsquo;m starting with intermediate files being just C++ source
(which is what the jank compiler outputs for Cling to JIT compile). From there,
another step toward machine code will be to target LLVM IR by having Clang
compile the C++ source first. This is closer to JVM byte code, but LLVM IR is
actually still platform/architecture specific!</p>
<p>Lastly, I&rsquo;m very hesitant to provide a default of jank dependencies coming in as
binary files, even if I can solve the portability problem, simply due to supply
chain security concerns. I would rather live in a world where people share
source dependencies with pinned versions and transparent updates. I do think
that binary intermediate files make sense for local development, though, and
they can greatly speed up iteration.</p>
<h4 id="progress-2">Progress</h4>
<p>As of now, I have <code>(compile 'clojure.core)</code> compiling jank source to C++ source,
which is being written to the class path. If you then later try to
<code>(require 'clojure.core)</code>, it will be loaded from the compiled C++ source.
If the C++ source was on the class path already, it will be favored over the
jank source.</p>
<p>One benefit of this implementation is that jank developers can include
arbitrary C++ source along with their jank source and just <code>require</code> it
alongside everything else. In order to work with this, the C++ source just needs
to follow a particular interface.</p>
<p>A challenge I ran into with this is how to manage module dependencies. For
example, if <code>clojure.core</code> depends on <code>clojure.core$take</code>, which depends on a
local fn its own, <code>clojure.core$take$fn_478</code>, I need to ensure that all of these
are loaded in order of deepest dependency (leaf node) first. I went back on forth
on the design for this, but ultimately settled on something <em>similar</em> to what
Clojure does.</p>
<p>I generate two C++ source modules for <code>clojure.core</code> itself. One
is something like <code>classes/clojure.core.cpp</code> and the other is a special
<code>classes/clojure.core__init.cpp</code>. When <code>clojure.core</code> is required, it will look
for a <code>clojure.core__init</code> module first. Within that module is a special
interface with an <code>__init</code> function which has a big list of all of the
dependencies needed to actually load <code>clojure.core</code>. The <code>__init</code> function will
just iterate through that list and load each one.</p>
<p>Finally, we can actually load <code>clojure.core</code>, which runs the top-level effects of creating all of the vars, the value for each being based on new types brought in from the dependencies.</p>
<p>This is different from Clojure, since the JVM has a standard way for one module
to depend on another. That dependency is just conveyed, like using <code>import</code> in Java, and then the JVM ensures all dependencies are met before getting to the body of the module. Again, I need to reimplement that portion of the JVM for jank since the native world has no equivalent feature.</p>
<h3 id="whats-remaining">What&rsquo;s remaining</h3>
<p>Iterative compilation (tracking source timestamps to know how much to
recompile) and support for reloading have not been touched yet. Aside from that,
most things I have implemented are quite rough and need further polish to meet
parity with Clojure. Although I have <code>require</code> and <code>compile</code> working in the
simple case, none of the other related core functions have been implemented.</p>
<h3 id="performance-wins-so-far">Performance wins so far</h3>
<p>By pre-compiling <code>clojure.core</code> to C++ source, and then just requiring it on startup, the time it takes to boot the jank compiler + runtime and print hello world dropped from 8.7 seconds to 3.7 seconds. So that was all time spent compiling jank code to C++ code. What remains is almost entirely just time compiling C++. If I remove <code>clojure.core</code> loading altogether, it takes less than 0.2 seconds to run the same program. I&rsquo;ll be digging more into the performance here, as I get more implemented, but I want to call out a couple of things.</p>
<ol>
<li>We&rsquo;ve already cut 5 seconds down, which is great!</li>
<li>Everyone knows that compiling C++ is <em>not fast</em> and we are set up to be able
to start loading LLVM IR instead, after some more work</li>
<li>The creator of Cling informed me that LLVM tends to spend around 50% of its
time in the front-end for C++, which means that by using LLVM IR we&rsquo;ll be
cutting down our compilation time by around 50%</li>
<li>I haven&rsquo;t done any startup time benchmarking or profiling for jank yet, but if
there&rsquo;s time this quarter, you can bet that I&rsquo;ll be digging deep into this</li>
</ol>
<p>I have some exciting plans for visualizing jank&rsquo;s performance, both the compiler
and your application code, in a way which will ship with the compiler itself.
More info on this in a later post.  <br></p>
<hr>
<h2 id="uncomplicate-neanderthal-dragan-duric">Uncomplicate Neanderthal: Dragan Duric</h2>
<p>2023 Q3 Funding Report 1.  Published 30 September 2023.</p>
<p>My goal with this round is to polish Uncomplicate libraries (mainly Neanderthal, Deep Diamond, ClojureCUDA, ClojureCL, ClojureCPP), rather than develop new functionality.</p>
<p>In this round, I&rsquo;ve done lots of Deep Diamond coding related to the port to JavaCPP. This enabled me to refresh my memory of how the very detailed and complex internal works, and to check and update many old tests, and write some, but not many, new tests. I am approaching the point where I would be able to
say that all code is ported to JavaCPP pointers, and only then I&rsquo;ll be able to work on documentation.</p>
<p>Here&rsquo;s a breakdown of what I&rsquo;ve been able to work on, regarding the proposed items:</p>
<ul>
<li>Do a thorough re-visiting of existing code in major Uncomplicate libraries: I&rsquo;ve been able to re-visit many parts of this code, and did a lot of check and fixes. Still a lot left to be done.</li>
<li>Read the code without rushing to implement new features: I haven&rsquo;t been able to do it without implementing new features yet.</li>
<li>Write more tests for edge cases: I&rsquo;ve worked on this, but not as much as I hoped. Still a lot of work in front of me in this regard.</li>
<li>Discover bugs and fix them: Discovered a fair amount, fixed most, but not all.</li>
<li>Discover places where code could be improved (without rushing the new functionality). I&rsquo;ve improved many parts of code, but without the benefit of not rushing to the new functionality. When I complete the JavaCPP switch of Deep Diamond, I&rsquo;ll be able to do it in this manner.</li>
<li>Re-visit documentation and improve it to better match the current state of Uncomplicate libraries: It has to wait for at least a few more weeks.</li>
<li>If opportunities arise, implement some new functionality based of all the aforementioned items: I&rsquo;ve done this here and there.</li>
</ul>
<p>I hope that in the next few weeks I&rsquo;ll be able to stabilize the JavaCPP-based Deep Diamond (DNNL engine port is complete, but cuDNN needs more work) and that then I&rsquo;ll be able to do a systematic pass of testing/bugfixing/documentation writing.  <br></p>
<hr>
<h2 id="quil-jack-rusher-and-charles-comstock">Quil: Jack Rusher and Charles Comstock</h2>
<p>2023 Q3 Funding Report 1.  Published 30 September 2023.</p>
<p>So far, we&rsquo;ve managed to:</p>
<ul>
<li>update all dependencies to the latest versions of Processing (4.3) and p5js (1.7.0), including packaging native deps for all major OSes</li>
<li>re-wrote the build system using <code>deps.edn</code> and <code>build.clj</code></li>
<li>created a new test harness that allows side-by-side testing for Clojurescript (p5js) and Clojure (Processing)</li>
<li>got that test harness working with CLJS in a headless browser on Github CI 🎉</li>
</ul>
<p>These changes resolve the primary barriers to using Quil &ndash; requiring a deprecated version of the JVM (Java 8) in order to render OpenGL sketches, and incompatibility with the new Apple M1 architecture &ndash; and pave the way for easier maintenance moving forward. We still need to migrate a number of existing manual tests to the new test harness to improve overall coverage, but it&rsquo;s a good foundation to build on. In the long run, this should reduce the difficulty of accepting new contributions and in cutting future releases.</p>
<p>Sam Aaron has added one of us to the Clojars organization for Quil, so we&rsquo;re hoping to publish a <code>SNAPSHOT</code> of the current state of Quil on October 8 to facilitate wider user testing. There are a few breaking changes in terms of visual output that we&rsquo;ve observed in our own sketches, but everything seems to mostly work, and Jack used this version of Quil to prepare slides for his talk at Strange Loop/Papers We Love Conference in September without problems.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2023 Annual Meeting and Election Results</title>
      <link>https://www.clojuriststogether.org/news/2023-annual-meeting-and-election-results/</link>
      <pubDate>Mon, 09 Oct 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2023-annual-meeting-and-election-results/</guid>
      <description>RSVP for your Zoom Link</description>
      <content:encoded><![CDATA[<br>
Greetings Clojurists!
<p>On behalf of the board, I am happy to announce that the board election results are in. With almost 30% of the membership submitting ballots, we have two returning board members - <strong>Daniel Compton</strong> and <strong>Heather Moore-Farley</strong>. Our two new board members are <strong>Felix Barbalet</strong> and <strong>Max Penet</strong>. Congratulations to all - and thanks to everyone who volunteered. The new board positions are for 2-year terms.</p>
<p>Also a huge thanks to our departing board members <strong>Chris Nuernberger</strong> and <strong>Ikuru Kanuma</strong> for their commitment to Clojurists Together and time spent supporting our developers and their projects.</p>
<p>Please join us at the Annual Members Meeting this week - <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+Members+Meeting&amp;iso=20231010T10&amp;p1=224&amp;ah=1">10th of  October, 10 a.m. Pacific Time</a>. <strong>For an email reminder that includes the Zoom link, please use <a href="https://docs.google.com/forms/d/e/1FAIpQLSdPg4bHzqBlhA0CdMERQPS-X9UXuJWrdeNCBcB1jslumZ3m0A/viewform">this form</a>.</strong></p>
<p>Any questions, feel free to contact me at <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a></p>
<p>Looking forward to seeing you at the meeting.</p>
<p>Kathy Davis
Program Manager</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Announcing 2023 Board Nominations</title>
      <link>https://www.clojuriststogether.org/news/announcing-2023-board-nominations/</link>
      <pubDate>Wed, 27 Sep 2023 14:09:25 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/announcing-2023-board-nominations/</guid>
      <description>Clojurists Together Members Can Now Vote for the Next Board Members.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is in the process of <a href="https://www.clojuriststogether.org/news/2023-board-nominations-and-our-annual-meeting/">electing new board members</a> to fill the four volunteer positions that are expiring this year. These positions are for two-year terms.</p>
<p>The board is responsible for governing the organization,  selecting and administering the projects that are sponsored,  and interacting with sponsors. It also facilitates decision-making and implementation for the future plans of Clojurists Together.</p>
<p>We received 7 applications from the Clojure Community. 2 are from current board members who would like to continue to serve. All of the candidates are talented Clojurists that we would love (and be honored) to have on our board.</p>
<p>The board has nominated all 7 candidates for the current board election (in alphabetical order of first names):</p>
<ul>
<li>Chip Nowacek</li>
<li>Daniel Compton (current Treasurer/Secretary)</li>
<li>Felix Barbalet</li>
<li>Heather Moore-Farley (current board member)</li>
<li>Job Samwel Gateri Abellu</li>
<li>Max Penet</li>
<li>Vincenzo Chianese</li>
</ul>
<h3 id="next-steps">Next Steps</h3>
<p>All current Clojurists Together Members should have received a link to their ballot to vote via email. If you haven&rsquo;t received a ballot by 3rd October (and you&rsquo;ve checked your spam folder to see if it&rsquo;s hiding there), please contact <a href="mailto:kdavis@clojuriststogether.org">kdavis@clojuriststogether.org</a>.</p>
<p>Voting will close on 7th October at midnight Pacific Time. The top four candidates, as voted on by members will win. We will announce the winners shortly afterward and you&rsquo;ll be able to meet them at the Annual members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+Members+Meeting&amp;iso=20231010T10&amp;p1=224&amp;ah=1">10 am Pacific time, October 10, 2023</a>.</p>
<p><strong>Your Vote is Important!! Please Vote!</strong></p>
<h2 id="meet-the-candidates">Meet the Candidates</h2>
<h3 id="chip-nowacek">Chip Nowacek</h3>
<p><a href="https://clojurians.slack.com/archives/C0218CKTVEK/p1692842517062129">https://clojurians.slack.com/archives/C0218CKTVEK/p1692842517062129</a></p>
<p><strong>Company:</strong> Two Stewards, LLC.</p>
<p><strong>Why you would like to join:</strong> The community has been so supportive. I want to give back where I can. I have no other ambitions. I don&rsquo;t really know enough or have time enough to have any.<br>
<strong>A short bio:</strong> Building a chatbot interface to a knowledge graph using the full Clojure/Script/Datomic stack. Using the tech because of the community ethos.<br></p>
<hr>
<h3 id="daniel-compton">Daniel Compton</h3>
<p><a href="http://github.com/danielcompton">http://github.com/danielcompton</a><br>
<a href="https://twitter.com/danielwithmusic">https://twitter.com/danielwithmusic</a></p>
<p><strong>Company:</strong> Whimsical</p>
<p><strong>Why you would like to join:</strong> <br>
I am a co-founder of Clojurists Together. I have been involved with all of the funding rounds since the beginning and am currently the treasurer and secretary for Clojurists Together.</p>
<p><strong>A short bio:</strong> Daniel Compton is a software engineer, working at Whimsical. He lives in a small town in New Zealand with his family. He was the co-founder of Clojurists Together and has been deeply involved with running Clojurists Together since the beginning. <br></p>
<hr>
<h3 id="felix-barbalet">Felix Barbalet</h3>
<p><a href="https://github.com/xlfe">https://github.com/xlfe</a><br>
<a href="https://psithur.com/blog/building-psithur-connect/">https://psithur.com/blog/building-psithur-connect/</a></p>
<p><strong>Company:</strong>  Qantas Airways Ltd (Australia)</p>
<p><strong>Why you would like to join:</strong> I&rsquo;ve been using Clojure professionally for 3+ years now, and currently lead a team of Clojure engineers. Clojure has been the continuation of a life-long learning journey for me, and I don&rsquo;t see that slowing down. The kind of things I&rsquo;m interested in are figuring out how to raise the profile of Clojure as a smart choice for large enterprises all the way down to startups, and to help reduce the barriers to entry to Clojure as a profession. I want to see Clojure continue to grow and I&rsquo;d love to see more corporate support to bring Clojure to more people.</p>
<p><strong>A short bio:</strong> I&rsquo;ve spent 15 years working as a technologist in a range of roles including analytics, data science, data engineering, software architecture and software engineering. I have experience across highly-regulated industries (Government), consulting and startups. I have a B Economics (Honours) with specialisation in advanced econometrics, statistics, game-theory and behavioral economics and a graduate certificate in Cyber Security. <br></p>
<hr>
<h3 id="heather-moore-farley">Heather Moore-Farley</h3>
<p><a href="https://github.com/tophat8855">https://github.com/tophat8855</a></p>
<p><strong>Why you would like to join:</strong> I&rsquo;ve been on the board for the past 2 years and can keep it up. I know the work of board meetings and prep follow-up isn’t glamorous, but is really important for organizations to feel like they are going somewhere, and for increasing a feeling of community. I think it can be easy to feel like a lone developer working on a project, but knowing groups like CT are supporting projects can alleviate that a bit. And CT can’t support projects without a committee.</p>
<p><strong>A short bio:</strong> Heather is a software engineer, knitter, and bicyclist. She has been coding with Clojure and Clojurescript full-time for 5 and a half years. In her 8 years of professional software development, she has both benefited from and contributed to open source projects. <br></p>
<hr>
<h3 id="job-samwel-gateri-abellu">Job Samwel Gateri Abellu</h3>
<p><a href="https://www.linkedin.com/in/job-s-27352545/">https://www.linkedin.com/in/job-s-27352545/</a></p>
<p><strong>Company:</strong> Ezra World</p>
<p><strong>Why you would like to join:</strong> I am excited about the opportunity to contribute to the Clojurists Together Committee for several reasons:</p>
<ul>
<li>Passion for Clojure: I have a deep passion for the Clojure programming language and its ecosystem.<br>
Over the years, I have developed a strong technical expertise in Clojure through hands-on experience. Joining the committee would allow me to actively participate in the Clojure community and support its growth, which has been a significant part of my professional and personal journey.</li>
<li>Eager to Contribute to Open Source: While I haven&rsquo;t yet contributed to open-source projects, I am genuinely eager to start. The mission of Clojurists Together resonates with me, and I see this as an opportunity to begin my journey of giving back to the open-source community, particularly within the Clojure ecosystem.</li>
<li>Commitment to Open Source: I firmly believe in the power of open source to drive innovation and solve complex problems collaboratively. Clojurists Together&rsquo;s mission of providing financial support to open-source Clojure projects aligns with my values. I am enthusiastic about contributing to the sustainability of these projects and ensuring they continue to thrive.</li>
</ul>
<p><strong>I believe I am a good fit because of:</strong></p>
<ul>
<li>Technical Expertise: I bring a strong technical background in Clojure and ClojureScript, with hands-on experience in developing and maintaining projects. My technical skills and familiarity with the ecosystem will enable me to assess project proposals effectively and provide valuable insights.</li>
<li>Strategic Thinking: I have a track record of strategic thinking and problem-solving, which I believe will be valuable when assessing project proposals and making decisions that align with Clojurists Together&rsquo;s goals and objectives.</li>
<li>Commitment and Dedication: I am dedicated to the long-term success of the Clojure community and the projects it supports. I understand the responsibilities that come with being a committee member, and I am committed to fulfilling them with dedication and integrity.<br>
In summary, my passion for Clojure, technical expertise, strategic thinking, and commitment to open source make me confident that I would be a valuable addition to the Clojurists Together Committee. While I haven&rsquo;t contributed to open-source projects before, I am eager to start this journey and actively participate in supporting the Clojure ecosystem. I look forward to the opportunity to work alongside fellow committee members to further the mission of Clojurists Together.</li>
</ul>
<p><strong>A short bio:</strong> I am Job Samwel Gateri Abellu, a dedicated Clojure enthusiast with over 6 years of experience in this elegant and functional programming language. My journey into the world of Clojure began when a friend sought my assistance on a project, sparking a profound interest that has grown with each passing year.</p>
<p>My educational background includes a degree in Information Technology, with a major in software development. This academic foundation, combined with my hands-on experience, has allowed me to cultivate a robust skill set in Clojure. Throughout my career, I have leveraged this expertise to tackle complex challenges and develop innovative solutions.</p>
<p>Notably, my professional journey has primarily unfolded within the dynamic FinTech industry. My experience in this sector has provided me with invaluable insights into the intersection of technology and finance, making me well-equipped to understand and contribute to projects that bridge these domains.</p>
<p>While I am relatively new to open-source contributions, my unwavering passion for the Clojure ecosystem and my commitment to continuous learning make me an eager advocate for its sustainability and growth. I bring strategic thinking and a deep dedication to open source, aligning seamlessly with Clojurists Together&rsquo;s mission.</p>
<p>If elected, I pledge to diligently collaborate with my fellow committee members to select and support projects that advance our shared goals, ensuring they continue to thrive and benefit the entire Clojure community. It is an honor to be considered for this role, and I am enthusiastic about the opportunity to make a meaningful impact on the Clojure community through Clojurists Together.  <br></p>
<hr>
<h3 id="max-penet">Max Penet</h3>
<p><a href="https://github.com/mpenet">https://github.com/mpenet</a><br>
<a href="https://twitter.com/mpenet">https://twitter.com/mpenet</a></p>
<p><strong>Company:</strong> Exoscale</p>
<p><strong>Why you would like to join:</strong> I would like to have more of an impact on the community. I generally quite like to help out when possible, via the various discussion channels. I have also been the recipient of such help numerous times and it&rsquo;s only fair I give back some of my time to help out. I think I might be a good fit given how long I have been involved in the community and how much I rely on the Clojure community to be healthy and thriving.</p>
<p><strong>A short bio:</strong> I currently work as a software engineer for Exoscale, a European cloud provider that relies heavily on Clojure. I have been involved in the Clojure community and using Clojure professionally for more than a decade now, in various fields. I authored, contributed, and maintain a number of open-source libraries. I also tend to keep an eye on what&rsquo;s happening at the community level almost daily, trying to be helpful when I can. More importantly, I really appreciate what CT is doing and would love to be able to help sustain that effort. <br></p>
<hr>
<h3 id="vincenzo-chianese">Vincenzo Chianese</h3>
<p><a href="https://www.linkedin.com/in/vncz/">https://www.linkedin.com/in/vncz/</a></p>
<p><strong>Company:</strong>  Microsoft</p>
<p><strong>Why you would like to join:</strong> Have been using Clojure for a long time (unfortunately not at work), but I have been sitting in multiple committees (technical and not) and worked in technology for a long time. I have spoken to a lot of conferences and would love to help spread Clojure methodologies around.</p>
<p><strong>A short bio:</strong> Vincenzo Chianese is an Italian Software Developer currently working as API Architect for Microsoft. He has been working in the API space for almost 10 years from building tools for API developers and architecting big systems. <br></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>July and August 2023 Long Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/july-and-august-2023-long-term-project-updates/</link>
      <pubDate>Fri, 15 Sep 2023 10:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-and-august-2023-long-term-project-updates/</guid>
      <description>Check out the latest from our funded developers</description>
      <content:encoded><![CDATA[<p>Even though it was vacation season, our developers share their progress (and challenges) for an incredible outpouring of work on their 2023 long term projects! Check it out.</p>
<p><a href="#calva-peter-stromberg">Calva: Peter Stromberg</a><br>
<a href="#carmine-v4-peter-taoussanis">Carmine V4: Peter Taoussanis</a><br>
<a href="#ciderrepl-bohzidar-batsov">CIDER/REPL: Bohzidar Batsov</a><br>
<a href="#clj-kondo-babashka-nbb-sci-cherry-squint-michiel-borkent">clj-Kondo, babashka, nbb, SCI, Cherry, Squint: Michiel Borkent</a><br>
<a href="#clojar-docorg-sean-corfield">Clojar-doc.org: Sean Corfield</a><br>
<a href="#clojars-toby-crawley">Clojars: Toby Crawley</a><br>
<a href="#clojuredart-christophe-grande">ClojureDart: Christophe Grande</a><br>
<a href="#clojure-lsp-eric-dallo">Clojure-lsp: Eric Dallo</a><br>
<a href="#humble-ui-nikita-prokopov">Humble UI: Nikita Prokopov</a><br>
<a href="#malli-tommi-reiman">Malli: Tommi Reiman</a><br>
<a href="#shadow-cljs-thomas-heller">Shadow-cljs: Thomas Heller</a><br>
<br></p>
<hr>
<h2 id="calva-peter-stromberg">Calva: Peter Stromberg</h2>
<p>These two months were not just about Calva. 😀</p>
<h3 id="calva">Calva</h3>
<p>The biggest change was one I thought would be really tiny. We upgraded our dependency on cljfmt, and it got to be a much bigger change than I had expected. cljfmt had changed its configuration format, and it was a bit of work to figure out how to adapt Calva&rsquo;s formatter to this. What made matters much worse is that I initially missed this configuration change and released a quite broken version of Calva. Doing something that already is a bit tricky in fire fighting mode is not making it easier. Or nicer. Wonderful then to notice that Calva and Clojure users had my back. I got some really wonderful help. I&rsquo;m working in the best community imaginable.</p>
<p><strong>Some more changes:</strong></p>
<ul>
<li>Support for workflows involving Fiddle Files, of <a href="https://clojuredesign.club/episode/014-fiddle-with-the-repl/">Clojure Design Podcast fame</a>, was added. Please let us know if you use this support and how you fare with it!</li>
<li>Improve nREPL message diagnostics.</li>
<li>Fixing issues around shadow-cljs REPL start and connect</li>
<li>Restructure and complement the docs around using Calva with shadow-cljs</li>
<li>Improvements with evaluating expressions inside Rich Comment Forms</li>
<li>Improvements in how the nREPL server collects output side effects from the REPL process, following CIDER&rsquo;s model</li>
<li>Improvements in the handling of, and messaging around, clojure-lsp binary downloads</li>
</ul>
<h3 id="lingy">Lingy</h3>
<p>When testing and providing feedback on the development of <a href="https://github.com/lingy-lang/lingy">Lingy, a new Clojure implementation running on Perl</a>, I wanted to be able to connect Calva to the Lingy REPL. So that caused me to start and participate in the development of a <a href="https://github.com/lingy-lang/lingy#nrepl-support">Lingy nREPL server</a>. Now users of Calva, and any other nREPL client, can interact with their Lingy application from the editor. (Yes, so this was partly about Calva 😄.)<br></p>
<hr>
<h2 id="carmine-v4-peter-taoussanis">Carmine V4: Peter Taoussanis</h2>
<h3 id="open-source-update">Open source update</h3>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="/sponsors">other sponsors</a> of my open source work!</p>
<h3 id="recent-work">Recent work</h3>
<p>This was a productive couple of months! Managed to dedicate 100% of my time to open source. Recent work includes:</p>
<ul>
<li><a href="https://www.taoensso.com/clojure/news">14 library updates</a>, including pre-releases for major updates to <a href="https://github.com/taoensso/nippy/releases/tag/v3.3.0-RC1">Nippy</a> and <a href="https://github.com/taoensso/carmine/releases/tag/v3.3.0-RC1">Carmine</a>.</li>
<li>Significant improvements to all <strong>library documentation</strong> are underway, including:
<ul>
<li>Cross-platform API docs via a <a href="https://github.com/taoensso/codox">Codox fork</a> (work also <a href="https://github.com/weavejester/codox/issues/216">submitted upstream</a>).</li>
<li>Improved compatibility with <a href="https://cljdoc.org/">clj-doc</a>. Thanks to <a href="https://github.com/lread">Lee Read</a> for assistance with some <a href="https://github.com/cljdoc/cljdoc/issues/779">upstream improvements</a> &amp; troubleshooting advice 🙏.</li>
<li>After much experimentation, I&rsquo;ve settled on new tooling and a new workflow for writing documentation.  This&rsquo;ll allow me to much more easily write and maintain docs moving forward.  The first change that will be apparent is the move to a wiki format (<a href="https://github.com/taoensso/sente/wiki">example</a>) that allows more structure and easier searching.</li>
<li>Relatedly- I&rsquo;ve started updating and expanding all pre-existing docs, with a focus on more beginner-oriented info. I&rsquo;m tackling this in steps, so it&rsquo;ll take some time to migrate and update everything.</li>
</ul>
</li>
<li>I&rsquo;ve moved all my open source under a dedicated <a href="https://github.com/taoensso">GitHub group</a> to help keep things organized and more easily searchable.</li>
<li>I&rsquo;ve updated my homepage to include <a href="https://www.taoensso.com/clojure">better info</a> on my open source - including <a href="https://www.taoensso.com/clojure/news">release news</a>.</li>
<li>I&rsquo;ve started added basic GraalVM compatibility (and tests) to all libraries. Many are already covered, the rest will be covered whenever they get their next release.</li>
<li>(Just for fun) - I made a <a href="https://github.com/http-kit/http-kit/blob/master/http-kit-logo.png">new logo</a> for <a href="https://www.taoensso.com/http-kit">http-kit</a>.</li>
<li>I&rsquo;ve been deep in experimentation on a new telemetry library that I&rsquo;m quite excited about. I&rsquo;ll have more to share on this in future, but in the meantime I can say that I&rsquo;m very happy with how the initial prototype is coming along 👍</li>
</ul>
<h3 id="upcoming-work">Upcoming work</h3>
<p>My current <a href="https://www.taoensso.com/clojure/roadmap">roadmap</a> includes:</p>
<ul>
<li><strong>September</strong>: stable <a href="https://www.taoensso.com/nippy">Nippy</a> v3.3 and <a href="https://www.taoensso.com/carmine">Carmine</a> v3.3 releases.</li>
<li><strong>October</strong>: first public release of <a href="https://www.taoensso.com/tempel">Tempel</a>, a new <strong>data security framework</strong> that I plan to talk more about closer the time.</li>
</ul>
<p>I&rsquo;ll also be continuing work on the new telemetry library (currently named <a href="https://www.taoensso.com/telemere">Telemere</a>), and on the ongoing documentation improvements. - <a href="https://www.taoensso.com">Peter Taoussanis</a> <br></p>
<hr>
<h2 id="ciderrepl-bohzidar-batsov">CIDER/REPL: Bohzidar Batsov</h2>
<p>The last couple of months were very productive for CIDER and all of its related projects. This was mostly due to our long-term contributor <code>vemv</code> being between jobs and eager to tackle some of the major items on our TODO list. I&rsquo;ve decided to use a sizeable chunk of the donation money CIDER had accumulated over at OpenCollective to fund <code>vemv</code>&rsquo;s work on CIDER &amp; friends, and the results were great. Some highlights:</p>
<ul>
<li>We&rsquo;ve got a brand new and much improved <a href="https://github.com/clojure-emacs/enrich-classpath">https://github.com/clojure-emacs/enrich-classpath</a> Now CIDER support using <code>enrich-classpath</code> with Clojure&rsquo;s CLI (<code>tools.deps</code>) as well.</li>
<li>The test runner now has a fail-fast mode and shows timing information about the tests</li>
<li>We finally started to make use of Clojure 1.10&rsquo;s improved error message. (see <a href="https://github.com/clojure-emacs/cider/issues/3418">https://github.com/clojure-emacs/cider/issues/3418</a>) This prevents stacktraces from showing up whenever the <a href="https://clojure.org/reference/repl_and_main#_at_repl">:clojure.error/phase</a> indicates that it&rsquo;s a compilation error.</li>
<li>Add new customization variable <code>cider-clojurec-eval-destination</code> to allow specifying which REPL CLJC evals are sent to.</li>
<li>CIDER can now infer the indentation for many macros, without the need to provide indentation metadata for them (similar to how SLIME works for Common Lisp)</li>
<li>There have been many small improvements around the ClojureScript support</li>
</ul>
<p>We&rsquo;ve also did a big cleanup of the backlog and got the open issues under 100 for the first time in quite some time!</p>
<p>There are also a ton of other small improvements and bug-fixes that have been implemented in those two months. I encourage everyone to check the full list of changes <a href="https://github.com/clojure-emacs/cider/blob/master/CHANGELOG.md#master-unreleased">here</a>. All this work is the reason why CIDER 1.8 is still not out - we want to pack more into this release before we focus on CIDER 2.0</p>
<p>Right now it seems that CIDER 1.8 will be the biggest and most important CIDER release in the past 2-3 years! The release should happen any day now (this time for real)!</p>
<p>On an unrelated note - <code>clojure-ts-mode</code> is now available on NonGNU ELPA. Its submission there triggered a few long conversations about potentially including <code>clojure-mode</code> and/or <code>clojure-ts-mode</code> in Emacs itself. It&rsquo;s a complex topic that we&rsquo;ll be discussing with the <code>clojure-emacs</code> maintainers and our users in the months to come.</p>
<p>That&rsquo;s all I have for you today! I expect to write a few more detailed blog posts on some of the topics I mentioned here once CIDER 1.8 has been released. <br></p>
<hr>
<h2 id="clj-kondo-babashka-nbb-sci-cherry-squint-michiel-borkent">clj-Kondo, babashka, nbb, SCI, Cherry, Squint: Michiel Borkent</h2>
<p><strong>Sponsors</strong>
I&rsquo;d like to thank all the sponsors and contributors that make this work possible!
Top sponsors:<br>
•	<a href="https://clojuriststogether.org/">Clojurists Together</a><br>
•	<a href="https://roamresearch.com/">Roam Research</a><br>
•	<a href="https://nextjournal.com/">Nextjournal</a><br>
•	<a href="https://toyokumo.co.jp/">Toyokumo</a><br>
•	<a href="https://www.cognitect.com/">Cognitect</a><br>
•	<a href="https://kepler16.com/">Kepler16</a><br>
•	<a href="https://www.adgoji.com/">Adgoji</a></p>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!<br>
•	<a href="https://github.com/sponsors/borkdude">Github Sponsors</a><br>
•	The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective<br>
•	<a href="https://ko-fi.com/borkdude">Ko-fi</a><br>
•	<a href="https://www.patreon.com/borkdude">Patreon</a><br>
•	<a href="https://www.clojuriststogether.org/">Clojurists Together</a></p>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.<br>
On to the projects that I worked on in July!</p>
<h3 id="july-updates">July Updates</h3>
<ul>
<li><strong><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>:</strong> static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>A big fat new release: 2023.07.23. Several new linting rules and lots of fixes. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20230713">changelogs</a> here.</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/http-client">http-client</a>:</strong> Babashka&rsquo;s http-client
<ul>
<li>Added a websocket API, a fix for the :ssl-context {:insecure true} option and more. See <a href="https://github.com/babashka/http-client/blob/main/CHANGELOG.md">CHANGELOG</a>.</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>:</strong> babashka filewatcher pod
<ul>
<li>The events emitted from the file watcher are now automatically deduplicated.</li>
<li>An aarch64 binary for Mac is now available Thanks to @fjsousa and @lispyclouds.</li>
</ul>
</li>
<li><strong><a href="https://github.com/borkdude/edamame">edamame</a>:</strong> Configurable EDN/Clojure parser with location metadata
<ul>
<li>A small bugfix release around reading malformed reader conditional expressions</li>
</ul>
</li>
<li><strong><a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a>:</strong> a leiningen plugin for clj-kondo
<ul>
<li>This plugin now follows the version number of clj-kondo</li>
</ul>
</li>
<li><strong><a href="https://github.com/squint-cljs/squint">squint</a>:</strong> CLJS syntax to JS compiler and <a href="https://github.com/squint-cljs/cherry">cherry</a> Experimental ClojureScript to ES6 module compiler
<ul>
<li>Add <a href="https://github.com/squint-cljs/squint/blob/main/doc/defclass.md">defclass</a> in squint, inspired by shadow-cljs</li>
<li>More work on getting squint and cherry to work in one build</li>
<li>Provide UMD build which works better in Firefox Webworkers</li>
<li>cherry can now be used in a playground at <a href="https://dev.livecodes.io/?template=clojurescript">livecodes.io</a></li>
<li>Fix doseq and add doall and dorun in squint</li>
</ul>
</li>
<li><strong><a href="https://github.com/borkdude/lein2deps">lein2deps</a>:</strong> leiningen to deps.edn converter
<ul>
<li>Allow anonymous function literals in project.clj</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/babashka">babashka</a>:</strong> native, fast starting Clojure interpreter for scripting.
<ul>
<li>Version 1.3.182 released, mostly library bumps and small bugfixes. See changelogs <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#13182-2023-07-20">here</a>.</li>
</ul>
</li>
<li><strong><a href="https://github.com/borkdude/deps.clj">deps.clj</a>:</strong> A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>More robust handling of downloading and unzipping tools jar</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/scittle">scittle</a>:</strong> Execute Clojure(Script) directly from browser script tags via SCI
<ul>
<li>Fixed a small bug with evaluating tags: when there would be whitespace + a &ldquo;src&rdquo; attribute, the whitespace would be executed and the attribute was ignored.</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and <a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>:</strong>
<ul>
<li>This EXPERIMENTAL combo allows you to use tools.build from babashka. In this release a reflection issue was addressed.</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/nbb">nbb</a>:</strong> Scripting in Clojure on Node.js using SCI
<ul>
<li>Add missing function to promesa</li>
</ul>
</li>
<li><strong><a href="https://github.com/borkdude/jet">jet</a>:</strong> CLI to transform between JSON, EDN, YAML and Transit using Clojure
<ul>
<li>Release version 0.7.27 (see <a href="https://github.com/borkdude/jet/blob/master/CHANGELOG.md#0727-2023-08-02">changelogs</a>) with missing 1.11 functions and options for easier kebab/camel/etc. casing.</li>
</ul>
</li>
</ul>
<p><strong>Other projects:</strong><br>
These are (some of the) other projects I&rsquo;m involved with but little activity in July.  Click for more details:</p>
<ul>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Support :require-macros</li>
<li>Introduce eval-string+ which received an optional initial :ns key and also returns the last active :ns so you can preserve the namespace state over multiple evaluations.</li>
<li>Released v0.8.40</li>
</ul>
</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub- processes
<ul>
<li>Implement :out :bytes to receive output as bytes (thanks Hans Bugge Grathwohl)</li>
<li>Make :dir option accept java.nio.file.Path</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</li>
<li><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure<br>
Published: 2023-08-02</li>
</ul>
<h3 id="august-updates">August Updates</h3>
<p>In August, my attention was mostly directed at the upcoming <a href="https://www.thestrangeloop.com/2023/babashka-a-meta-circular-clojure-interpreter-for-the-command-line.html">Strange loop</a> talk. I&rsquo;m very excited to be part of the last iteration of this conference. It will also be my first time flying to the USA!</p>
<p>Rahul De and Anupriya Johari will be giving a workshop at JavaZone on Tuesday the 5th of September. Check the details <a href="https://2023.javazone.no/program/19a5cab3-7afd-4dc1-b60a-bea8562d3186">here</a>.</p>
<p>Here are updates about the projects/libraries I&rsquo;ve worked in August:</p>
<ul>
<li><strong><a href="https://github.com/borkdude/jet">jet</a>:</strong> CLI to transform between JSON, EDN, YAML and Transit using Clojure
<ul>
<li>Release version 0.7.27 (see <a href="https://github.com/borkdude/jet/blob/master/CHANGELOG.md#0727-2023-08-02">changelogs</a>) with missing 1.11 functions and options for easier kebab/camel/etc. casing.</li>
</ul>
</li>
<li><strong><a href="https://github.com/borkdude/quickdoc">quickdoc</a>:</strong> Quick and minimal API doc generation for Clojure
<ul>
<li>No update in quickdoc, but happy to see that Github have resolved a bug on their side with local anchors in HTML, which quickdoc relies on</li>
<li>Require clojure 1.11 as the minimal clojure version</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/sci.configs">sci.configs</a>:</strong> A collection of ready to be used SCI configs.
<ul>
<li>Worked together with <a href="https://github.com/niwinz">@niwinz</a> to make sci.configs upgradable to promesa 10 and 11. Many thanks to Andrey for making promesa backward-compatible again, since sci.configs relies on Clojure libraries to be always upgradable without breaking changes.</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/nbb">nbb</a>:</strong> Scripting in Clojure on Node.js using SCI.
<ul>
<li>Bumped sci.configs and promesa</li>
</ul>
</li>
<li><strong><a href="https://github.com/borkdude/deps.clj">deps.clj</a>:</strong> A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>The tools jar relocated to Github releases so deps.clj was updated to this new location, with backward compatibility.</li>
<li>Per my request, Alex added a .sha256 file to Github releases so the downloaded jar file could be verified against corruption</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/sci">SCI</a>:</strong> Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Clojure compatibility: allow (def foo/foo 1) in namespace foo</li>
<li>Clojure compatibility: reset file metadata on var when it&rsquo;s re-evaluated from other file</li>
<li>Add sci.async/eval-form and sci.async/eval-form+</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/babashka">babashka</a>:</strong> native, fast starting Clojure interpreter for scripting.
<ul>
<li>expose sci.core in babashka</li>
<li>Asahi linux support (linux on Apple m1/m2)</li>
<li>Several other library upgrades and Clojure compatibility fixes</li>
<li>Compatibility with the newest integrant version</li>
</ul>
</li>
<li><strong><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>:</strong> A babashka pod for interacting with sqlite3
<ul>
<li>Upgrade sqlite version so it supports json fields</li>
</ul>
</li>
<li><strong><a href="https://github.com/squint-cljs/cherry">cherry</a></strong>
<ul>
<li>Add <a href="https://github.com/squint-cljs/squint/blob/main/doc/defclass.md">defclass</a> to cherry (similar to squint)</li>
<li>Expose clojure.string and clojure.walk namespaces</li>
<li>Fix overriding core vars</li>
</ul>
</li>
<li><strong><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>:</strong> static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>working towards a new release with a large number of small bug fixes, see upcoming <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">changelog</a></li>
</ul>
</li>
<li><strong>http-client](<a href="https://github.com/babashka/http-client):">https://github.com/babashka/http-client):</a></strong> babashka&rsquo;s http-client
<ul>
<li>A number of small bugfixes and additions</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in August. Click for more details.</p>
<ul>
<li><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>: babashka filewatcher pod</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</li>
<li><a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a>: a leiningen plugin for clj-kondo</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS syntax to JS compiler and <a href="https://github.com/squint-cljs/cherry">cherry</a> Experimental ClojureScript to ES6 module compi</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a> and <a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a></li>
</ul>
<h3 id="other-projects-1">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but with little or no activity in July and August. Click for more details.</p>
<ul>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</li>
<li></li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/babashka/book">babashka.book</a>: Babashka manual</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a></li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://borkdude.github.io/clj2el/">clj2el</a>: transpile Clojure to elisp</li>
<li><a href="https://github.com/borkdude/deflet">deflet</a>: make let-expressions REPL-friendly!</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter</li>
<li><a href="https://github.com/borkdude/deps.add-lib">deps.add-lib</a>: Clojure 1.12&rsquo;s add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI<br>
Published: 2023-08-30</li>
</ul>
<p>Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a>  Discuss these posts <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.  To see previous <a href="https://blog.michielborkent.nl/tags/oss-updates.html">posts</a> go here.<br></p>
<hr>
<h2 id="clojar-docorg-sean-corfield">Clojar-doc.org: Sean Corfield</h2>
<p>In my <a href="https://corfield.org/blog/2023/06/30/long-term-funding-3/">previous Long-Term Funding update</a>
I said I would review/overhaul the &ldquo;ecosystem&rdquo; and &ldquo;tutorials&rdquo; sections.</p>
<h3 id="on-a-personal-note">On a personal note&hellip;</h3>
<p>I ended the previous update with a personal note but I&rsquo;m going to start this
update with one. It&rsquo;s been a very difficult couple of months. My mother
passed away in early July (on my birthday!) and much of the month involved
a lot of back and forth with the funeral home in England and family around
the world. My wife &amp; I attended the service via Zoom at the end of July and then
it took some additional time to get the service booklet and recording
distributed to family and friends.</p>
<p>Then in early August, both my wife and I got COVID-19 &ndash; after three and a
half years of avoiding it, and having all our shots and boosters. My wife
tested positive soon after symptoms started and got paxlovid. I had all the
same symptoms too, but kept testing negative until I was outside the window for
paxlovid &ndash; and then started testing positive. It took about two weeks for us
both to test negative reliably. We&rsquo;re both still recovering from the fatigue
and brain fog but every day is an improvement. Wear your masks, folks, and
get all your shots and boosters!</p>
<p>Consequently, I didn&rsquo;t get as much done as I&rsquo;d hoped in the past two months.</p>
<h3 id="clojure-docorg"><code>clojure-doc.org</code></h3>
<p>I incorporated feedback from the community on the <code>tools.build</code> cookbook.
Many thanks, in particular, to <a href="https://github.com/phronmophobic">@phronmophobic</a>
who provided extensive feedback and Pull Requests!</p>
<p>I reviewed the &ldquo;ecosystem&rdquo; and &ldquo;tutorials&rdquo; sections but only so far as to
remove outdated content. I reviewed and updated the main <strong>Content</strong> page
to reflect the current state of the site, reordering sections and removing
outdated content.</p>
<p>Feedback from the community suggested that I should
review sections in a different order to my initial plan,
so I turned my attention to the &ldquo;language&rdquo;
section and updated the following pages from Clojure 1.5 to Clojure 1.11:</p>
<ul>
<li><a href="https://clojure-doc.org/articles/language/functions/">Language: Functions</a></li>
<li><a href="https://clojure-doc.org/articles/language/core_overview/">Language: clojure.core</a></li>
<li><a href="https://clojure-doc.org/articles/language/collections_and_sequences/">Language: Collections and Sequences</a></li>
<li><a href="https://clojure-doc.org/articles/language/namespaces/">Language: Namespaces</a></li>
<li><a href="https://clojure-doc.org/articles/language/interop/">Language: Java Interop</a></li>
<li><a href="https://clojure-doc.org/articles/language/polymorphism/">Language: Polymorphism</a></li>
</ul>
<p>In some cases that just meant double-checking the code examples still worked
as shown, but in other cases it meant updating the examples to use newer
functions, adding new examples showing alternative approaches that are now
possible, or changing the error messages shown to match the current behavior
(since Clojure 1.10 did a lot to improve error messages).</p>
<p>I still need to make additional passes over several of these pages to address
the remaining &ldquo;TBD&rdquo; items (mostly adding more examples).</p>
<h3 id="honeysql">HoneySQL</h3>
<p>Several complicated changes were made to HoneySQL this period, leading to the
<a href="https://github.com/seancorfield/honeysql/releases/tag/v2.4.1066">2.4.1066 release</a>,
which included the first pass at supporting temporal queries, and reworking
how <code>:insert-into</code>, <code>:columns</code>, and <code>:values</code> work together which should
make it easier to avoid generating invalid SQL as well as making it easier
to extend HoneySQL to support additional features around <code>INSERT</code> statements.</p>
<h3 id="polylith">Polylith</h3>
<p>The <a href="https://github.com/polyfy/polylith">Polylith project</a>
(and documentation) was still using my old (archived) <code>build-clj</code>
wrapper so I worked on a Pull Request to switch everything to plain
<code>tools.build</code> usage as a better example for the community. That has been
merged in and updated documentation will be released soon (on cljdoc.org
instead of GitBook!).</p>
<h3 id="clj-new"><code>clj-new</code></h3>
<p>This project also still used <code>build-clj</code> so I updated all the project
templates to use <code>tools.build</code> directly and released version
1.2.404 so that, going forward, newly-generated projects will be better
examples for the community. <code>deps-new</code> had previously been updated to
generate projects using <code>tools.build</code> directly.</p>
<h3 id="clj-commons"><code>clj-commons</code></h3>
<p>Information about CLJ Commons governance was spread across the
<a href="https://clj-commons.org"><code>clj-commons</code></a> website and the
<a href="https://github.com/clj-commons/meta"><code>meta</code></a> repository&rsquo;s <code>README</code>
and other pages.
Based on some community feedback in June, I wanted to consolidate
that information and bring it up to date.</p>
<p>As I started on that, I realized that the
<a href="https://clj-commons.org/projects.html"><code>clj-commons</code> project list</a>
was very outdated so I decided to regenerate it (there&rsquo;s a
<a href="https://github.com/clj-commons/clj-commons.github.io/blob/master/src/clj_commons/projects.clj">Clojure script</a>
for this). That uncovered a number of projects that were missing either the
<code>ORIGINATOR</code> file in the root of the repo (how <code>clj-commons</code> identifies the
original author of a project) or the <code>.github/CODEOWNERS</code> file that lists
the current active maintainers.</p>
<p>I went through every <code>clj-commons</code> repo and added the missing files,
updated the <code>projects.clj</code> script to support <code>#</code> comments in <code>CODEOWNERS</code>,
and regenerated the <code>projects.html</code> page.</p>
<p>Finally, I consolidated and updated the information about how CLJ Commons accepts and maintains
projects, and updated the <code>README</code> in the <code>meta</code> repo to reflect that this
information is all on the main website now:</p>
<ul>
<li><a href="https://clj-commons.org/accepting-projects.html">Accepting projects into clj-commons</a></li>
<li><a href="https://clj-commons.org/maintaining-projects.html">Maintaining projects in clj-commons</a></li>
</ul>
<h2 id="whats-next">What&rsquo;s Next?</h2>
<p>In September/October, I&rsquo;m hoping to complete a review and update of the
&ldquo;tutorials&rdquo; and &ldquo;ecosystem&rdquo; sections of clojure-doc.org, and then in the
remaining period, I&rsquo;ll tackle the &ldquo;cookbooks&rdquo; section and make another
pass of &ldquo;TBD&rdquo; items in the &ldquo;language&rdquo; section.</p>
<p>:tags &ldquo;clojure&rdquo; &ldquo;clojure-doc.org&rdquo; &ldquo;honeysql&rdquo; &ldquo;clj-commons&rdquo; &ldquo;open source&rdquo; &ldquo;community&rdquo; &ldquo;clojurists together&rdquo; &ldquo;polylith&rdquo;
<br></p>
<hr>
<h2 id="clojars-toby-crawley">Clojars: Toby Crawley</h2>
<p><strong>Commit Logs:</strong> <a href="https://github.com/clojars/clojars-web/compare/5fdef58b17d710fdf6b2ea886a520c84e45af624...0a5eb2175e7b417fc9e64bcb6fb87f6d15cbddbc"><code>clojars-web</code></a>, <a href="https://github.com/clojars/infrastructure/compare/5d2811bdfd95cf1320af2a2bea2fed2ce0cf9b87...ad8335b312a81567a4c78ef4fe1587741794534c"><code>infrastructure</code></a></p>
<p>I took this month to clean up some long-standing issues:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/issues/659">Fixed an issue with error reporting from the repository routes</a></li>
<li><a href="https://github.com/clojars/clojars-web/issues/563">Include release date for each version in feed.clj</a></li>
<li><a href="https://github.com/clojars/clojars-web/issues/564">Include scm tag for each version in feed.clj</a></li>
<li><a href="https://github.com/clojars/clojars-web/issues/823">Require MFA group wide to deploy</a></li>
</ul>
<p>And a few quality-of-life improvements:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/0d33a469744f71aa965eac40c6a9cdebd44edefa">Add denylist to email sender</a></li>
<li><a href="https://github.com/clojars/clojars-web/pull/872">Migrate from project.clj to deps.edn</a></li>
<li><a href="https://github.com/clojars/clojars-web/commit/0a5eb2175e7b417fc9e64bcb6fb87f6d15cbddbc">Upgraded to latest clj-kondo for code linting</a></li>
</ul>
<p>The <a href="https://github.com/clojars/clojars-web/blob/main/CHANGELOG.org">CHANGELOG file</a> also covers any user-facing changes.</p>
<p>Note: this report is also available on <a href="https://tcrawley.org/clojars-worklog/2023/index.html#aug-2023">tcrawley.org</a> <br></p>
<hr>
<h2 id="clojuredart-christophe-grande">ClojureDart: Christophe Grande</h2>
<h3 id="clojuredart">ClojureDart</h3>
<p>ClojureDart keeps to steadily get new users. <a href="https://www.youtube.com/watch?v=ziPIzvA60co">We got featured on a Youtube channel for Flutter devs</a>. Hopefully we increase the reach of Clojure both by allowing Clojurists to reach mobile/desktop but also by drawing more people to Clojure.</p>
<p>We are also glad to have received quality PRs adding missing functions or fixing divergences in the way things print.</p>
<p>We started working on a REPL (limited to Flutter apps for now), we expect to make it public in September.</p>
<p>The lack of multimethods begins to feel like a blocker for porting existing libs so it&rsquo;s another tppic we should address in the next two months/</p>
<p>Last, we keep publishing short videos on Youtube <a href="https://www.youtube.com/@clojuredart/shorts">https://www.youtube.com/@clojuredart/shorts</a> and we also started a newsletter on ClojureDart and nerdy stuff.</p>
<h3 id="fixes">Fixes</h3>
<p>Several fixes to the compiler, cljd.core or flutter.cljd. Amongst them:</p>
<ul>
<li>fix CI for Dart 2 which was broken by tests for records support (which are a Dart 3 feature)</li>
<li>allow destructuring in the arg list of protocol implementations</li>
<li>fix type-inference regression on a combination of <code>if</code> and <code>recur</code></li>
<li><code>*-array*</code> functions were not properly hinted</li>
<li>workaround for a Dart parser bug <a href="https://github.com/dart-lang/sdk/issues/52904">https://github.com/dart-lang/sdk/issues/52904</a></li>
<li>fix aliases in emitted code for when a protocol is extended from another namespace</li>
<li>fix hot reloading error when a protocol extension is removed &ndash; this issue and the previous one were triggered by the REPL work</li>
<li>make <code>set!</code> more robust (the implementation was a bit hacky and didn&rsquo;t perform some checks)</li>
<li><code>rseq</code> wasn&rsquo;t behaving properly on vectors whose size was a multiple of 32</li>
<li>some code was improperly optimized away when a <code>throw</code> appeared in some nested <code>if</code>s in statement position</li>
<li>widgets below a <code>:vsync</code> were not refresh on app state changes, only on animation updates</li>
<li>issues with <code>set!</code> expressions used in argument position</li>
<li>potential double evaluation when casting to a nullable type</li>
<li>&hellip;</li>
</ul>
<h3 id="improvements">Improvements</h3>
<ul>
<li>refactoring of the Subscribable protocol in <code>cljd.flutter</code> (breaking change but almost no users had implemented it) to simplify the handling of default values by pushing the responsibility to the consumer rather than to the producer.</li>
<li>support of namespaced maps in the reader (the cljd one used at runtime, not the clj one used to read source).</li>
<li><code>retriable</code>/<code>retry!</code>: <code>(retriable expr)</code> behaves a bit like <code>future</code>, except that:
<ul>
<li>its body is the one of a <code>try</code>, you can have <code>catch</code>es and <code>finally</code>: <code>(retriable expr (catch Object o st ...))</code></li>
<li>it can be retried by calling <code>retry!</code> on it &ndash; returning a future which yields when the current retry is done (completed or failed).
The intent is to allow to retry failed IO (or trigger refreshes) and be able to tie a spinner lifetime to the current try.</li>
</ul>
</li>
<li>the compiler now watches for changes into <code>:local/root</code> deps to ease codevelopment of libs and apps.</li>
</ul>
<h3 id="future-work">Future Work</h3>
<h3 id="clojuredart-1">ClojureDart</h3>
<ul>
<li>Publish the Flutter-only REPL</li>
<li>Multi-methods to allow some libs to be ported</li>
<li>Look into porting Datascript and SCI to ClojureDart</li>
<li>New APIs to leverage our persistent data structures:
<ul>
<li>maps (hash and sorted) in ClojureDart are original implementations (not the same as CLJ/CLJS)
<ul>
<li>hash maps could be seen as another refinement of the original, sorted maps constitute a novel implementation.</li>
</ul>
</li>
<li>Sorted colls should be good enough for direct use by Datascript.</li>
<li>Both hash and sorted maps can support accelerated merge/diff/join/etc. operations.</li>
</ul>
</li>
<li><code>cljd</code> CLI written in <code>cljd</code> for easier project creation etc.</li>
<li>gen tests</li>
<li>…<br></li>
</ul>
<hr>
<h2 id="clojure-lsp-eric-dallo">Clojure-lsp: Eric Dallo</h2>
<p>During this year I&rsquo;ve been working on clojure-lsp support for IntelliJ, it was the only mainstream editor that didn&rsquo;t have a good way to use clojure-lsp features, it was really hard to integrate with the LSP protocol because of Intellij&rsquo;s API but making the plugin in Clojure helped a little bit with that, so after a lot of work, I&rsquo;m excited and happy to announce <a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a>, a new plugin for IntelliJ to have all clojure-lsp features available!<br></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/efebc614-912d-4f69-b60d-d073154f134c" alt="eric dallo image"></p>
<h3 id="clojure-lsp-intellijhttpsgithubcomclojure-lspclojure-lsp-intellij"><a href="https://github.com/clojure-lsp/clojure-lsp-intellij">clojure-lsp-intellij</a></h3>
<h3 id="010---090">0.1.0 - 0.9.0</h3>
<ul>
<li>Avoid noisy exception after startup</li>
<li>Add <code>textDocument/codeAction</code> support. #3</li>
<li>Add support for refactorings via workspace/executeCommand. #4</li>
<li>Add support for textDocument/rename feature. #6</li>
<li>Add support for workspace/applyEdit. #7</li>
<li>Add support for LSP notification window/showMessage and request window/showMessageRequest.</li>
<li>Improve status bar to show icon instead of text.</li>
<li>Add troubleshooting section to &lsquo;Tools &gt; Clojure LSP&rsquo;</li>
<li>Add brace matcher for <code>[]</code>, <code>{}</code> and <code>()</code></li>
<li>Fix completion of items with <code>/</code></li>
<li>Add support for comments.</li>
<li>Add support for quote handlers.</li>
<li>Add support for completion. #2</li>
<li>Support find defintion of external dependencies. #1</li>
<li>Fix LSP startup messages to properly mention the task being done</li>
<li>Require plugin restart after install because of Clojure load in Classloader.</li>
<li>Support more intellij versions until 2021.3</li>
<li>Improvements to plugin compatibility</li>
<li>Support <code>initialize</code> and subsequent requests.</li>
<li>Support <code>textDocument/didChange</code>, <code>textDocument/didClose</code>, <code>textDocument/didOpen</code>.</li>
<li>Support <code>textDocument/hover</code>.</li>
<li>Support <code>textDocument/references</code>.</li>
<li>Support <code>textDocument/formatting</code>.</li>
<li>Support <code>textDocument/codeLens</code> and <code>codeLens/resolve</code>.</li>
<li>Add status bar with support for restarting server.</li>
</ul>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlight are performance and memory improvement, also we had formatting improvements to match latest cljfmt features.</p>
<h3 id="20230806-002806">2023.08.06-00.28.06</h3>
<p><strong>General</strong></p>
<ul>
<li>Fix truncation of namespaced keywords #1640</li>
<li>Add rewrite-clj node to cursor-info. - Fixing semantic-tokens, collons not managed by lsp anymore. #1550</li>
<li>Fix <code>:paths-ignore-regex</code> setting to consider settings reload</li>
<li>Bump clj-kondo to <code>2023.07.14-20230717.090255-3</code>. #1624</li>
<li>Fix inconsistencies with <code>:defined-by-&gt;lint-as</code></li>
<li>Improve memory usage during cache save, avoiding &ldquo;Out of memory&rdquo; exceptions.</li>
<li>Prevent file rename when a namespace is defined in multiple files #1574</li>
<li>Fix user formatting setting being override by :style/indent metadata in macros</li>
<li>Bump cljfmt to <code>0.11.2</code>. #1634</li>
<li>Bump lsp4clj to <code>1.8.1</code></li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>Avoid returning all known keywords on empty keywords completion for performance reasons.</li>
</ul>
<p><strong>API/CLI</strong></p>
<ul>
<li>Improve mem/cpu usage using less analysis for tasks.<br></li>
</ul>
<hr>
<h2 id="humble-ui-nikita-prokopov">Humble UI: Nikita Prokopov</h2>
<p>Last two months have been DataScript-focused. I’ve implemented a major new feature: pluggable durable storages. I’ve also wrote SQL adapter for them and migrated Grumpy Website to DataScript + SQLite to battle-test the implementation.</p>
<p>It has been working well so far (~2 weeks, lots of updates).</p>
<h3 id="datascripthttpsgithubcomtonskydatascript"><a href="https://github.com/tonsky/datascript">DataScript</a>:**</h3>
<ul>
<li>New incremental/lazy storage implementation. Store large databases on disk/in other DBs efficiently, load back only the parts you actually use, all completely transparent for user. It even has docs!</li>
<li><a href="https://github.com/tonsky/datascript-storage-sql">New SQL storage implementations</a>, supporting MySQL, PostgreSQL, H2 and SQLite.</li>
<li>Schema altering (compatible changes only) via <code>d/reset-schema!</code> or <code>d/with-schema</code></li>
<li>JVM: <code>branching-factor</code> can now be set per-database</li>
<li>New API: <code>d/find-datom</code>. Works like <code>d/datoms</code>, but only returns single datom and is faster than <code>(first (d/datoms ...))</code></li>
<li>CLJS: Optimized various parts of CLJS version related to compilation and index access</li>
<li>Do not throw from <code>d/touch</code> when finding hanging refs</li>
</ul>
<h3 id="grumpy-websitehttpsgithubcomtonskygrumpy"><a href="https://github.com/tonsky/grumpy/">Grumpy Website</a>:**</h3>
<ul>
<li>Migrate from storing posts in EDN to storing them in DataScript + persist in SQLite storage</li>
<li>Battle-test DataScript storage</li>
<li>Migrate from Component to Mount</li>
<li>Implement full-text search, powered by Lucene</li>
<li>Cross-post to Mastodon</li>
<li>Highlight mentions and tags in posts</li>
<li>Pagination, suggest, subscribe and about pages</li>
<li>Accumulate and render <a href="https://mastodon.online/@nikitonsky/110980158381537112">statistics</a></li>
</ul>
<h3 id="skijahttpsgithubcomhumbleuiskija"><a href="https://github.com/HumbleUI/Skija/">Skija</a>:</h3>
<ul>
<li>Catch up with current Skia version (m109 → m116, ~year of updates)</li>
<li>Extract library file atomically #54 #56 w/ @dzaima</li>
</ul>
<h3 id="humble-uihttpsgithubcomhumbleuihumbleui"><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a>:</h3>
<ul>
<li>OkLCH example</li>
<li>Fixed NPE in text-field undo #80</li>
<li>Non-macos Ctrl + X/C/V/Y #81</li>
</ul>
<h3 id="sublime-executorhttpsgithubcomtonskysublime-executor"><a href="https://github.com/tonsky/Sublime-Executor/">Sublime-Executor</a>:</h3>
<ul>
<li>Kill running process on Sublime exit</li>
<li>Strip away escape sequences from output</li>
<li>Better gitignore matching</li>
<li>Allow running any command on top of another one, implicitly killing previous one</li>
</ul>
<h3 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>:</h3>
<ul>
<li>Show file/line/column information when <code>clojure_sublimed_eval_code</code> fails</li>
</ul>
<h3 id="new-project--dark-mode-togglehttpsgithubcomtonskydarkmodetoggle">New project — <a href="https://github.com/tonsky/DarkModeToggle">Dark Mode Toggle</a>:</h3>
<ul>
<li>A simple menubar utility to quickly switch between dark and light modes <br></li>
</ul>
<hr>
<h2 id="malli-tommi-reiman">Malli: Tommi Reiman</h2>
<p>I was off the grid on July, back to OS on August.</p>
<h3 id="malli">Malli</h3>
<ul>
<li>Continued with the <a href="https://github.com/metosin/malli/issues/264">new effective type system</a> - WIP</li>
<li>Small fixes and reviews and released 0.12.0:</li>
</ul>
<h4 id="0120-2023-08-31">0.12.0 (2023-08-31)</h4>
<ul>
<li>FIX: retain order with <code>:catn</code> unparse, fixes <a href="https://github.com/metosin/malli/issues/925">#925</a></li>
<li><strong>BREAKING</strong>: Do not require timezone data directly for cljs <a href="https://github.com/metosin/malli/pull/898">#898</a> with <code>malli.experimental.time</code></li>
<li>Remove non-root swagger definitions <a href="https://github.com/metosin/malli/pull/900">#900</a></li>
<li>FIX: <code>malli.core/-comp</code> keeps interceptor order with long chains <a href="https://github.com/metosin/malli/pull/905">#905</a></li>
<li>FIX: <code>malli.dev/start!</code> exception does not contain source <a href="https://github.com/metosin/malli/issues/896">#896</a></li>
<li>FIX: don&rsquo;t add extra :schema nil to swagger :parameters <a href="https://github.com/metosin/malli/pull/939">#939</a></li>
<li>Add <code>:gen/return</code> support in malli.generator <a href="https://github.com/metosin/malli/pull/933">#933</a></li>
<li>Make uuid transformer to be case insensitive <a href="https://github.com/metosin/malli/pull/929">#929</a></li>
<li>Add <code>:default/fn</code> prop for default-value-transformer <a href="https://github.com/metosin/malli/pull/927">#927</a></li>
<li>Updated dependencies:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">borkdude/edamame <span style="color:#ae81ff">1.3</span>.20 -&gt; <span style="color:#ae81ff">1.3</span>.23
</code></pre></div><h3 id="reitit">Reitit</h3>
<ul>
<li>OpenApi3-support ended to be a a much bigger change than anticipated, still alpha</li>
<li>Got the <a href="https://github.com/metosin/reitit/pull/628">big refactor</a> done</li>
<li>Paired with <a href="https://github.com/opqdonut">Joel</a> on remaining issues &amp; reviewed lot of issues, soon&hellip;.</li>
</ul>
<h3 id="spec-tools">Spec-tools</h3>
<ul>
<li>First new release in 30 months! <a href="https://github.com/metosin/spec-tools/blob/master/CHANGELOG.md#0106-2023-08-28">0.10.6</a></li>
</ul>
<h3 id="something-else">Something else</h3>
<p>The coffee store is closed-look
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/2ed1848f-be0c-4a6f-94a3-14129c2601a7" alt="image"></p>
<hr>
<h2 id="shadow-cljs-thomas-heller">Shadow-cljs: Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.52.3 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<h3 id="blog-posts">Blog Posts</h3>
<p>Wrote a blog series about CLJS Frontend development alternatives to full Single Page Apps.</p>
<ul>
<li><a href="https://code.thheller.com/blog/shadow-cljs/2023/07/13/the-lost-arts-of-cljs-frontend.html">The Lost Arts of CLJS Frontend</a></li>
<li><a href="https://code.thheller.com/blog/shadow-cljs/2023/07/16/applying-the-art-of-cljs-frontend.html">Applying the Art of CLJS Frontend</a></li>
<li><a href="https://code.thheller.com/blog/shadow-cljs/2023/07/18/mastering-the-art-of-cljs-frontend.html">Mastering the Art of CLJS Frontend</a></li>
<li><a href="https://code.thheller.com/blog/shadow-cljs/2023/07/21/shadow-graft-a-case-study.html">shadow-graft: A Case Study</a></li>
</ul>
<h3 id="notable-updates">Notable Updates</h3>
<ul>
<li>Replaced the babel-js based ES Module -&gt; CommonJS rewriter, which is used for ESM based npm modules. This had been <a href="https://clojureverse.org/t/shadow-cljs-2-25-2-looking-for-testers/10206">planned for a long time</a> and was the only remaining part of shadow-cljs that actually required <code>node</code> at runtime. Now this is done entirely within the JVM, which as a side benefit got a bit faster. The old behavior is still available in case problems arise, but will be removed in the future.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>August 2023 Short Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/august-2023-short-term-project-updates/</link>
      <pubDate>Sat, 02 Sep 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/august-2023-short-term-project-updates/</guid>
      <description>Aleph, clj Nix, Clojure Camp, Clojure Cookbook, Donut, Jank, Lucene Grep, Neanderthal, Portfolio</description>
      <content:encoded><![CDATA[<p>Check out the latest from the shorter term projects we funded in Q1 and Q2 2023 and Q3 2022. We&rsquo;ve got updates from Christian Johansen, Daniel Higginbotham, Danius Jocas, Dragan Duric, Jeaye Wilkerson, José Luis Lafuente Esquembre, Kira McLean, and Matthew Davidson.</p>
<p>A quick reminder to seriously consider volunteering for a 2-year term on our board. We have 4 positions opening up this year. The deadline for submitting your name is Sept. 15. You can help us to support all the great work underway and continue to get the word out about the Clojurists Together funding opportunities and our awesome community. Find more information <a href="https://www.clojuriststogether.org/news/2023-board-nominations-and-our-annual-meeting">here</a>.<br></p>
<p><a href="#aleph-manifold-matthew-davidson">Aleph Manifold: Matthew Davidson</a><br>
<a href="#clj-nix-jos%C3%A9-luis-lafuente-esquembre">clj-Nix: José Luis Lafuente Esquembre</a><br>
<a href="#clojure-camp-daniel-higginbotham">Clojure Camp: Daniel Higginbotham</a><br>
<a href="#clojure-cookbook-kira-mclean">Clojure Cookbook: Kira McLean</a> <br>
<a href="#donut-daniel-higginbotham">Donut: Daniel Higginbotham</a> <br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a> <br>
<a href="#lucene-grep-dainius-jocas">Lucene Grep: Dainius Jocas</a><br>
<a href="#neanderthal-dragan-duric">Neanderthal: Dragan Duric</a> <br>
<a href="#portfolio-christian-johansen">Portfolio: Christian Johansen</a>  <br></p>
<h2 id="aleph-manifold-matthew-davidson">Aleph Manifold: Matthew Davidson</h2>
<p>Project Update: 31 August 2023<br>
Q1 2023 Funding Round: Report 3</p>
<h3 id="http2--server">HTTP/2 – server</h3>
<ul>
<li>Final HTTP/2 support on the server is now under review. The code is written, but the existing test suite is fragile and specific to the HTTP/1 code, so many tests still need updating.</li>
<li>Highlights
<ul>
<li>Massive refactoring and documentation improvements</li>
<li>HTTP/1 code adapted for independent HTTP/2 multiplexed streams
<ul>
<li>Much simplified core
<ul>
<li>prior connection state no longer required since streams are independent</li>
<li>client and server streams now similar enough that more code can be shared between them, unlike the HTTP/1 code</li>
</ul>
</li>
</ul>
</li>
<li>Application-level protocol negotiation (ALPN) now the default for all servers
<ul>
<li>specify which HTTP versions you support, and the server will pick as needed for incoming connections</li>
<li>falls back to HTTP/1 if needed</li>
</ul>
</li>
<li>Cleartext H2C supported on the server</li>
<li>Header and date code in hot loop (used literally every response) now optimized
<ul>
<li>Upgraded deps to Netty 4.1.96.Final, byte-streams 0.3.4</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="other-aleph-improvements">Other Aleph improvements</h3>
<ul>
<li>Added instructions to CONTRIBUTING on SSL/TLS certs and CA setup and debugging, which are vital for HTTP/2 work</li>
</ul>
<h3 id="planned-future-work">Planned future work</h3>
<ul>
<li>Straighten out the tests</li>
<li>Add compression support</li>
<li>Add more handler options for settings and window updates</li>
<li>Add multipart support
<ul>
<li>HTTP/2 doesn&rsquo;t need it, and unfortunately, Netty&rsquo;s HTTP2 code doesn&rsquo;t support it, but some people said they&rsquo;d like to keep using it to minimize disruption to their code base</li>
</ul>
</li>
<li>Add proxy support</li>
</ul>
<h3 id="potential-new-directions">Potential new directions</h3>
<ul>
<li>HTTP/3
<ul>
<li>Should be relatively easy (🤞), since the gap between HTTP/2 and 3 is much smaller than between 1 and 2. Would mostly need to handle the switch to QUIC/UDP.</li>
</ul>
</li>
<li>Flow control
<ul>
<li>HTTP/2&rsquo;s flow control mechanism was deprecated for complexity and disagreement between browsers, but not actually removed. We could add code to support this if people really wanted it. A better option would be to support HTTP/3&rsquo;s new flow control headers. <br></li>
</ul>
</li>
</ul>
<hr>
<h2 id="clj-nix-josé-luis-lafuente-esquembre">clj-Nix: José Luis Lafuente Esquembre</h2>
<p>Project Update: 30 August 2023<br>
Q2 2023 Funding Round: Report 2</p>
<p>In the second half of this funding round, I worked on making the project more user-friendly.</p>
<h3 id="new-documentation">New documentation</h3>
<p>I created a new website for the documentation:
<a href="https://jlesquembre.github.io/clj-nix/">https://jlesquembre.github.io/clj-nix/</a></p>
<h3 id="new-nix-module">New nix module</h3>
<p>I added the possibility of configuring the build using a nix module, see
<a href="https://jlesquembre.github.io/clj-nix/nix-module/">clj-nix Module</a>.</p>
<p>The nix module is marked as experimental, but usable. It&rsquo;s the way I recommend
using <code>clj-nix</code>, since it hides the project internals. If you already are a
<code>clj-nix</code> user, you can continue calling <code>mkCljBin</code> and related functions. Under
the hood, the module calls those functions, and I&rsquo;ll continue maintaining the
<a href="https://jlesquembre.github.io/clj-nix/api/">functional API</a>.</p>
<p>I&rsquo;ll continue working on the module interface, feel free to
<a href="https://github.com/jlesquembre/clj-nix/issues">open an issue on GitHub</a> to
share any feedback.</p>
<h3 id="maintenance">Maintenance</h3>
<p>I also spent some time fixing some bugs and doing some minor improvements, see the
<a href="https://github.com/jlesquembre/clj-nix/pulls?q=is%3Apr+is%3Aclosed+created%3A2023-07-14..2023-09-01">full list on GitHub</a> <br></p>
<hr>
<h2 id="clojure-camp-daniel-higginbotham">Clojure Camp: Daniel Higginbotham</h2>
<p>Project Update: 31 July 2023<br>
Q2 2023 Funding Round: Report 2</p>
<p>At Clojure Camp we continue to build our materials for mentors and students and to hold a study group. We’ve also begun reaching out to industry stakeholders and mentors to shape a long-term roadmap for this effort that increases the likelihood that participants will be able to find paid work.</p>
<h3 id="accomplishments-include">Accomplishments include:</h3>
<ul>
<li>Continuing weekly study group sessions</li>
<li>Building out <a href="https://currmap.clojure.camp/">https://currmap.clojure.camp/</a>, a clear path for learning Clojure</li>
<li>Made more progress on setting up our operations</li>
<li>Started industry outreach, looking for partners that can help on both the jobs side and on the marketing side <br></li>
</ul>
<hr>
<h2 id="clojure-cookbook-kira-mclean">Clojure Cookbook: Kira McLean</h2>
<p>Project Updates: 1 June and 2 September 2023<br>
Q3 2022 Funding Round: Reports 2 &amp; 3</p>
<p><strong>Report 2:</strong>
The last few months of development on the Clojure Data Cookbook have been focused on filling out the main reasons for the book, which have been translated in to some of the introductory chapters, as well as implementing more of the examples that are the core of the book. Whilst development has been slower than I would like due to the nature of being an adult with a hectic life, I&rsquo;m excited about the progress that&rsquo;s been made and look forward to polishing the first three chapters over the summer. Some specific work that&rsquo;s been done in this last phase includes:</p>
<ul>
<li>Sub-chapters 2.2 and 2.3 have been filled out more, along with more of the introductory part of the book. Examples for working with different types of databases are implemented as well as ones for exporting data from a notebook. Commits including this output are available on github.</li>
<li>Much effort has gone into coming to a consensus within the community around what default data science &ldquo;stack&rdquo; to implicitly endorse by its inclusion and usage in the book. We&rsquo;ve settled on tablecloth for tabular data processing, Hanami for data visualisation, Neanderthal for math, along with several other libraries that are emerging as the &ldquo;standard&rdquo; ones for certain tasks working with data in Clojure.</li>
<li>This, and much of the thought that went into the introductory chapters, was mostly what formed the core of the talk I gave at the conj this year. More of the libraries that will be used are on slide 6 in the talk.</li>
<li>An initial solution for publishing the book online has been implemented. I&rsquo;ll want to improve the process as updates are published more regularly, but for now a basic skeleton of the book website is available online here: <a href="https://scicloj.github.io/clojure-data-cookbook/">https://scicloj.github.io/clojure-data-cookbook/</a> (URL is likely to change for the final version, this one should work from June 1, 2023 for at least few months.)</li>
</ul>
<p><strong>Report 3:</strong>
In the last couple of months I&rsquo;ve made progress toward completing the contents of the cookbook, but I&rsquo;ve had to admit to myself that I took on more than I could realistically do in my spare time. Despite my best efforts there is still much work to be done compiling the book into a consumable format.</p>
<p>I will continue this work indefinitely and still plan on finishing this project, but the demands of work and other commitments on my time have meant that progress is slower than I would have hoped on this side project.</p>
<p>For now, the information is mostly complete and, with help from the community, best practices for performing a variety of data manipulation and analysis tasks are now documented in the cookbook repo. These are not filled in yet with prose or detailed explanations and not organized in a way that would be ideal to consume for someone who wasn&rsquo;t already comfortable navigating a Clojure codebase. But progress has definitely been made. The contents of the first three chapters are ready to be edited into a consumable format &ndash; the examples are written, the code works, and the steps are documented. The next task on my list is organizing all of the code into sensible sections with explainer text surrounding them so that the book can be published somewhere online.<br></p>
<hr>
<h2 id="donut-daniel-higginbotham">Donut: Daniel Higginbotham</h2>
<p>Project Update: 6 August 2023<br>
Q1 2023 Funding Round: Report 3</p>
<p>Since the last update I&rsquo;ve made progress on creating an auth plugin. There are implementations in place for cookie-based auth and a Sign In With Google button. The next step is to abstract these for more general usage.<br>
Per-repo changes include:</p>
<h3 id="donut-partyendpointhttpsgithubcomdonut-partyendpoint"><a href="https://github.com/donut-party/endpoint">donut-party/endpoint</a></h3>
<ul>
<li>
<p><strong>Re-worked the implementation of ring middleware</strong>
I had been using the ring-defaults library to compose a foundational
middleware stack but I found it too difficult to debug. The middleware are all
configured as donut components so that it&rsquo;s easier to inspect what middleware
are being used and what their configurations are, and so that there&rsquo;s a
consistent interfact for changing middleware options.</p>
</li>
<li>
<p><strong>Cookie session store component</strong>
Added a donut component that lets you configure a cookie session store</p>
</li>
</ul>
<h3 id="donut-partyemailhttpsgithubcomdonut-partyemail"><a href="https://github.com/donut-party/email">donut-party/email</a></h3>
<p>A new library that provides a helper for constructing emails independent of
whatever email service you use. Features include:</p>
<ul>
<li>Use text and HTML email templates for email body</li>
<li>Use text template for email subject</li>
<li>Set global options (like :from) and easily override those options</li>
<li>Parameterizes the email sending function so you can replace it with a mock in
tests</li>
<li>Parameterizes template rendering function so you can use something other than
selmer if you want</li>
</ul>
<h3 id="donut-partyfrontendhttpsgithubcomdonut-partyfrontend"><a href="https://github.com/donut-party/frontend">donut-party/frontend</a></h3>
<ul>
<li>Added <code>load-script</code> helper function for asynchronously loading js scripts</li>
<li>Updated form handling so that you can set initial form values adjacent to the
form&rsquo;s components, as opposed to having to set the values via a re-frame
dispatch</li>
<li>Handle auth and identity concerns</li>
<li>Created a frontend route writer, compiling frontend routes to a cljc file so
that the backend can access the routes</li>
</ul>
<h3 id="donut-partysystemhttpsgithubcomdonut-partysystem"><a href="https://github.com/donut-party/system">donut-party/system</a></h3>
<ul>
<li>Introduced registry refs. This allows components to refer to each other using
a registry name, as opposed to an absolute path in the system. Useful for
plugin development.</li>
<li>Added a mock-component helper which can be used to mock function components.
In cases where your component initializes to a function (e.g. <code>send-email</code>),
you can now easily mock those components for tests. The mock function records
arguments for test comparisons, and you can set the value it should return.</li>
</ul>
<p>I appreciate the support of Clojurists Together and the donut community!<br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Project Update: 26 August 2023<br>
Q2 2023 Funding Round: Report 2</p>
<p>The terms of this work were to research a new object model for jank, with the goal
of optimizing allocations, while also making jank code faster across the board.
This is my second and final report and I&rsquo;m excited to share my results!</p>
<p>Please note that I have a very detailed breakdown of my results, with several
more graphs, here: <a href="https://jank-lang.org/blog/2023-08-26-object-model/">https://jank-lang.org/blog/2023-08-26-object-model/</a></p>
<p>To briefly summarize, this quarter I:</p>
<ul>
<li>Prototyped a new object model for jank</li>
<li>Ported the whole jank compiler and runtime to the new object model</li>
<li>Benchmarked thoroughly and continuously</li>
</ul>
<h3 id="overall-ray-tracing-speeds">Overall ray tracing speeds</h3>
<p>I&rsquo;m very pleased to report that <strong>jank is now nearly twice as fast at running the same ray tracing code as Clojure JVM</strong>,
with jank clocking in at 36.96ms versus Clojure&rsquo;s 69.44ms. Since jank was only
marginally faster than Clojure at the start of the quarter, this also means the
improvements in the past quarter have been nearly 2x overall.</p>
<object type="image/svg+xml" data="https://jank-lang.org/img/blog/2023-08-26-object-model/ray-tracing.plot.svg" width="50%">
  <img src="https://jank-lang.org/img/blog/2023-08-26-object-model/ray-tracing.plot.svg" width="50%"></img>
</object>
<h3 id="other-runtime-objects">Other runtime objects</h3>
<p>Maps, vectors, and strings have all seen performance improvements to both
allocations and usage. Some improvements were marginal, while others were in the
2x region. My full post linked above goes more into detail and talks about
potential future gains.</p>
<h3 id="fast-math">Fast math</h3>
<p>Math has sped up the most out of anything, which bodes very well for our ray
tracing numbers. Here are the results for fully boxed subtraction, where no
type info is known, subtraction between an unknown box and an unboxed
double, and fully unboxed subtraction. In all cases, jank is now significantly
faster than Clojure JVM. These wins apply across the board for all binary math
operations.</p>
<object type="image/svg+xml" data="https://jank-lang.org/img/blog/2023-08-26-object-model/boxed-sub.plot.svg" width="50%">
  <img src="https://jank-lang.org/img/blog/2023-08-26-object-model/boxed-sub.plot.svg" width="50%"></img>
</object>
<h3 id="thank-you">Thank you!</h3>
<p>Thank you, Clojurists Together, for sponsoring this work. jank has climbed quite
the mountain of performance gains to now challenge the JVM in these benchmarks.</p>
<p>This is the last performance-oriented bout of work for a while. jank is where it
needs to be, I think, in order for me to start investing more in pushing the
compiler and runtime features closer to parity with Clojure JVM.</p>
<p>I&rsquo;m very happy to know that Clojurists Together is sponsoring jank development
<em>again</em>, for the upcoming quarter. The sponsored work will be focused on
building out jank&rsquo;s module system, implementing <code>clojure.core/require</code>,
preparing for iterative compilation, and setting the stage for AOT compilation
and leiningen integration.</p>
<p>After this work, using jank for multi-file projects will be possible. Soon after
that, I hope, we can start using leiningen to manage jank projects. This will
mean adventurous devs can start actually using jank themselves, which I expect
will only add to the momentum I currently have. <br></p>
<hr>
<h2 id="lucene-grep-dainius-jocas">Lucene Grep: Dainius Jocas</h2>
<p>Project Update: 1 September 2023<br>
Q2 2023 Funding Round: Report 2</p>
<p>The highlight of this update is the release of the <a href="https://github.com/dainiusjocas/lucene-monitor">lucene-monitor</a> Clojure library.</p>
<p><code>lucene-monitor</code> is a Clojure wrapper around the <a href="https://lucene.apache.org/core/9_7_0/monitor/org/apache/lucene/monitor/package-summary.html">Apache Lucene Monitor framework</a>.
I&rsquo;ve tried to make the library simple to get started and flexible <strong>when</strong> needed.
<code>lucene-monitor</code> provides a pretty tasty data-driven API and, given my recent interest in Clojure transducers, a transducer compatible API.
Check it out and let me know what you think!</p>
<h3 id="updates">Updates</h3>
<p>As of now, 4 Clojure libraries are extracted out of the <code>lucene-grep</code>:</p>
<ul>
<li><a href="https://github.com/dainiusjocas/lucene-monitor">lucene-monitor</a>: a wrapper for the Lucene Monitor framework;</li>
<li><a href="https://github.com/dainiusjocas/lucene-custom-analyzer">lucene-custom-analyzer</a>: data-driven builder for Lucene Analyzers;</li>
<li><a href="https://github.com/dainiusjocas/lucene-query-parsing">lucene-query-parsing</a>: data-driven builder of Lucene Query Parsers;</li>
<li><a href="https://github.com/dainiusjocas/lucene-text-analysis">lucene-text-analysis</a>: helpers to experiment with the Lucene Analyzers.</li>
</ul>
<p>All these libraries were updated to the newest Lucene version.</p>
<h3 id="other-things-ive-worked-on">Other things I&rsquo;ve worked on:</h3>
<h3 id="lucene-grep">Lucene Grep</h3>
<p>The <code>lucene-grep</code> was updated and released with these improvements:</p>
<ul>
<li>Lucene 9.7.0;</li>
<li>The prepared Lucene Analyzers can now be added and loaded via SPI.</li>
</ul>
<p>Also, I&rsquo;ve experimented with <a href="https://github.com/dainiusjocas/lucene-grep/pull/219">Apache OpenNLP integration</a> into the <code>lucene-grep</code>.
So far I don&rsquo;t know whether to include new dependencies by default, because it makes the binary bigger, compile times longer,
and the <code>lucene-opennlp</code> includes a pretty outdated version of the OpenNLP library.</p>
<h3 id="lucene-in-vespaai">Lucene in Vespa.ai</h3>
<p>I&rsquo;ve <a href="https://github.com/vespa-engine/vespa/pull/27929">contributed a Lucene Linguistics</a> component to <a href="https://vespa.ai/">Vespa.ai</a>.
This is not strictly based on <code>lucene-grep</code> or related to Clojure
(maybe it is possible to start a REPL in Vespa container nodes after all?)
but the work is heavily inspired by <a href="https://github.com/dainiusjocas/lucene-custom-analyzer">lucene-custom-analyzer</a> library
(and learnings while making it) which was extracted from the <code>lucene-grep</code>.
Sample apps with the Lucene Linguistics component are coming <a href="https://github.com/vespa-engine/sample-apps/pull/1264">hopefully soon</a>.
The component should make the transition from Lucene based search engines like Elasticsearch to Vespa almost a mechanical task.
I encourage anyone interested in search, recommendation systems, or information retrieval in general, to give Vespa.ai a try.
it is great!</p>
<h3 id="what-is-next">What is next?</h3>
<p>Even though the sponsorship from Clojurist Together is over I&rsquo;m planning to have more fun with Clojure and Lucene:</p>
<ul>
<li>I&rsquo;ll try to integrate the extracted libraries to other Clojure projects that depend on Lucene.</li>
<li>Build a demo of an <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html">Elasticsearch-Percolator-like</a>
system that does monitoring in a scalable and distributed mode.</li>
<li>A blog post on using the shiny new <a href="https://lucene.apache.org/core/9_7_0/analysis/common/org/apache/lucene/analysis/synonym/word2vec/Word2VecSynonymFilter.html">Word2VecSynonymFilter</a> from Clojure. <br></li>
</ul>
<hr>
<h2 id="neanderthal-dragan-duric">Neanderthal: Dragan Duric</h2>
<p>Project Update: 31 July and 31 August 2023<br>
Q2 2023 Funding Round: Reports 2 and 3</p>
<p><strong>Report 2:</strong>
My goal with this round is to port Neanderthal, ClojureCUDA, and Deep Diamond to JavaCPP-based native libraries.</p>
<p>This second month was dedicated to porting the CPU data structures and engines from DirectByteBuffer-based
custom C bindings (Neanderthal Native) to JavaCPP-based MKL bindings. I managed to port all structures
and engines, and make all related tests pass. I also hoped to do the CUDA engines and data structures
to JavaCPP from the old JCUDA bindings, but I&rsquo;m late on that. It&rsquo;s something that I hope to do in the
first half of the third month.</p>
<p>Of course, that wasn&rsquo;t a straight port. On one hand, I had to make internal changes and adaptations
to support JavaCPP&rsquo;s way of doing things. On the other hand, I used this as an opportunity to
explore avenues to decrease the code size through more macrology and to push more intensely towards
&ldquo;don&rsquo;t repeat yourself&rdquo; style. It&rsquo;s a double-edged sword, I know, but MKL and other similar APIs
are massive, and I am a sole person who has to support all these exotic obscure functionalities&hellip;</p>
<p>Next month will be dedicated to porting Neanderthal&rsquo;s CUDA backend to use JavaCPP (via ClojureCPP).</p>
<p>All in all, I feel that the project is still on track even though I would have liked to achieve more
in the first two months, but it is what it is. I still think I&rsquo;ll be able to port ClojureCUDA, Neanderthal,
and Deep Diamond to ClojureCPP by the end of the third month, or at least everything except Deep Diamond.</p>
<p>What&rsquo;s equally important, I&rsquo;m using every opportunity to <em>improve</em> everything that I could,
instead of just taking the shortest cut at every corner. So the benefits will be felt long-term in
these libraries, as well as this domain in Clojure.</p>
<p>I released most of the resulting code in a couple of gigantic commits instead of many smaller ones
because I didn&rsquo;t want any release to contain a completely broken library.<br></p>
<p><strong>Report 3:</strong>
My goal with this round was to port Neanderthal, ClojureCUDA, and Deep Diamond to JavaCPP-based native libraries.</p>
<p>More specifically, I proposed to implement:</p>
<ul>
<li>a port of Neanderthal&rsquo;s MKL engines and CPU related stuff to JavaCPP instead of neanderthal-native (for sure).</li>
<li>a port of ClojureCUDA to JavaCPP&rsquo;s CUDA. (probably, depending how 1 goes)</li>
<li>a port of Neanderthal&rsquo;s GPU matrix engine to new, JavaCPP-based ClojureCUDA (almost sure, if ClojureCUDA port goes well)</li>
<li>update Deep Diamond to use new infrastructure.</li>
<li>improve relevant internal parts of Neanderthal code with more macrology (double-edged sword, I know, but also concentrates bugs at one place each).</li>
<li>TESTS! to make sure everything works as well as before (of course!)</li>
</ul>
<p>In the third month, I continued with porting the Neanderthal&rsquo;s CUDA engine. This wasn&rsquo;t without challenges,
but, surprisingly, it went well after all. After this, I hoped that Deep Diamond&rsquo;s port would be
a bit easier, since a lot of internal details are behind the Neanderthal&rsquo;s and ClojureCUDA&rsquo;s API.
However, for proper MKL API support in JavaCPP I had to use the very latest 1.5.10 snapshots.
These snapshots then mandate DNNL (Intel&rsquo;s tensor and DL library) upgrade to 3.2 (from the 2.7 that
was used in Deep Diamond previously). Alas, Intel introduced many breaking changes in the API and
implementation, so I have to play the good old discover-how-it-works-by-poking-around,
and do the full blown re-implementation of DNNL API internal support in Deep Diamond,
instead of just porting a few internals to JavaCPP&rsquo;s way of doing things. I&rsquo;ve started
doing that, and as of this writing, I&rsquo;ve discovered how to solve most tricky changes, and
I am in the middle of switching the internal/dnnl part of Deep Diamond.</p>
<p>More specifically, here&rsquo;s the status by the proposed bullet points:</p>
<ul>
<li>DONE: a port of Neanderthal&rsquo;s MKL engines and CPU related stuff to JavaCPP instead of neanderthal-native (for sure).</li>
<li>DONE: a port of ClojureCUDA to JavaCPP&rsquo;s CUDA. (probably, depending how 1 goes)</li>
<li>DONE: a port of Neanderthal&rsquo;s GPU matrix engine to new, JavaCPP-based ClojureCUDA (almost sure, if ClojureCUDA port goes well)</li>
<li>PARTIAL (in progress): update Deep Diamond to use new infrastructure.</li>
<li>DONE: improve relevant internal parts of Neanderthal code with more macrology (double-edged sword, I know, but also concentrates bugs at one place each).</li>
<li>DONE (but of course, this is something that is ongoing anyway): TESTS! to make sure everything works as well as before (of course!)</li>
</ul>
<p>In short, although I haven&rsquo;t managed to do everything that I hoped I will, I&rsquo;m satisfied
since I&rsquo;ve done the major parts, and the unexpected DNNL upgrade would have to be done anyway
eventually.</p>
<p>As I&rsquo;ve been lucky to be granted one more CT funding round, which is centered on improving
the overall quality of Uncomplicate libraries, upgrading the Deep Diamond support for DNNL
and new CUDA infrastructure would fit well with the tasks that I&rsquo;m planning to do in the Q3
round anyway, so I expect that by the end of it I&rsquo;d be very satisfied with the result.<br></p>
<hr>
<h2 id="portfolio-christian-johansen">Portfolio: Christian Johansen</h2>
<p>Project Update: 31 August 2023<br>
Q2 2023 Funding Round: Report 2</p>
<p>In the second half of the Q2 funding period I have worked on the plugin capabilities in Portfolio, the new accessibility plugin, and barked up some wrong trees in an attempt at fixing a tricky problem 😅</p>
<p>Plugins can now inject JavaScripts into the iframe document where Portfolio renders your &ldquo;scenes&rdquo; (your component examples). In order for these scripts to be able to do something useful, Portfolio will use <code>window.postMessage</code> to announce when components have been rendered, and listen for commands via the same channel - allowing custom scripts to interact with Portfolio&rsquo;s data storage (and, by extension render interesting things in its UI).</p>
<p>I built a new accessibility extension on top of the new capabilities. It uses
<a href="https://github.com/dequelabs/axe-core">axe-core</a> to assess your components. Validation can be switched on and off in the UI (or completely disabled in
code). When on, components will be assessed as you navigate through them. There
is also a global option to assess all components and have results highlighted in
the left-hand menu, which should make it easier to track down non-conforming
components.</p>
<p>The accessibility feature isn&rsquo;t quite ready yet, but I&rsquo;m expecting to release it in September.
As for my barking at trees, I have tried to solve an outstanding issue in Portfolio&rsquo;s rendering. Portfolio invokes components in the main process, then renders the result in an iframed document. This breaks down for components that are side-effects, such as some solutions for CSS-in-CLJS (which stick style tags
in <code>&lt;head&gt;</code>). I have tried to a few ways to solve this in a way that supports the current API, but all of them have had worse side-effects than the current situation, so I have put this issue on the back-burner.</p>
<p>Once again thank you so much for the support. Portfolio is a much better tool thanks to it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2023 Board Nominations and Our Annual Meeting</title>
      <link>https://www.clojuriststogether.org/news/2023-board-nominations-and-our-annual-meeting/</link>
      <pubDate>Thu, 24 Aug 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2023-board-nominations-and-our-annual-meeting/</guid>
      <description>Stand for our 2023 elections and attend the Annual Meeting</description>
      <content:encoded><![CDATA[<p>Clojurists Together is having our third board elections, and our third annual members meeting.</p>
<h3 id="key-dates">Key dates</h3>
<p>(All dates are EOD, in Pacific Time)</p>
<p><strong>Board nominations close:</strong> Sept. 15, 2023<br>
<strong>Voting opens:</strong> a few days after submissions close and the board has nominated candidates<br>
<strong>Voting closes:</strong> October 7, 2023<br>
<strong>Annual members meeting:</strong> <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+Members+Meeting&amp;iso=20231010T10&amp;p1=224&amp;ah=1">Oct. 10, 2023 - 10 am Pacific time</a></p>
<h3 id="board-elections">Board Elections</h3>
<p>As part of our commitment to <a href="https://www.clojuriststogether.org/transparency/">transparency</a> and community governance, Clojurists Together holds elections for board members. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors.</p>
<p>Committee members are elected for a two-year term. Each election cycle, half of our board seats come up for re-election. This year there are four seats available.</p>
<p>If you are interested in standing for election, please fill out this <a href="https://forms.gle/h7ZzLFSZsq9NLShu9">form</a> by Sept. 15th, 2023 -  5 pm Pacific Time. If you can’t access the form, <a href="https://www.clojuriststogether.org/contact">contact us</a>, and we can accept your nomination by email. Nominations are open to anyone, you don’t have to be a Clojurists Together member to stand for election. Our bylaws do require you to be a member if elected to the board, though we provide a stipend that offsets the cost of your membership.</p>
<p>You don’t have to have lots of experience with Clojure to apply. We want a committee made up of a cross-section of the Clojure community so that we have a wide range of perspectives when making decisions on which projects to fund.</p>
<p>As part of the nomination, if we get more than 12 candidates for board membership, the board will nominate no more than 12 candidates. Our bylaws state:</p>
<blockquote>
<p>The Board shall nominate no more than 12 candidates seeking board membership in any given election. In nominating candidates for Director positions and in choosing the number of candidates to nominate overall, the Board shall use reasonable efforts to maintain a Board composition consisting of at least: (1) 25% female Directors, (2) 25% non-Caucasian Directors, and (3) 35% from any category(ies) of persons (e.g., race, gender, ability) commonly considered to have suffered from discrimination at some time and then-currently under-represented in the technology industry, in each case as determined by the Board in its reasonable discretion.</p>
</blockquote>
<p><strong>The main responsibilities of a committee member are:</strong></p>
<ul>
<li>Participate in the general discussions of the month-to-month running of the program</li>
<li>Evaluate and vote on which open source projects to fund</li>
<li>Help in decision-making for the future plans of Clojurists Together</li>
<li>These responsibilities take roughly one hour/month, though there are peaks and troughs of activity as we go through our quarterly funding cycle. If you have more time to offer, there are lots more things that need developing, automating, designing, e.t.c. It would be great to have you help out with those things, but we don’t want to exclude people from standing because they don’t have a lot of spare time.</li>
</ul>
<p>Our bylaws requires that we do not have more than two committee members from any one company. More than two people from a company can stand for election, but if more than two of these people were to be elected, only the top two ranked candidates would be elected and the other seats would go to the next most highly ranked candidates from other companies. If you have any questions about this, please get in touch.</p>
<p>Elections will be held once the candidates are announced, and all Clojurists Together members will be eligible to vote.</p>
<h3 id="annual-members-meeting">Annual Members Meeting</h3>
<p>We are also holding our third members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+members+meeting&amp;iso=20221129T09&amp;p1=224&amp;ah=1">10 am Pacific time, October 10, 2023</a>. This will be an opportunity for Clojurists Together to share information about 2023 to date and discuss future plans, present the new board members, and most importantly take questions from and engage with members.</p>
<p><strong>More details on this will follow including a videoconferencing link.</strong></p>
<p>Please share this with anyone you think would be able to represent the interests of the Clojure community and Clojurists Together members. Thanks for your support of Clojurists Together, we appreciate it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2023 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2023-funding-announcement/</link>
      <pubDate>Thu, 17 Aug 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2023-funding-announcement/</guid>
      <description>We are funding 8 projects for a total of $44K USD in Q3 2023.</description>
      <content:encoded><![CDATA[<p>Hi folks. We’re excited to announce the projects we&rsquo;ll be funding for Q3 2023. (8 projects $44K USD in total).
As usual, there were a lot of great project proposals - so making a decision was not easy.</p>
<p>The good news, however, is that proposals are automatically reconsidered for the next 2 cycles. We have supported many
projects in the past that were funded in the 2nd or even 3rd review.</p>
<p>Thanks to everyone for your hard work and creativity in putting these proposals together - this is the kind of thinking and sharing
that makes the Clojurist Together community so awesome!</p>
<h3 id="projects-awarded-9k-usdbr">Projects Awarded $9K USD<br></h3>
<p><strong>Bosquet:</strong> Zygis Medelis<br>
<strong>Emmy:</strong> Sam Ritchie<br>
<strong>Neanderthal, Diamond, ClojureCUDA, ClojureCL, ClojureCPP:</strong> Dragan Djuric<br>
<strong>Quil:</strong> Jack Rusher and Charles Comstock<br></p>
<h3 id="projects-awarded-2k-usdbr">Projects Awarded $2K USD<br></h3>
<p><strong>Biff:</strong> Jacob O&rsquo;Bryant<br>
<strong>Deps-try:</strong> Gert Goet<br>
<strong>GDL:</strong> Michael Sappler<br>
<strong>Jank:</strong> Jeaye Wilkerson<br></p>
<h3 id="larger-projects-awarded-9k-usdbr">LARGER PROJECTS AWARDED $9K USD<br></h3>
<hr>
<h2 id="bosquethttpsgithubcomzmedelisbosquet-zygis-medelis"><a href="https://github.com/zmedelis/bosquet/">Bosquet:</a> Zygis Medelis</h2>
<p>Bosquet&rsquo;s goal is to make AI/LLM-based application building simple and productive. There are many types of AI applications and equally many approaches to building them. The scope of this work is to expand AI agent-based architecture support in Bosquet.</p>
<p><strong>Main tasks:</strong></p>
<ol>
<li>Input/output specs. Agents are functions with specific inputs and outputs. Add LLM input/output specification and coercion inspired by or using Malli/Clojure spec.</li>
<li>Agents and Tools. Expand on initial LLM Agent support. More agent types, more out-of-the-box tools. The best outcome would be a clear architecture and infrastructure for users to add any type of agents and tools. Thus adding new tools and agent types is guided not by the blind expansion of supported integrations but by the illustration of different modes and aspects of agent applications.</li>
<li>Memory. Without LLM memory, any larger processing tasks would be impossible to achieve. Vector DB (or other types of memory implementation) support is essential to add.</li>
</ol>
<p>When implementing the above, the growing scope of work should not reduce the library&rsquo;s usability. Documentation, Clerk notebooks, examples, and sound architecture are to take priority over adding functionality.<br></p>
<hr>
<h2 id="emmyhttpsgithubcommentat-collectiveemmy-sam-ritchie"><a href="https://github.com/mentat-collective/emmy">Emmy:</a> Sam Ritchie</h2>
<p>Last quarter&rsquo;s funding enabled me to build out a suite of visualization tools powered by Emmy&rsquo;s mathematical functions, shipped in the Emmy-Viewers library. Emmy is now powerful enough to back a math and physics curriculum up through the college level; the only other Web-enabled system with this ability is Mathematica, with a $3,000 price tag and many restrictions.</p>
<p>The next step is to build out a community of learning and growth around these ideas, so that we can get kids and classrooms excited and using Clojure as the foundation of their journeys through math and physics.</p>
<p>This quarter, I want to build out a collaborative experience for all of this math visualization tooling. I want a Google Docs-style experience for interactive documents with sophisticated mathematical visualizations, where multiple users can work together on the same page, save and share the work they&rsquo;ve created and build on existing mathematical play and exploration. The system should allow for programmable side-notes, with access to the same computing environment that the original author had. This same mechanic could power an &ldquo;executable Wikipedia&rdquo;, a wiki-style editable environment where pages contained running code and felt more like namespaces.</p>
<p>Research groups like Ink&amp;Switch have done amazing work (<a href="https://www.inkandswitch.com/upwelling/,">https://www.inkandswitch.com/upwelling/,</a> <a href="https://www.inkandswitch.com/peritext/">https://www.inkandswitch.com/peritext/</a>) building out the technology to power an experience like this. We have glimmers of the final product with Clerk and Maria, but the final push will take some work.<br></p>
<hr>
<h2 id="neanderthalhttpsgithubcomuncomplicate-dragan-djuric"><a href="https://github.com/uncomplicate">Neanderthal:</a> Dragan Djuric</h2>
<p>My goal with this round is to polish the Uncomplicate libraries (mainly Neanderthal, Deep Diamond, ClojureCUDA, ClojureCL, ClojureCPP), rather than develop new functionality.</p>
<p>Uncomplicate libraries include several infrastructure libraries for high-performance computing, AI, Deep Learning, Math, statistics, data science, etc. Over the years, they grow to be really large. Although they contain orders of magnitude fewer lines of code than the equivalent Python or Java libraries, they cumulatively have 40.000 lines of highly dense Clojure code, especially Neanderthal, which clocks at around 25.000.</p>
<p>Over the years, I managed to do improve these libraries constantly, including several large refactorings, without breaking backwards compatibility of public-facing API. This was possible in part due to Clojure&rsquo;s awesomeness, but also due to the many thousand of automatic tests that I&rsquo;ve developed, and my constant insistence on fixing code issues before they become forgotten hard-to-trace bugs.</p>
<p>However, as the number of features grows, the proportion of hard-to-reach branches in edge cases grows. They hide cases that I didn&rsquo;t have time to cover with automatic tests. They might have been tested once upon a time, but do they still hold after the major ports? I hope they do, but it&rsquo;s impossible to never introduce a slight coding mistake, especially when porting a thousand lines of code to new backends.</p>
<p>In addition to this, there are parts of public API that might have stale documentation (Neanderthal), or without proper docstrings (parts of Deep Diamond). I just didn&rsquo;t have the time and resources to dedicate enough time to this. But it&rsquo;s something that users see every day, and it needs improvement!</p>
<p>In short, I propose to:</p>
<ul>
<li>Do a thorough re-visiting of existing code in major Uncomplicate libraries.</li>
<li>Read the code without rushing to implement new features.</li>
<li>Write more tests for edge cases.</li>
<li>Discover bugs and fix them.</li>
<li>Discover places where code could be improved (without rushing the new functionality).</li>
<li>Re-visit documentation and improve it to better match the current state of Uncomplicate libraries.</li>
<li>If opportunities arise, implement some new functionality based of all the aforementioned items.</li>
</ul>
<p>In even shorter terms, I propose to do some hammock time, combined with some unexciting chores that enhance the stability and user-friendliness of Uncomplicate libraries.<br></p>
<hr>
<h2 id="quilhttpsgithubcomquil-jack-rusher-and-charles-comstock"><a href="https://github.com/quil">Quil:</a> Jack Rusher and Charles Comstock</h2>
<p>Quil is a wrapper around the Processing computer graphics system that&rsquo;s used by artists and teachers around the world. It has been moribund for the last several years, does not work with the latest version of Processing, nor on JVMs &gt;1.8, nor on Apple arm processors. We would like to fix all of that, improve the quality of the codebase (maintainability, testing, &amp;c), and update the examples/playground website. Ultimately, we would also like to train some more junior people to help maintain the project going forward.</p>
<p><strong>Why is this project important to the Clojure community?</strong>
Quil is often used to teach beginners, rapidly prototype visualizations and GUIs, produce art and design artifacts, &amp;c. It has been an important part of the Clojure ecosystem since Sam Aaron created it 10+ years ago.<br></p>
<hr>
<h3 id="experimental-or-short-term-projects-awarded-2k-usd-br">EXPERIMENTAL OR SHORT-TERM PROJECTS AWARDED $2K USD <br></h3>
<h2 id="biffhttpsgithubcomjacobobryantbiff-jacob-obryant"><a href="https://github.com/jacobobryant/biff">Biff:</a> Jacob O’Bryant</h2>
<p>I&rsquo;d like to:</p>
<ul>
<li>Write a bunch of how-to articles</li>
<li>Write some essays/background info</li>
<li>Start writing &ldquo;Biff from scratch,&rdquo; a series of guides that will show you how to put together a web app in the style of Biff without actually using any Biff code</li>
</ul>
<p>Along the way I&rsquo;ll be reading up on SEO, posting things to Hacker News, and thinking about what content topics might be helpful for a non-Clojure audience. I want to use Biff to bring more people into the Clojure community.</p>
<p>For the specific content I have planned, see the Roadmap section of Biff&rsquo;s <a href="https://biffweb.com/docs/library/">content library</a> which I&rsquo;ll be keeping up-to-date. <strong>I&rsquo;ll only be able to get to a fraction of those</strong> within the funding timeframe, and I&rsquo;m sure the list will change as I go. So if any of those topics catch your eye, let me know so I can prioritize them.<br></p>
<p><strong>Why is this project important to the Clojure community?</strong><br>
Biff has been slowly gaining traction; currently, the #biff channel on Clojurians gets about 15 unique participants per month, trending upward (<a href="https://cdn.findka.com/biff/slack-participants.png)">https://cdn.findka.com/biff/slack-participants.png)</a>. More importantly, I think there&rsquo;s a real opportunity for Biff to drive growth for the Clojure community as a beginner-friendly, comprehensive web framework.<br></p>
<hr>
<h2 id="deps-tryhttpsgithubcomevaldeps-try-gert-goet"><a href="https://github.com/eval/deps-try">Deps-try:</a> Gert Goet</h2>
<p>The plan is to add a possibility to deps-try (a CLI to start a rebel-readline powered REPL with libraries you want to try) to load recipes. A recipe (i.e. a local or remote Clojure file) essentially seeds the REPL-history which would make it easy for someone to &lsquo;step through&rsquo; some code. E.g. library authors could add such a recipe-file to their repositories to demonstrate how to use a library.<br></p>
<p><strong>Why is this project important to the Clojure community?</strong>
lein-try was what got me into programming Clojure: no distraction from setting up/learning a new editor, but just fire up a REPL with some specific libraries and try out snippets from the Clojure cookbook.</p>
<p>I thought it was valuable to have this for tools-deps as well (using rebel-readline for user-friendliness) and launched deps-try almost 5 years ago.</p>
<p>As an experienced Clojure developer, I still fire up deps-try whenever I run into a new library (not in the least a new Clojure alpha version) and I want to quickly try it out.  After 3 years since the last commit, I recently started hammocking and coding what a new version would look like.<br></p>
<hr>
<h2 id="gdlhttpsgithubcomdamngdx-michael-sappler"><a href="https://github.com/damn/gdx">GDL</a> Michael Sappler</h2>
<p>My proposal is to connect two things that are not connected yet - game development and clojure.</p>
<p>I believe it is possible to achieve a new generation, a new dimension of games written in an evolving language and in an open manner.
Games need to grow and breathe. The most successful games were games with lots of mods.</p>
<p>I believe Clojure can have some advantages over the traditional way of creating games: functional programming, but also embracing state and being practical, macros which can make the language evolve.</p>
<p>My original proposal was one project gdx. Since then I have created 3 public repositories in GitHub:</p>
<ul>
<li>x.x is probably the most useful invention, it is an entity component system using just plain maps and multimethods.</li>
<li>The other is now GDL and not gdx which should mean game development language. Till now it is just a helper/wrapper around libgdx.</li>
<li>And the third project from which everything came is cyber Dungeon Quest.</li>
</ul>
<p>Right now there is not much to the game in terms of content (although much more is not shown). I am working on all 3 projects at once and trying to find the most simple and effective way to organise game code. Cyber Dungeon Quest is around 8500 lines of code and it was 10K a few months ago and I just focused only on cleaning the code and understanding the best way to do things.</p>
<p>More information can be found on my <a href="https://GitHub.com/damn">GitHub</a>.</p>
<p>My near-term goals are to integrate the component system in cyber Dungeon Quest and make all the hard-coded values configurable and save most of the game state in only one place, and then build a ui to easily edit the domain objects.
Next is to find a way to reduce the amount of Side effects by using some kind of transaction system that is close in spirit to datomic architecture. I am not sure yet if I can directly use datomic for performance reasons, but it would make a lot of things quite easy like replays, timetravel, networking etc.
I am not fixing myself too much and see where the project grows. In this manner, in the last months I have made amazing discoveries, mostly with x.x ECS and have been led to interesting places.<br></p>
<hr>
<h2 id="jankhttpsgithubcomjank-langjank-jeaye-wilkerson"><a href="https://github.com/jank-lang/jank">Jank:</a> Jeaye Wilkerson</h2>
<p>The next big step of jank entails implementing <code>clojure.core/require</code> and everything involved. Right now, jank compiles everything from one file (and re-compiles <code>clojure.core</code> every time it starts); the runtime/compiler understand namespaces, but there is no compilation cache, no class paths for looking up modules, no dependency loading, etc.</p>
<p>Implementing <code>require</code> would involve these broad strokes (IN SCOPE):</p>
<ul>
<li>Adding a notion of class paths to the compiler in a Clojure-compatible way</li>
<li>Adding the necessary <code>load-libs</code>, <code>load-lib</code>, <code>load-one</code>, <code>load-all</code>, etc</li>
<li>Generating the equivalent of class files, for jank, when loading files</li>
<li>Iteratively compiling, based on cached files</li>
<li>Support for <code>:reload</code> and <code>:reload-all</code> code paths</li>
<li>Pre-compiling <code>clojure.core</code>, which will greatly speed up start times</li>
<li>Testing and distribution of this on Linux and macOS, primarily To keep things sane, this Q will likely not include these, but I&rsquo;ll do as much as I can (OUT OF SCOPE):</li>
<li>Namespace aliasing</li>
<li>The <code>ns</code> macro, since jank&rsquo;s macro system isn&rsquo;t quite ready for it yet</li>
<li>Benchmarking load times against Clojure</li>
<li>Windows support for this new feature</li>
<li>STM for module loading; this will be needed, eventually, but is too much to tackle for one Q</li>
<li>Project management tooling (leiningen, deps.edn) integration</li>
<li>REPL server</li>
</ul>
<p>After this work is done, jank will be in a position to integrate with leiningen and actually be used for multi-project files.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2023 Annual Meeting and Board Elections</title>
      <link>https://www.clojuriststogether.org/news/2023-annual-meeting-and-board-elections/</link>
      <pubDate>Fri, 11 Aug 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2023-annual-meeting-and-board-elections/</guid>
      <description>Hold these dates!</description>
      <content:encoded><![CDATA[<br>
Greetings Clojurists Together members and supporters. It's that time again!  We've undertaken many projects this year thanks to you and as a result, have strengthened the tools and resources available to the entire Clojure community.  
<h3 id="2023-annual-meeting">2023 ANNUAL MEETING</h3>
<p>Our 3rd annual convening is fast-approaching - so we wanted to give you advance notice of the date and agenda. We know you are busy, but if you could reserve an hour to meet, we would value both your participation and input. Please hold the following date and time on your schedules  (certainly not a complete list - but enough to check your time).</p>
<ul>
<li>Auckland Wed., Oct 11, 6 am</li>
<li>Chicago Tues., Oct 10,12 pm (noon)</li>
<li>New York, Tues., Oct 10, 1 pm</li>
<li>São Paulo, Brazil,Tues., Oct 10, 2 pm</li>
<li>Belgrade, London, Paris, Stockholm Tues., Oct 10, 7 pm</li>
<li>Amsterdam, Barcelona, Berlin, Helsinki Tues., Oct 10, 8 pm</li>
</ul>
<h3 id="prior-to-the-meeting-board-nominations-and-voting">PRIOR TO THE MEETING: BOARD NOMINATIONS AND VOTING</h3>
<ul>
<li>You&rsquo;ll receive an email towards the end of August explaining the process in more detail.</li>
<li><strong>Call for nominations for expiring board seats:</strong> Aug. 25, 2023</li>
<li><strong>Board nominations close:</strong> Sept. 15, 2023</li>
<li>Voting opens a few days after the submissions close and after the board has nominated the final candidates</li>
<li><strong>Voting closes:</strong> Sept 29th, 2023</li>
<li>New term board members announced at Annual Meeting Oct. 10/11</li>
</ul>
<h3 id="agenda-annual-meeting-oct-1011">AGENDA ANNUAL MEETING OCT 10/11:</h3>
<ul>
<li>Welcome new board members</li>
<li>Summary reports on  2023 projects, membership, survey results, and financials</li>
<li>Q&amp;A, Discussion  regarding community needs and future direction</li>
</ul>
<p>We hope to see you there. This is a lively, informed, and opinionated group - so we&rsquo;re looking forward to hearing from you!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>FireFox 116.0 Release</title>
      <link>https://www.clojuriststogether.org/news/firefox-116.0-release/</link>
      <pubDate>Tue, 08 Aug 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/firefox-116.0-release/</guid>
      <description>Firefox 116.0 released with custom formatters support</description>
      <content:encoded><![CDATA[<h2 id="custom-formatters-for-firefox">Custom Formatters for Firefox</h2>
<p>It&rsquo;s been quite a while since my last post regarding custom formatters in Firefox. Though the long wait is finally over. Firefox 116.0 ships with custom formatters support!</p>
<p>In addition to the overview below, you can review the <a href="https://www.mozilla.org/en-US/firefox/116.0/releasenotes/">Firefox 116 release notes</a> and the <a href="https://twitter.com/FirefoxDevTools/status/1686383218143240192?t=YU3ARV88wolWF9cwBVLrmQ&amp;s=09">tweets</a> and <a href="https://fxdx.dev/firefox-devtools-newsletter-116/">blog</a> by the Firefox DevTools team.
For more background and the initial decision to fund this important project, check out Clojurists Together’s <a href="https://clojars.slack.com/archives/D04EH0UMJAE/p1691149708318019">post</a> from February 2022.</p>
<p><strong>So let&rsquo;s get to it!!</strong></p>
<p>The main point of bringing custom formatters to Firefox was to allow the <a href="https://github.com/binaryage/cljs-devtools">CLJS DevTools</a> (custom formatters for ClojureScript) to work in Firefox.
To get to that point required a lot of work. First, I needed to find a way how to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1734840">parse the custom formatters</a> defined in a website in a safe way. To allow executing the code in a safe context, I&rsquo;ve re-used a functionality that was already used by the Web Console to support <a href="https://firefox-source-docs.mozilla.org/devtools-user/web_console/the_command_line_interpreter/index.html#instant-evaluation">instant evaluation</a>. Though I had to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1801040">lift some of the restrictions imposed by that functionality</a>.</p>
<p>After that, I switched the logic behind their display from the normal tree view used in o ther places within the Firefox DevTools <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1801045">to a custom component</a>. This simplified the logic behind them, allows to align the display to Chrome&rsquo;s implementation and paved the way to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1764443">handle the config object</a>.</p>
<p>Also, once the basic functionality of the feature was there, I <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1764439">added a way to gracefully handle errors within formatters</a> by logging them to the console.</p>
<p>Initially, my focus lay on the display within the <a href="https://firefox-source-docs.mozilla.org/devtools-user/web_console/ui_tour/index.html">Web Console</a>. Though the Web Console isn&rsquo;t the only part where custom formatters are supported. I&rsquo;ve also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1820333">added support for them within the tooltips shown when hovering variables in the Debugger</a> while script execution is stopped. Thanks to the DevTools team, there&rsquo;s also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1828511">support for them within the Scopes</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1828509">Watch Expressions panel</a>. All those changes included creating automated test cases for this new feature.</p>
<p>Once those steps were finished, I could finally <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1752760">remove the experimental flag</a>, behind which this feature was implemented.
And last but not least, I&rsquo;ve also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1773035">added some documentation of the feature</a>.</p>
<p>This rounded up the implementation regarding the Firefox side. Though, as initially noted, the main goal was to get the CLJS DevTools to work with Firefox. And that also required some work on their side. So, with the help of Antonin Hildebrand I&rsquo;ve <a href="https://github.com/binaryage/cljs-devtools/pull/73">added support for Firefox there</a>, as well, and <a href="https://github.com/binaryage/cljs-devtools/pull/74">had to further tweak the display</a> later on. And I also edited the documentation there to include the support in Firefox.
Antonin then also <a href="https://github.com/binaryage/cljs-devtools/releases/tag/v1.0.7">released a new version 1.7</a> of those tools after that. So if you want to have Firefox support using the CLJS DevTools, please make sure to download the latest version of them.</p>
<h2 id="give-the-feature-a-try">Give the feature a try!</h2>
<p>You can enable custom formatters from within the Settings panel by checking the &ldquo;Enable custom formatters&rdquo; option.
Once that&rsquo;s done, custom formatters are available the next time you open the Firefox DevTools.</p>
<p>Download the latest version of the CLJS DevTools and integrate them into your project.</p>
<p>With that, ClojureScript variables are displayed in a much more readable way in the DevTools. Here&rsquo;s an example that covers pretty much everything they do:</p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/05773116-4df6-4c96-9afa-d00b1fc2e1f2" alt="image"></p>
<p>All this is explained in more detail in the post at the <a href="https://fxdx.dev/firefox-devtools-custom-object-formatters/">Firefox Developer Experience blog</a>
and in the <a href="https://firefox-source-docs.mozilla.org/devtools-user/custom_formatters/index.html">Firefox DevTools documentation</a>.</p>
<h2 id="conclusion">Conclusion</h2>
<p>While the project took way longer than expected, I am happy that the feature finally made it into Firefox and people can profit from it.</p>
<p>And that wouldn&rsquo;t have been possible without the help of Nicolas Chevobbe from the Firefox DevTools team and the creator of the CLJS DevTools, Antonin Hildebrand. Also Jan &lsquo;Honza&rsquo; Odvarko from the Firefox DevTools team helped coordinate the implementation and tracked the progress. So, a big thank you! Also, thanks to Daniel who reached out to me for that project and for supporting me!</p>
<p>I&rsquo;ve learned a lot during this project. And I hope you find this feature helpful.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>July 2023 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/july-2023-project-updates/</link>
      <pubDate>Wed, 19 Jul 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-2023-project-updates/</guid>
      <description>clj-Nix, Clojure Camp, Emmy, Jank, Lucene Grep, Neanderthal, Portfolio</description>
      <content:encoded><![CDATA[<br>
Hope all of you are having a great summer (or winter in the southern hemisphere)..Here is the first round of reporting from our Q2 2023 project developers. Catch up on all of their great work!   
<h2 id="q2-2023-project-updates">Q2 2023 Project Updates</h2>
<p><a href="#clj-nix-jose-luis-lafuente-esquembre">clj-Nix: Jose Luis Lafuente Esquembre</a><br>
<a href="#clojure-camp-daniel-higginbotham">Clojure Camp: Daniel Higginbotham</a><br>
<a href="#emmy-sam-ritchie">Emmy: Sam Ritchie</a><br>
<a href="#jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</a><br>
<a href="#lucene-grep-dainius-jocas">Lucene Grep: Dainius Jocas</a> <br>
<a href="#uncomplicate-neanderthal-clojure-cuda-deep-diamond-dragan-djuric">Uncomplicate Neanderthal, Clojure CUDA, Deep Diamond: Dragan Djuric</a><br>
<a href="#portfolio-christian-johansen">Portfolio: Christian Johansen</a>  <br>
<br></p>
<h2 id="clj-nix-jose-luis-lafuente-esquembre">clj-Nix: Jose Luis Lafuente Esquembre</h2>
<p>Published 12 July 2023.  Q2 2023 Funding Round Report 1.</p>
<h3 id="updates">Updates</h3>
<p>For the first half of the funding round, I refactored the
<a href="https://github.com/jlesquembre/clj-nix">clj-nix</a> CLI interface, which is used
to generate the <code>deps-lock.json</code> files. Now, if your project has multiple
<code>deps.edn</code> files and aliases, you can define what dependencies to include in the
lock file.</p>
<p>The CLI added the following flags: <code>--deps-include</code>, <code>--deps-exclude</code>,
<code>--alias-include</code> and <code>--alias-exclude</code>.</p>
<p>An optimized lock file saves bandwidth and speeds up the nix build. I also added
support to use Babashka as a build tool. To do that, use the <code>--bb</code> flag, see
the <a href="https://github.com/jlesquembre/clj-nix">clj-nix</a> README for more info.</p>
<p>As part of the work to support Babashka, I updated Babahska in nixpkgs
<a href="https://github.com/NixOS/nixpkgs/pull/241119">PR NixOS/nixpkgs#241119</a>. Those
changes benefit all nix users, not only
<a href="https://github.com/jlesquembre/clj-nix">clj-nix</a> users.</p>
<p>I also updated <code>clojure-lsp</code> to use the latest
<a href="https://github.com/jlesquembre/clj-nix">clj-nix</a> version:
<a href="https://github.com/clojure-lsp/clojure-lsp/pull/1623">PR clojure-lsp/clojure-lsp#1623</a>.
Try it with <code>nix run github:clojure-lsp/clojure-lsp -- --version</code></p>
<p>Some other minor improvements I did:</p>
<ul>
<li>
<p>Refactored the <code>flake.nix</code> file, to fix the <code>nix flake check</code> command.</p>
</li>
<li>
<p>Added GitHub Actions to update the clojure and nix dependencies automatically.</p>
</li>
<li>
<p><code>deps-lock</code> command checks if <code>deps-lock.json</code> is tracked by git. If not, runs
<code>git add --intent-to-add</code></p>
</li>
<li>
<p>Add <code>extraJdkModules</code> option to <code>customJdk</code></p>
</li>
<li>
<p>Add <code>wrap</code> option to <code>mkBabashka</code></p>
</li>
<li>
<p>Check that the <code>main-ns</code> has a <code>:gen-class</code> in <code>mkCljBin</code></p>
</li>
</ul>
<h3 id="next-steps">Next steps</h3>
<p>Feedback welcome! For the second half of the round, I plan to continue working
on some minor improvements based on users feedback. If something is important to
you, feel free to leave a comment on any of the
<a href="https://github.com/jlesquembre/clj-nix/issues">current open issues</a>, or open a
new one.</p>
<p>I also want to add the option to configure a <code>clj-nix</code> build using
<a href="https://nixos.org/manual/nixos/stable/index.html#sec-writing-modules">NixOS modules</a>.
With a module interface, we don&rsquo;t need to expose the user to the internal
machinery of <code>clj-nix</code>. (The <code>NixOS modules</code> name is misleading, you can use
modules without NixOS. Projects like <a href="https://devenv.sh/">devenv</a> or
<a href="https://nix-community.github.io/home-manager/">home-manager</a> use that
approach). This is a big change, I don&rsquo;t think I&rsquo;ll be able to finish it in the
second half of the roundReport 1 Q2 2023 Funding Round. , but I&rsquo;ll start to work on it.<br></p>
<hr>
<h2 id="clojure-camp-daniel-higginbotham">Clojure Camp: Daniel Higginbotham</h2>
<p>Published 30 June 2023.  Q2 2023 Funding Round Report 1.</p>
<p>We are so grateful to Clojurists Together for funding Clojure Camp! Our next milestone is to expand our program to include two more study groups,  with two mentors and five students each. Over the past month, we’ve focused on clarifying and documenting the systems we’ve been using to effectively run a study group and help people learn Clojure.</p>
<p><strong>Accomplishments include:</strong></p>
<ul>
<li>Conducted weekly study group sessions with our first batch of learners</li>
<li>Began migrating ClojoDojo, a study partner pairing app, over to Clojure Camp</li>
<li>Made progress on setting up Clojure Camp operations, building out our digital workspaces for knowledge management</li>
<li>Documented our curriculum</li>
<li>Updated learner exercises<br></li>
</ul>
<hr>
<h2 id="emmy-sam-ritchie">Emmy: Sam Ritchie</h2>
<p>Published 3 July 2023.  Q2 2023 Funding Round Report 1.</p>
<h3 id="done-in-june">Done in June</h3>
<p>I cut a first release of the
<a href="https://github.com/mentat-collective/emmy-viewers">Emmy-Viewers</a> library last
week!</p>
<p>Emmy-Viewers currently contains powerful 2D and 3D plotting primitives,
based on the <a href="https://mafs.mentat.org">Mafs.cljs</a> and
<a href="https://mathbox.mentat.org">MathBox.cljs</a> libraries, as well as support for
embedding interactive controls into these 2D and 3D scenes using
<a href="https://leva.mentat.org">Leva.cljs</a>.</p>
<p>Here is an example of a namespace full of 3D plots:
<a href="https://emmy-viewers.mentat.org/dev/examples/mathbox/functions">https://emmy-viewers.mentat.org/dev/examples/mathbox/functions</a></p>
<p>This is a crazy powerful system, capable now of representing most of what you&rsquo;d
need for a math curriculum up through high school and on into graduate-level
physics and calculus.</p>
<h3 id="how-do-i-use-it">How do I use it?</h3>
<p>The developer experience goes like this. You:</p>
<ul>
<li>install Emmy-Viewers via <a href="https://clojars.org/org.mentat/emmy-viewers">Clojars</a> as a normal Clojure dependency</li>
<li>choose
<a href="https://github.com/mentat-collective/emmy-viewers#quickstart-via-portal">Portal</a>
or
<a href="https://github.com/mentat-collective/emmy-viewers#quickstart-via-clerk">Clerk</a>
as your presentation environment. (Only Clerk can handle 3D for now.)</li>
</ul>
<p>Once you&rsquo;ve configured a namespace using the <a href="https://github.com/mentat-collective/emmy-viewers">README
instructions</a>, you can use
the Emmy-Viewers API to write down values like this:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">mafs/of-x</span> sin {<span style="color:#e6db74">:color</span> <span style="color:#e6db74">:blue</span>})
</code></pre></div><p>And the presentation environment (Clerk, for example) will generate an
interactive scene:</p>
<p><img src="https://github.com/mentat-collective/emmy-viewers/assets/69635/446cd61f-0795-4375-bb67-4a2b687c9a2e" alt="Mafs plot example"></p>
<p>None of this requires any ClojureScript compilation; Emmy-Viewers works as a
pure Clojure dependency.</p>
<h3 id="examples">Examples</h3>
<p>The <a href="https://github.com/mentat-collective/emmy-viewers/tree/main/dev/examples">examples
directory</a>
in the Emmy-Viewers repo has a bunch of usage examples. Here are some highlights:</p>
<ul>
<li>2D examples gallery via Mafs: <a href="https://emmy-viewers.mentat.org/dev/examples/mafs">https://emmy-viewers.mentat.org/dev/examples/mafs</a></li>
<li>3D examples gallery via MathBox: <a href="https://emmy-viewers.mentat.org/dev/examples/mathbox/functions">https://emmy-viewers.mentat.org/dev/examples/mathbox/functions</a></li>
</ul>
<p>Both of these are actually FULLY EDITABLE in the browser! Open the links above
with <code>/edit</code> appended to the URL, and you&rsquo;ll see a mini IDE on the left side of
the page, with available commands listed at the bottom. Try changing values and
hitting option-Enter to re-evaluate the page. Any change you make will flow down
through the full namespace.</p>
<ul>
<li>editable 2D: <a href="https://emmy-viewers.mentat.org/dev/examples/mafs/edit">https://emmy-viewers.mentat.org/dev/examples/mafs/edit</a></li>
<li>editable 3D: <a href="https://emmy-viewers.mentat.org/dev/examples/mathbox/functions/edit">https://emmy-viewers.mentat.org/dev/examples/mathbox/functions/edit</a></li>
</ul>
<p>Some more examples:</p>
<ul>
<li>(p, q) torus knot: <a href="https://emmy-viewers.mentat.org/dev/examples/manifold/pq_knot">https://emmy-viewers.mentat.org/dev/examples/manifold/pq_knot</a></li>
<li>more 3D surfaces and manifolds: <a href="https://emmy-viewers.mentat.org/dev/examples/manifold/fdg">https://emmy-viewers.mentat.org/dev/examples/manifold/fdg</a></li>
<li>Klein bottles and mobius strips: <a href="https://emmy-viewers.mentat.org/dev/examples/manifold/klein">https://emmy-viewers.mentat.org/dev/examples/manifold/klein</a></li>
<li>3D geometry primitives: <a href="https://emmy-viewers.mentat.org/dev/examples/mathbox/geom">https://emmy-viewers.mentat.org/dev/examples/mathbox/geom</a></li>
</ul>
<p>Next we have some physics and differential equation simulations:</p>
<ul>
<li>Strange attractor: <a href="https://emmy-viewers.mentat.org/dev/examples/mathbox/ode">https://emmy-viewers.mentat.org/dev/examples/mathbox/ode</a></li>
<li>particle stuck on an ellipse: <a href="https://emmy-viewers.mentat.org/dev/examples/simulation/ellipsoid">https://emmy-viewers.mentat.org/dev/examples/simulation/ellipsoid</a></li>
<li>editable version!! <a href="https://emmy-viewers.mentat.org/dev/examples/simulation/ellipsoid/edit">https://emmy-viewers.mentat.org/dev/examples/simulation/ellipsoid/edit</a></li>
<li>two particles stuck together with a spring: <a href="https://emmy-viewers.mentat.org/dev/examples/simulation/double_ellipsoid">https://emmy-viewers.mentat.org/dev/examples/simulation/double_ellipsoid</a></li>
<li>geodesics of a torus: <a href="https://emmy-viewers.mentat.org/dev/examples/simulation/toroid">https://emmy-viewers.mentat.org/dev/examples/simulation/toroid</a></li>
</ul>
<h3 id="whats-next">What&rsquo;s Next?</h3>
<p>Next, I&rsquo;m going to use the exercises in Sussman&rsquo;s <a href="https://tgvaughan.github.io/sicm/">&ldquo;Structure and Interpretation
of Classical Mechanics&rdquo;</a> as a guide for
adding more physics-aware functions to the API. These exercises will serve as
examples and documentation.</p>
<p>I also want to think through how to improve this &ldquo;editable online&rdquo; experience by
possibly fleshing out the ability to save and persist these scenes, maybe by
integrating with <a href="https://maria.cloud/">https://maria.cloud/</a>.</p>
<p>Finally, there is a lot of work on the plotting API that would be great for new
contributors, like adding support for color schemes to the 3D plots. If you find
that interesting and would like to get involved, please let me know!<br></p>
<hr>
<h2 id="jank-jeaye-wilkerson">Jank: Jeaye Wilkerson</h2>
<p>Published 13 July 2023.  Q2 2023 Funding Round Report 1.</p>
<p>The terms of the work are to research a new object model for jank, with the goal of optimizing allocations, while also making jank code faster across the board. This is a half-way report and I&rsquo;m excited to share my results!</p>
<p>Please note that I have a very detailed breakdown of my work, the design choices made, and the implementation details here: <a href="https://jank-lang.org/blog/2023-07-08-object-model/">https://jank-lang.org/blog/2023-07-08-object-model/</a></p>
<p>To briefly summarize, I spent the first half of this quarter:</p>
<ol>
<li>Exploring the top ECS frameworks as an option for jank&rsquo;s object model</li>
<li>Prototyping a tagged object implementation</li>
<li>Benchmarking everything along the way</li>
</ol>
<h3 id="ecs">ECS</h3>
<p>The ECS frameworks aren&rsquo;t going to be a good fit, since they&rsquo;ll require multiple allocations per object and the key metric I&rsquo;m trying to shrink here is object allocation time. However, there are good learnings to be had around their data locality designs and judicious usage of compile-time computation to set the runtime up to be fast.</p>
<h3 id="tagged-objects">Tagged objects</h3>
<p>Most Clojure code is built using the same numbers, strings, maps, vectors, and lists. The hyper-polymorphic cases of completely custom types and protocols is not the general case and shouldn&rsquo;t have to impact the performance of it. I&rsquo;ve prototyped a solution which optimizes the default case of using Clojure&rsquo;s built-in types, while still allowing for entirely dynamic objects.</p>
<p>The results have been very promising.</p>
<h3 id="map-allocations">Map allocations</h3>
<p>Map allocations were the primary target. Details for why they were slow are in my blog post, but the new object model brings us within a very small margin of Clojure.</p>
<object type="image/svg+xml" data="https://jank-lang.org/img/blog/2023-07-08-object-model/allocations-tagged.plot.svg" width="50%">
  <img src="https://jank-lang.org/img/blog/2023-07-08-object-model/allocations-tagged.plot.svg" width="50%"></img>
</object>  
<h3 id="map-utilities">Map utilities</h3>
<p>Map utilities like count and get were already very fast, but the new object model cuts them down even more.</p>
<object type="image/svg+xml" data="https://jank-lang.org/img/blog/2023-07-08-object-model/extra-benchmarks.plot.svg" width="50%">
  <img src="https://jank-lang.org/img/blog/2023-07-08-object-model/extra-benchmarks.plot.svg" width="50%"></img>
</object>
<h3 id="whats-left">What&rsquo;s left?</h3>
<p>I&rsquo;m now ripping apart the jank runtime to add in the tagged object system. At the end of the quarter, I&rsquo;ll have holistic benchmarks showing the improvements across the board. These benefits, once integrated into jank, will impact every jank object. Numbers, strings, vectors, maps, lists, and so on will all be significantly faster to both allocate and use.<br></p>
<hr>
<h2 id="lucene-grep-dainius-jocas">Lucene Grep: Dainius Jocas</h2>
<p>Published 15 July 2023.  Q2 2023 Funding Round Report 1.</p>
<h3 id="tldr">TL;DR</h3>
<p>It was a little busy lately so my update is a bit uneventful.
But my summer holidays are coming and I hope to spend some quality time working on making the Lucene library a little easier to use for the fellow Clojurists.</p>
<h3 id="context">Context</h3>
<p>The goal of the project is to tear apart <code>lucene-grep</code> project into a bunch of libraries.<br>
<code>lucene-grep</code> is a CLI app that was created to scratch an itch of making Lucene to be compiled by GraalVM native image during the COVID lockdowns.
Due to the nature of the effort the code was not designed to be used elsewhere.
By participating in the Clojurist Together I want to refactor and re-design the existing codebase for reuse.</p>
<h3 id="updates-1">Updates</h3>
<p>As of now, out of the <code>lucene-grep</code> 3 libraries are extracted:</p>
<ul>
<li><a href="https://github.com/dainiusjocas/lucene-custom-analyzer">lucene-custom-analyzer</a>: data-driven Lucene Analyzers;</li>
<li><a href="https://github.com/dainiusjocas/lucene-query-parsing">lucene-query-parsing</a>: data-driven Lucene Query Parsers;</li>
<li><a href="https://github.com/dainiusjocas/lucene-text-analysis">lucene-text-analysis</a>: helpers to play with the Lucene Analyzers.</li>
</ul>
<p>All these libraries were updated to depend on the newest Lucene version.
I hope to write proper blog posts and/or demo apps with potential uses of the libraries.</p>
<h3 id="other-things-ive-worked-on">Other things I&rsquo;ve worked on</h3>
<p>I&rsquo;ve been having fun with other hacks.</p>
<h4 id="the-new-graalvm">The new GraalVM</h4>
<p>I&rsquo;ve upgrade <code>lucene-grep</code> to be compiled with the new <a href="https://github.com/dainiusjocas/lucene-grep/commit/7343db1413ef5d3c1c89547b091a1bdb7c5d2fe2">GraalVM</a>.
The biggest adventure there was that GraalVM changed the way how compile time environment variables are used.
Now, the env vars should be passed with <code>-E</code> <a href="https://www.graalvm.org/latest/reference-manual/native-image/overview/BuildOptions/#non-standard-options">property</a> e.g. <code>-ELMGREP_FEATURE_STEMPEL=true</code>.</p>
<h4 id="clerk-based-publishing">Clerk based publishing</h4>
<p>I&rsquo;ve set up a publishing system based on <a href="https://github.com/nextjournal/clerk">Clerk</a> and Github Pages: <a href="https://www.jocas.lt/journal/">journal</a>, <a href="https://github.com/dainiusjocas/journal">source</a>.
Hopefully, in the Journal I&rsquo;ll publish proper writeups and presentations of the work I&rsquo;m about to do in this project.</p>
<h3 id="what-is-next">What is next?</h3>
<p>In the coming months I want to design a Clojure library to use the Lucene Monitor Library.</p>
<h3 id="that-is-itbr">That is it!<br></h3>
<hr>
<h2 id="uncomplicate-neanderthal-clojure-cuda-deep-diamond-dragan-djuric">Uncomplicate Neanderthal, Clojure CUDA, Deep Diamond: Dragan Djuric</h2>
<p>Published 30 June 2023.  Q2 2023 Funding Round Report 1.</p>
<p>My goal with this round is to port Neanderthal, ClojureCUDA, and Deep Diamond to JavaCPP-based native libraries.</p>
<p>This first month was dedicated to the work on the first releasable version of the ClojureCPP library,
and on porting ClojureCUDA to the JavaCPP-provided bindings.</p>
<p>So far I&rsquo;ve been able to fully port ClojureCUDA, and to improve JavaCPP to the level that it could be released
as standalone library that does not require many changes.</p>
<p>Next month will be dedicated to porting Neanderthal&rsquo;s CPU and CUDA backends to use JavaCPP (via ClojureCPP).
I hope that I discovered and solved most hard problems by now, so this won&rsquo;t bring big surprises.
On the other hand, I expect do gather addition ideas for improvement and fixes in JavaCPP and JavaCUDA
during the Neanderthal port.</p>
<p>All in all, I feel that the project is on track and the progress goes as expected, which means that
I think I&rsquo;ll be able to port ClojureCUDA, Neanderthal, and Deep Diamond to ClojureCPP by the end
of the third month, to the level that I can release the new version of all 4 libraries.</p>
<p>What&rsquo;s equally important, I&rsquo;m using every opportunity to <em>improve</em> everything that I could,
instead of just taking the shortest cut at every corner. So the benefits will be felt long-term in
these libraries, as well as this domain in Clojure.</p>
<p>I released most of the resulting code in a couple of gigantic commits instead of many smaller ones because I didn&rsquo;t want any release to contain broken, non-compilable library.<br></p>
<hr>
<h2 id="portfolio-christian-johansen">Portfolio: Christian Johansen</h2>
<p>Published 14 July 2023.   Q2 2023 Funding Round Report 1.</p>
<p>In the first half of the Q2 funding period I have focused my work on the main
aspirations from my application: error handling, and improved first use
experience.</p>
<p>Portfolio now catches more errors than before, and also displays more helpful
information about them. As far as I can tell, Portfolio now catches and properly
handles and renders all runtime errors that you can produce from your code. A
new heads-up display was added to display some asynchronous errors that can&rsquo;t
necessarily be attributed to the currently rendered components. If you manage to
produce an error that is only visible in the browser console with the latest
version of Portfolio, please report it as a bug.</p>
<p>Portfolio now has a more friendly, and hopefully more helpful first use
experience. Documentation has been expanded and improved - and importantly - is
now self-hosted by Portfolio. When you first set up Portfolio, the UI displays
the relevant documentation to help you get fully started, and all of Portfolio&rsquo;s
documentation is always available via a new button in the sidebar. I will keep
working on the content for this solution.</p>
<p>The solution for self-hosting documentation still uses markdown files that can
be readily browsed on Github as well, so you don&rsquo;t have to run Portfolio to read
it. But when you do, you have relevant references close at hand.</p>
<p>Portfolio&rsquo;s React adapter has been upgraded with an error boundary that
integrates with the above described error handling features. It now also
supports using hooks directly in <code>defscene</code>.</p>
<p>I added a small REPL utility to Portfolio. You can now <code>tap&gt;</code> a component
instance, and Portfolio will render it in a temporary REPL folder.</p>
<p>Finally I have done some exploratory work on an accessibility extension to make
it easier to develop accessible components. I will continue this work in the
next half of the funding period.</p>
<p>The funding from Clojurists Together has allowed to me to set aside dedicated
time to focus on Portfolio, which has helped me raise the level of polish. For
this I am very grateful. Thank you all so much! 🙏</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2023 Long Term Projects: May and June Updates</title>
      <link>https://www.clojuriststogether.org/news/2023-long-term-projects-may-and-june-updates/</link>
      <pubDate>Thu, 06 Jul 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2023-long-term-projects-may-and-june-updates/</guid>
      <description>Hear from the 10 developers working on long term projects and a few Q1 2023 project updates</description>
      <content:encoded><![CDATA[<br>
There is a lot of work to catch up on! Our 10 developers working on long-term projects check in with their May and June project updates. We also have two updates from Q1 2023 projects (Donut and Adelph/Manifold).  
<br>
<h3 id="2023-long-term-projects">2023 Long-Term Projects</h3>
<p><a href="#bozhidar-batsov">Bozhidar Batsov</a><br>
<a href="#michiel-borkent">Michiel Borkent</a><br>
<a href="#sean-corfield">Sean Corfield</a><br>
<a href="#eric-dallo">Eric Dallo</a><br>
<a href="#christophe-grand">Christophe Grand</a><br>
<a href="#thomas-heller">Thomas Heller</a><br>
<a href="#nikita-prokopov">Nikita Prokopov</a><br>
<a href="#tommi-reiman">Tommi Reiman</a><br>
<a href="#peter-stromberg">Peter Stromberg</a><br>
<a href="#peter-taoussanis">Peter Taoussanis</a><br>
<br></p>
<h3 id="q1-2023-projects">Q1 2023 Projects</h3>
<p><a href="#alephmanifold-matthew-davidson">Aleph/Manifold: Matthew Davidson</a><br>
<a href="#donut-daniel-higginbotham">Donut: Daniel Higginbotham</a>
<br></p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<h3 id="cider">CIDER</h3>
<p>For the past few months the primary focus of my Clojure-related work was CIDER. We&rsquo;ve made some important steps toward the next release:</p>
<ul>
<li>We&rsquo;re working on a &ldquo;debug on error&rdquo; functionality (see <a href="https://github.com/clojure-emacs/cider/pull/3337">https://github.com/clojure-emacs/cider/pull/3337</a>) This also resulted in some internal improvements to the existing debugger codebase.</li>
<li>We&rsquo;re working on a new way to interact with application logs from CIDER, which we currently call &ldquo;cider-log-mode&rdquo; (see <a href="https://github.com/clojure-emacs/cider/pull/3352">https://github.com/clojure-emacs/cider/pull/3352</a>)
<ul>
<li>This also resulted in the creation of the standalone library <a href="https://github.com/clojure-emacs/logjam/">logjam</a>, which CIDER uses internally.</li>
</ul>
</li>
<li>We&rsquo;re now using the latest version of <code>compliment</code>, which comes which a bunch of code completion improvements (see <a href="https://github.com/alexander-yakushev/compliment/blob/master/CHANGELOG.md#0315-2023-06-22">https://github.com/alexander-yakushev/compliment/blob/master/CHANGELOG.md#0315-2023-06-22</a>)</li>
</ul>
<p>As usual the next release will also feature a few smaller improvements and bugfixes that you can peruse <a href="https://github.com/clojure-emacs/cider/blob/master/CHANGELOG.md">here</a>.  Just as importantly we&rsquo;ve started to discuss the plans for <a href="https://github.com/clojure-emacs/cider/issues/3356">CIDER 2.0</a>. Everyone&rsquo;s more than welcome to participate in the conversation there!</p>
<p>In other news:</p>
<ul>
<li>There&rsquo;s a small new bugfix release of clojure-mode (see <a href="https://github.com/clojure-emacs/clojure-mode/blob/master/CHANGELOG.md#5161-2023-06-26">https://github.com/clojure-emacs/clojure-mode/blob/master/CHANGELOG.md#5161-2023-06-26</a>)</li>
<li>There are also new releases of orchard and cider-nrepl</li>
<li>We&rsquo;re working on some improvements for refactor-nrepl and enrich-classpath<br></li>
</ul>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>In this post I&rsquo;ll give updates about open source I worked on during May and June 2023. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="sponsors">Sponsors</h3>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible!</p>
<p><strong>Top sponsors:</strong></p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://www.adgoji.com/">Adgoji</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<p><strong><a href="https://github.com/sponsors/borkdude">Github Sponsors</a>:</strong></p>
<ul>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch. On to the projects that I&rsquo;ve been working on!</p>
<h3 id="may-2023-updates">May 2023 Updates</h3>
<p>The following projects had updates in May 2023.  Note that only highlights are mentioned and not a full overview of all changes. See the project&rsquo;s changelogs for all changes.</p>
<ul>
<li>Preparations for <a href="https://github.com/babashka/conf">babashka conf</a> are in full swing and I&rsquo;m preparing a talk with the title &lsquo;Growing an ecosystem&rsquo;.</li>
<li>This month I&rsquo;ve had the honor to visit the JUXT 10 year anniversary in London and met a lot of fellow Clojurians over there.</li>
<li>Babashka and SCI will be featured at the last iteration of <a href="https://www.thestrangeloop.com/">Strange Loop</a>!</li>
<li>My OSS work is funded by Clojurists Together in <a href="https://www.clojuriststogether.org/news/q2-2023-funding-announcement/">Q2</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>Version 2023.05.18 - 2023.05.26 were released. Full changelogs <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">here</a>. Highlights:</li>
<li>Linter <code>:uninitialized-var</code> moved from default <code>:level :off</code> to <code>:warning</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2065">#2065</a>: new linter <code>:equals-true</code>: suggest using <code>(true? x)</code> over <code>(= true x)</code> (defaults to <code>:level :off</code>).</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2066">#2066</a>: new linters <code>:plus-one</code> and <code>:minus-one</code>: suggest using <code>(inc x)</code> over <code>(+ x 1)</code> (and similarly for <code>dec</code> and <code>-</code>, defaults to <code>:level :off</code>)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2058">#2058</a>: warn about <code>#()</code> and <code>#&quot;&quot;</code> in <code>.edn</code> files</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.
<ul>
<li>Released 1.3.180, mostly a maintenance release</li>
<li>See the complete <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">CHANGELOG</a></li>
</ul>
</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI
<ul>
<li><a href="https://github.com/babashka/scittle/issues/58">#58</a>: build system for creating scittle distribution with custom libraries. See <a href="https://github.com/babashka/scittle/tree/main/plugins/demo">plugins/demo</a>.</li>
<li>Use <code>window.location.hostname</code> for WebSocket connection instead of hardcoding <code>&quot;localhost&quot;</code> (<a href="https://github.com/pyrmont">@pyrmont</a>)</li>
<li>Upgrade <code>sci.configs</code> to <code>&quot;33bd51e53700b224b4cb5bda59eb21b62f962745&quot;</code></li>
<li>Update nREPL implementation: implement <code>eldoc</code> (<code>info</code>, <code>lookup</code>) (<a href="https://github.com/benjamin-asdf">@benjamin-asdf</a>)</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>Introduce all new programmatic <a href="https://github.com/borkdude/deps.clj/blob/master/API.md">API</a></li>
<li>Automatically use file when exceeding Windows argument length</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/deps.add-lib">deps.add-lib</a>: Clojure 1.12&rsquo;s add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI
<ul>
<li>First clojars release</li>
</ul>
</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI
<ul>
<li>Nbb is now compatible with <a href="https://bun.sh/">bun</a>. To run nbb in a bun project, use <code>bunx --bun nbb</code>.</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler
<ul>
<li>Fix import with <code>$default</code></li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a> Experimental ClojureScript to ES6 module compiler
<ul>
<li>Support <code>with-out-str</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: Babashka&rsquo;s http-client
<ul>
<li>Add <code>:authenticator</code> option</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.
<ul>
<li>This project now has a configuration for datascript, for anyone who wants to use SCI together with datascript. See <a href="https://github.com/babashka/sci.configs/commit/33bd51e53700b224b4cb5bda59eb21b62f962745">this</a> commit.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Support <code>:require-macros</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes
<ul>
<li>Support <code>:pre-start-fn</code> in <code>exec</code></li>
<li>Allow passing <code>:cmd</code> in map argument</li>
<li>Better testing for <code>exec</code> by <a href="https://github.com/lread">@lread</a></li>
</ul>
</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure
<ul>
<li><code>:paths</code> argument for <code>fs/which</code> by <a href="https://github.com/lread">@lread</a></li>
<li>Support inputstream in <code>fs/copy</code></li>
<li>Add <code>fs/owner</code> to return owner of file</li>
</ul>
</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in the past month.</p>
<ul>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata
<ul>
<li>Improvements for reading namespaced maps</li>
</ul>
</li>
<li><a href="https://github.com/babashka/book">babashka.book</a>: Babashka manual
<ul>
<li>Several corrections</li>
<li>Dynamic <code>:exec-args</code></li>
<li>Script-adjacent <code>bb.edn</code> docs</li>
</ul>
</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!
<ul>
<li>Support <code>--no-option</code> and parse as <code>{:option false}</code></li>
<li>Support grouped aliase like <code>-ome</code> as <code>{:o true, :m true, :e true}</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3
<ul>
<li>Better error message when connection is not a string</li>
</ul>
</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a>
<ul>
<li>Add transform function</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure
<ul>
<li>Add option to elide commas</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>: babashka filewatcher pod</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://borkdude.github.io/clj2el/">clj2el</a>: transpile Clojure to elisp</li>
<li><a href="https://github.com/borkdude/deflet">deflet</a>: make let-expressions REPL-friendly!</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter</li>
</ul>
<h3 id="june-2023-updates">June 2023 Updates</h3>
<p>First a few updates of what I&rsquo;ve been up to outside of sitting behind a screen. June was packed with two trips and a vacation so there aren&rsquo;t as many updates as usual.</p>
<ul>
<li><a href="https://babashka.org/conf/">Babashka-conf</a> happened June 10th in Berlin. It was more than I could have hoped for: a professionally organized event with the creative, positive, welcoming spirit we&rsquo;re used to from other Clojure conferences. Thanks everybody for coming out, especially to the speakers, organization and Malcolm + staff for recording the videos. You can view all the talks <a href="https://www.youtube.com/playlist?list=PLaN-rC-CjQqDu1AVhGdGOoEqsSAhd2W6t">here</a>. To see photos, comments, etc you can look for the #babashka_conf hash-tag on social media.</li>
<li>I&rsquo;ve had the pleasure to visit the JUXT 10th year anniversary this month in London. Check out <a href="https://www.youtube.com/watch?v=fT28NeZtaAg">this wonderful talk</a> by Alexander Davis on the state of frontend, with some nice comments about squint at the end.</li>
<li>End of June and beginning of July I&rsquo;m away on a <a href="https://twitter.com/borkdude/status/1674401271372042240">vacation</a> to Switzerland to recover a bit from all of this fun. I hope to take it easy on the coding and just relax a bit and recharge for what is to come next.</li>
<li>Babashka and SCI will be featured at the last iteration of <a href="https://www.thestrangeloop.com/">Strange Loop</a>!</li>
</ul>
<p>The following projects had updates in June. Note that only highlights are mentioned and not a full overview of all changes. See the project&rsquo;s changelogs for all changes.</p>
<ul>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler and <a href="https://github.com/squint-cljs/cherry">cherry</a> Experimental ClojureScript to ES6 module compiler
<ul>
<li>Both projects can now be used simultaneously in one build. The use case for this is when you have projects like <a href="https://github.com/nextjournal/clerk">clerk</a> that ship with multiple options for evaluating CLJS at runtime and you want to offer both squint and cherry as options.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases
<ul>
<li>Version 0.1.2 was released which contains upgrades of database drivers and next.jdbc library. Also a bug was fixed around mssql.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!
<ul>
<li>Implemented an alternative to <code>shutdown-agents</code> which does not kill threads when using an exec function, e.g. when spinning up a web server. Also see <a href="https://clojure.atlassian.net/browse/TDEPS-198">TDEPS-198</a>.</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI
<ul>
<li>Namespace state is now preserved over multiple blocks</li>
</ul>
</li>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li>Actively working towards a <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#unreleased">new release</a>, probably next month.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure
<ul>
<li>Add <code>gzip</code> and <code>gunzip</code> functions (thanks to Lauri Oherd)</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>Tried to improve the situation where the downloaded tools jar may be corrupt and causes trouble when calculating the classpath, using a crc32 check. See babashka <a href="https://github.com/babashka/babashka/issues/1576">issue</a>.</li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Support <code>:require-macros</code></li>
<li>Introduce <code>eval-string+</code> which received an optional initial <code>:ns</code> key and also returns the last active <code>:ns</code> so you can preserve the namespace state over multiple evaluations.</li>
<li>Released v0.8.40</li>
</ul>
</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes
<ul>
<li>Implement <code>:out :bytes</code> to receive output as bytes (thanks Hans Bugge Grathwohl)</li>
<li>Make <code>:dir</code> option accept <code>java.nio.file.Path</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting.
<ul>
<li>1575: fix command line parsing problem with -e + <code>*command-line-args*</code></li>
<li>1576: make downloading/unzipping of deps.clj tools .zip file more robust (see deps.clj)</li>
<li>released version 1.3.181</li>
<li>1581: bb <code>print-deps</code>: sort dependencies (thanks to Teodor Heggelund)</li>
<li>1579: add <code>clojure.tools.reader/resolve-symbol</code> built-in</li>
</ul>
</li>
</ul>
<h3 id="other-projects-1">Other projects</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in the past month.</p>
<ul>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: Babashka&rsquo;s http-client</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs.</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</li>
<li><a href="https://github.com/babashka/book">babashka.book</a>: Babashka manual</li>
<li><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a></li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>: babashka filewatcher pod</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://borkdude.github.io/clj2el/">clj2el</a>: transpile Clojure to elisp</li>
<li><a href="https://github.com/borkdude/deflet">deflet</a>: make let-expressions REPL-friendly!</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter</li>
<li><a href="https://github.com/borkdude/deps.add-lib">deps.add-lib</a>: Clojure 1.12&rsquo;s add-lib feature for leiningen and/or other environments without a specific version of the clojure CLI</li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>. <em>Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></em><br></p>
<hr>
<h2 id="sean-corfield">Sean Corfield</h2>
<p>In my <a href="https://corfield.org/blog/2023/04/30/long-term-funding-2/">previous Long-Term Funding update</a> I said I would review/overhaul the Libraries pages (both authoring and the directory) and write the <code>tools.build</code> cookbook.</p>
<p>The <a href="https://clojure-doc.org/articles/ecosystem/libraries_authoring/">library authoring guide</a> has been rewritten to use the Clojure CLI, <code>deps-new</code>, and <code>deps-deploy</code> and was well-received by the community, who provided some useful feedback that I have also incorporated into the guide. The information from the library directory has been integrated into <a href="https://www.clojure-toolbox.com/">The Clojure Toolbox</a> via a couple of Pull Requests that <a href="https://github.com/weavejester/clojure-toolbox.com/pull/470">added optional tool-tip descriptions</a> and <a href="https://github.com/weavejester/clojure-toolbox.com/pull/472">libraries that were on <code>clojure-doc</code></a> but missing from the Toolbox. Thanks to James Reeves for accepting those PRs!</p>
<p>What else did I get done?&lt;!&ndash;more&ndash;&gt;</p>
<h3 id="clojureclr-honeysql">ClojureCLR, HoneySQL</h3>
<p>There&rsquo;s been quite a bit of activity around <a href="https://github.com/clojure/clojure-clr">ClojureCLR</a> recently, so I&rsquo;ve been testing .NET-related things on Windows and on Ubuntu. David Miller submitted a patch to <code>tools.cli</code> to add CLR support which I released as <a href="https://github.com/clojure/tools.cli/releases/tag/v1.0.219"><code>tools.cli</code> v1.0.219</a> and I updated HoneySQL to add CLR support:
<a href="https://github.com/seancorfield/honeysql/releases/tag/v2.4.1033"><code>honeysql</code> v2.4.1033</a>.</p>
<p><code>tools.nrepl</code> has been ported to ClojureCLR and Peter Strömberg (maintainer of Calva) has created a <a href="https://github.com/PEZ/clojure-clr-starter">ClojureCLR starter project for VS Code/Calva</a> which I&rsquo;ve also been helping to test on Windows and Ubuntu.</p>
<p>HoneySQL saw another release, mostly improving documentation and docstrings, near the end of the this period: <a href="https://github.com/seancorfield/honeysql/releases/tag/v2.4.1045">v2.4.1045</a>. Both releases improved the experience with <code>:on-conflict</code> clauses.</p>
<h2 id="nextjdbc"><code>next.jdbc</code></h2>
<p><a href="https://github.com/seancorfield/next-jdbc/releases/tag/v1.3.883"><code>next.jdbc</code> v1.3.883</a> was also released in this period, also mostly improving documentation and docstrings, and adding an <code>active-tx?</code> predicate to expose whether <code>next.jdbc</code> thinks you are currently in a <code>with-transaction</code> context.</p>
<h2 id="clojure-docorg"><code>clojure-doc.org</code></h2>
<p>All of the content from the library directory has been incorporated into The Clojure Toolbox at this point. Every library that was previously listed on <code>clojure-doc.org</code> is now listed on the Toolbox and all of the one-line descriptions have been added to the Toolbox as well (which now show up as tooltips when you hover over the library name/link). The Toolbox still has a lot of libraries listed without descriptions so, hopefully, that&rsquo;s something the community can add over time (or help James with automating, using project descriptions from GitHub, perhaps?).</p>
<p>The library authoring guide has been substantially rewritten to use the Clojure CLI, <code>deps.edn</code>, and <code>build.clj</code>. The old Leiningen-based library authoring guide has been lightly updated and is still available, linked from the new guide.</p>
<p>In addition to the library work mentioned above, I&rsquo;ve been working on the <a href="https://clojure-doc.org/articles/cookbooks/cli_build_projects/"><code>tools.build</code> cookbook</a>. I shared an early draft to get community feedback and then shared the completed version this week. The whole thing is over 3,000 words now, with a lot of code examples. I&rsquo;ve tried to distill everything I&rsquo;ve learned about <code>tools.build</code> into a single document that covers various scenarios that go beyond what is in the <a href="https://clojure.org/guides/tools_build">official <code>tools.build</code> guide</a>.</p>
<p>Some additional community feedback has already been incorporated and more will be incorporated over the next few weeks, I expect.</p>
<h3 id="whats-next">What&rsquo;s Next?</h3>
<p>In July/August, I&rsquo;m hoping to complete a review and update of both the &ldquo;ecosystem&rdquo; and &ldquo;tutorials&rdquo; section of clojure-doc.org, and then in the two remaining periods, I&rsquo;ll tackle the &ldquo;cookbooks&rdquo; and &ldquo;language&rdquo; sections.</p>
<h3 id="on-a-personal-note">On a personal note…</h3>
<p>I mentioned in the previous update that my mother was in hospital and I want to thank everyone who reached out to me with kind words and support. She came home and was doing well for a while but then she had another fall and she&rsquo;s back in hospital as I write this, this time with severe anemia on top of her other issues. She&rsquo;s had a blood transfusion and seems to be doing better but we don&rsquo;t know when she&rsquo;ll be home. It&rsquo;s times like these when I really do feel the five and a half thousand miles between us&hellip;<br></p>
<p>{:tags [&ldquo;clojure&rdquo; &ldquo;clojure-doc.org&rdquo; &ldquo;honeysql&rdquo; &ldquo;clojure-clr&rdquo; &ldquo;jdbc&rdquo; &ldquo;open source&rdquo; &ldquo;community&rdquo; &ldquo;clojurists together&rdquo;]}<br></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>During these 2 months, I mainly focused on improving clojure-lsp, fixing bugs and adding some features mentioned above, especially improving the java support.
Also, I&rsquo;ve been working for some months now in a new Intellij plugin called <strong>clojure-lsp-intellij</strong>, which I should finish the alpha and announce soon!</p>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io">clojure-lsp</a></h3>
<p><strong>Main highlights:</strong></p>
<ul>
<li>Recently I focused on java interop improvements in both clojure-lsp and clj-kondo, so now we have more java analysis to provide features, we have now hover doc (pic1) and completion for java static members! We still have to enhance clj-kondo and lsp to be able to provide for all java usages besides static ones only, but it&rsquo;s a huge start!</li>
<li>Keywords completions are now smarter, checking other namespaces and sorting better.</li>
<li>We have more visual feedbacks when LSP is doing post start tasks in the editor.</li>
<li>clojure-lsp now understands ClojureDart projects!<br>
<img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/23e47178-ee3b-433c-981b-36ecd05983a8" alt="hover-java-signature"></li>
</ul>
<h4 id="20230504-193801">2023.05.04-19.38.01</h4>
<p><strong>General</strong></p>
<ul>
<li>Bump clj-kondo to <code>2023.04.15-20230503.152749-8</code></li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>Fix edn tree to consider symbols. #1556</li>
<li>Fix edn tree to consider vector root nodes. #1557</li>
<li>Fix edn tree to handle invalid edn code and not throw exceptions while typing code.</li>
</ul>
<p><strong>API/CLI</strong></p>
<ul>
<li>Avoid enabling unecessary analysis features for API/CLI lint, improving memory usage.</li>
</ul>
<h4 id="20230701-223541">2023.07.01-22.35.41</h4>
<p><strong>General</strong></p>
<ul>
<li>Update flake.nix to build with babashka. #1373</li>
<li>Bump clj-kondo to <code>2023.06.02-20230630.144012-16</code>.</li>
<li>Improve support for ClojureDart <code>.cljd</code> files. #1589</li>
<li>Slightly reduce OutOfMemory exceptions that may happen with the JVM version.</li>
<li>Support ignore unused-public-vars via <code>:linters :clojure-lsp/unused-public-var :exclude-when-contains-meta</code> clj-kondo setting.</li>
<li>Fix restructure-keys when map has an <code>:or</code>. #1583</li>
<li>Bump lsp4clj to <code>1.8.0</code>.</li>
<li>Add post startup tasks progress feedbacks, like &ldquo;Generating stubs&rdquo;, &ldquo;Analyzing JDK source&rdquo; and &ldquo;Fetching Clojars&rdquo;.</li>
<li>Bump cljfmt to <code>0.10.6</code>. #1605</li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>New code actions: <code>Replace ':refer :all' with ':refer [my-refer]'</code> and <code>Replace ':refer :all' with alias</code>. #1575</li>
<li>Enhance java support for hover and completion of static class members.</li>
<li>Improve <code>:paths-ignore-regex</code> to ignore features avoiding impact in huge files that are intented to be excluded.</li>
<li>Fixed semantic-tokens for full qualified namespace</li>
<li>Add <code>score</code> to completion items for a better completion client sorting. #1595</li>
<li>Revamp keyword completion. #1599</li>
<li>Avoid LSP errors when cleaning a file without namespaces. #1603</li>
</ul>
<p><strong>API/CLI</strong></p>
<ul>
<li>New feature: Find all references via API and CLI. #1572</li>
</ul>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo/">clj-kondo</a></h3>
<p><a href="https://github.com/clj-kondo/clj-kondo/pull/2106">#2106</a>: Support <code>.cljd</code> files as source files.</p>
<h3 id="jetelhttpsgithubcomericdallojetel"><a href="https://github.com/ericdallo/jet.el">jet.el</a></h3>
<p><a href="https://github.com/ericdallo/jet.el/issues/7">#7</a>: json with ' (single quote) fails to convert to edn.<br></p>
<hr>
<h2 id="christophe-grand">Christophe Grand</h2>
<h3 id="clojuredart">ClojureDart</h3>
<p>The period started on the Conj heels and we were all pumped up. We&rsquo;re seeing a steady influx of new users. With more users we spent more time supporting them but experienced users are starting to help too, and we are getting more PRs, it&rsquo;s a good sign!</p>
<p>Two of the &ldquo;future work&rdquo; items of previous update have landed during this period: Dart 3 support and the new reader.</p>
<p>Last, we started publishing short videos on Youtube <a href="https://www.youtube.com/@clojuredart/shorts">https://www.youtube.com/@clojuredart/shorts</a> (Don&rsquo;t check your speakers they don&rsquo;t have audio.)</p>
<h4 id="fixes">Fixes</h4>
<p>Several fixes to the compiler, cljd.core or flutter.cljd.</p>
<p>Amongst them:</p>
<ul>
<li><code>rseq</code> wasn&rsquo;t behaving properly on vectors whose size was a multiple of 32,</li>
<li>some code was improperly optimized away when a <code>throw</code> appeared in some nested <code>if</code>s in statement position,</li>
<li>widgets below a <code>:vsync</code> were not refresh on app state changes, only on animation updates,</li>
<li>issues with <code>set!</code> expressions used in argument position,</li>
<li>potential double evaluation when casting to a nullable type,</li>
<li>&hellip;</li>
</ul>
<h4 id="improvements">Improvements</h4>
<ul>
<li>Tear-offs of default constructors. Dart has this feature that a method (or even a constructor) can be &ldquo;torn off&rdquo;: if you don&rsquo;t specify an argument list you get a closure over the object with the same signature as the method (same idea for constructors &ndash; if you don&rsquo;t know Dart: Dart doesn&rsquo;t support overloading so constructors (but the default) are named, they are just static methods).</li>
<li>Documentation on generics</li>
<li>Documenting the fact that defs are initialized on demand and not eagerly.</li>
<li>We started populating a FAQ</li>
<li>We spent a lot of time improving compilation time (we found a lot of small gains until we finally found the function with a quadratic runtime), some users saw their recompilation time go from almost 2 minutes to a couple of seconds.</li>
<li>more samples (Wevbiew, FFI to C)</li>
<li>require named</li>
<li><code>some</code> and <code>every?</code> are now based on <code>reduce</code> to avoid sequences</li>
<li>inst literals can now appear in source code,br&gt;</li>
</ul>
<h4 id="new-features">New features</h4>
<ul>
<li>Dart 3. Dart 3 supports landed in two times: first a couple of days after the release of Dart 3 which made sure that ClojrueDart was compiling to proper Dart 3 (because Dart 3 has breaking changes over Dart 2.12 &ndash; but we can still target Dart 2, we autodetect which one is used). Then in a second time we got records support &ndash; Dart records are immutable typed tuples and are a new feature of Dart 3.</li>
<li>Finally the new reader (which can be used asynchronously if a stream is consue but synchronously when reading a string) landed. Support for tagged literals is still in the work.</li>
<li>We ported <code>clojure.set</code> (and its tests) as <code>cljd.set</code>, it was mostly a copy/paste &amp; tweak port.</li>
</ul>
<h4 id="future-work-clojuredart">Future work: ClojureDart</h4>
<ul>
<li>Add tagged literals to the reader</li>
<li>We have found a path allowing a Flutter-only REPL could be hacked in a couple of days, is it still worth the hack?</li>
<li>Look into porting Datascript and SCI to ClojureDart</li>
<li>New APIs to leverage our persistent data structures:
<ul>
<li>maps (hash and sorted) in ClojureDart are original implementations (not the same as CLJ/CLJS) &ndash; hash maps could be seen as another refinement of the original, sorted maps constitute a novel implementation.</li>
<li>Sorted colls should be good enough for direct use by Datascript.</li>
<li>Both hash and sorted maps can support accelerated merge/diff/join/etc. operations.</li>
</ul>
</li>
<li>Multimethods</li>
<li><code>cljd</code> CLI written in <code>cljd</code> for easier project creation etc.</li>
<li>gen tests</li>
<li>&hellip;<br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<h3 id="shadow-cljs">shadow-cljs</h3>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p><strong>Current shadow-cljs version: 2.24.1</strong>  <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p><strong>Notable Updates</strong></p>
<ul>
<li>Added full support for <code>package.json</code> <code>&quot;exports&quot;</code> since its use has become more widespread.<br></li>
</ul>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Less releases these last two months, more research and reports.</p>
<h3 id="datascripthttpsgithubcomtonskydatascript"><a href="https://github.com/tonsky/datascript">DataScript</a>:</h3>
<ul>
<li>Lots of small optimizations for ClojureScript version (who would’ve thought that declare or case could be slow?), with roughly up to 7% perf improvements across the board.</li>
<li>Prototyping faster “index sub-slicing” for cases when you e.g. need to find values of the same attribute accross many entities. Seeing up to 30% improvements for this particular case on Roam 3M datoms graph.</li>
</ul>
<h3 id="humble-uihttpsgithubcomhumbleuihumbleui"><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a>:</h3>
<ul>
<li>Prototyping state management solution based on signals</li>
</ul>
<h3 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/clojure-sublimed">Clojure Sublimed</a>:</h3>
<ul>
<li>Better indenting of reader conditionals (turned out they use parentheses, but their content is more like a map).</li>
</ul>
<h3 id="blogging">Blogging:</h3>
<ul>
<li><a href="https://tonsky.me/blog/humble-signals/">Humble Chronicles: Managing State with Signals</a>. Some research about what to do with components in Humble UI.</li>
<li><a href="https://tonsky.me/blog/clojurescript-2/">A Case for ClojureScript 2.0</a>. Some reflection on why ClojureScript feels so different from Clojure and where I think it should be going.<br></li>
</ul>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>Had a busy 2 months and did not have enough focus time to deliver the things I planned on OS. Just started my 9 week summer vacation, will be few weeks off the grid, but then will jump back into OS.</p>
<h3 id="malli">Malli</h3>
<ul>
<li>Continued with the <a href="https://github.com/metosin/malli/issues/264">new effective type system</a> - WIP</li>
<li>Working with Schema inheritance (optional, solving real-world problems), WIP</li>
</ul>
<h3 id="reitit">Reitit</h3>
<ul>
<li>Work on the upcoming 0.7.0 Version, with 5 new alpha releases. Thanks for all the alpha-testers!</li>
<li>Managed to fix <a href="https://github.com/metosin/reitit/issues/422">a foundational issue</a> by <a href="https://github.com/metosin/reitit/pull/626">Introducing two-phase Schema compilation</a></li>
<li>Goal was to ship the 0.7.0 out in June, but ended up not being happy with the new syntax and started to do <a href="https://github.com/metosin/reitit/pull/628">a big refactor</a> on it. Almost done.</li>
</ul>
<h3 id="something-else">Something else</h3>
<p>Summer.</p>
<p><img src="https://user-images.githubusercontent.com/567532/250184909-55f636ae-5e3a-4a10-b6fc-38c4749ce2fb.png" alt="summer"></p>
<br>
<h2 id="peter-stromberg">Peter Stromberg</h2>
<p>As usual the bulk of my open source energy is poured into <a href="https://calva.io/">Calva</a>, a <a href="https://clojure.org/">Clojure</a>/<a href="https://clojurescript.org/">ClojureScript</a>/<a href="https://github.com/clojure/clojure-clr">ClojureCLR</a>/<a href="https://github.com/Tensegritics/ClojureDart">ClojureDart</a>/<a href="https://babashka.org/">Babashka</a>/<a href="https://github.com/babashka/nbb">nbb</a>/<a href="https://marketplace.visualstudio.com/items?itemName=betterthantomorrow.joyride">Joyride</a> /etcetera development environment that <a href="https://www.youtube.com/watch?v%253DL0-yDtVUWMQ">takes Interactive Programming seriously</a>.</p>
<p>I also got to contribute to Clojure-related starter projects and was interviewed for Flexiana&rsquo;s new <strong>Clojure Corner</strong> series: <a href="https://flexiana.com/2023/06/clojure-corner-with-pez">Clojure Corner with Peter Strömberg</a></p>
<h3 id="calva">Calva</h3>
<p>Over at Twitter someone asked me if I was up to something exciting. Implicitly wondering if Calva was about to get some cool new big thing (I think). My answer was that it is mostly about maintenance currently. However,
<strong>I find Calva maintenance exciting</strong>!</p>
<p>Maintenance has many aspects. Is the documentation helpful? Are there bugs that create that extra friction making them a priority? Is there some feature that could be made more powerful with some change? What about some new features I feel curious about and that I can finish with one or two late-night hacking sessions? The best part: <strong>I get to talk to Calva users</strong> and consider their feedback, questions and suggestions.</p>
<p>Here&rsquo;s a summary of Calva maintenance May + June 2023. I&rsquo;m including some of the rationales, to give you a feel for how we reason when maintaining Calva. Wall of text:</p>
<ul>
<li>
<p>Calva now makes an effort to try <strong>format code with incomplete structure</strong> (missing opening or closing brackets). This is common when formatting a selection, or formatting pasted code. It gets extra important for beginners who do not ”see” the structure as clearly as us with experience from Clojure or some other LISP(s). Not being familiar with the structure also makes you less likely to use Calva&rsquo;s structural editing power. Having the broken code formatted helps in highlighting the structure and what is missing from it. While at it we also got some glitches with format-on-paste feature fixed. It&rsquo;s a bit more complicated than you might think, as <a href="https://github.com/BetterThanTomorrow/calva/issues/2236">this issue</a> might illustrate. Thanks <a href="https://github.com/mrkam2">Alexander Kouznetsov</a> for the help in figuring this out!</p>
</li>
<li>
<p>Closing/fixing incomplete structure is not new in Calva. It has been used for Calva&rsquo;s commands for evaluating <em>to the cursor</em> from arbitrary deep <em>before the cursor</em>. Which is very handy for investigating the steps in threads with the REPL, and for including <code>let</code> bindings in what is evaluated. It has so far not been available for your <a href="https://calva.io/custom-commands/">custom REPL evaluation commands</a>, which is now fixed with the <code>$selection-closing-brackets</code> interpolation variable.</p>
</li>
<li>
<p>The <a href="https://calva.io/custom-commands/">Custom REPL Commands</a> have been available only from Clojure files. This is now changed so that you can fire these commands from any file, as long as the REPL is connected. Good for <a href="https://clerk.vision/">Clerk</a> Markdown Notebooks, which was the driver for this change.</p>
</li>
<li>
<p>The command <strong>Expand Selection</strong> now considers binding pairs, making it easy to select key/value paris in maps or bindings in <code>let</code> boxes, etcetera.</p>
</li>
<li>
<p><a href="https://github.com/svdo">Stefan van den Oord</a> fixed a long standing and mysterious issue we have had with the <strong>deps.edn + shadow-cljs</strong> <a href="https://calva.io/connect-sequences/">REPL connect sequence</a>. It turned out we didn&rsquo;t handle the case of selecting multiple <a href="https://github.com/thheller/shadow-cljs">shadow-cljs</a> launch builds. (This is correctly handled for the <strong>shadow-cljs</strong> sequence, making our suggestion to use this sequence instead work as a ”solution”.)</p>
</li>
<li>
<p>Selecting a <code>deps.edn</code> alias that provides <code>:main-opts</code> can break Calva&rsquo;s connection of the REPL, because calva provides its own main-opts to start the nREPL server. The warning message Calva used to put up worked to help users navigate around this, but it was also terribly confusing. Thanks to <a href="https://github.com/dustingetz">Dustin Getz</a> and <a href="https://github.com/seancorfield">Sean Corfield</a> for helping with finding a better Ux!</p>
</li>
<li>
<p>Connecting a <a href="https://github.com/thheller/shadow-cljs">shadow-cljs</a> REPL is now a more managed process than it used to be. I&rsquo;m already noticing a drop in user support time for this. Freeing up you users and us Calva maintainers for higher level conversations. 😀</p>
</li>
<li>
<p>Traditionally <a href="https://calva.io/connect-sequences/">REPL connect sequences</a> have been intended per workspace. <a href="https://babashka.org/">Babashka</a> changes this. To fire up a Babashka REPL often the built in sequence works fine, but if you want to start it in WSL&hellip; Now you can define these sequences both globally and locally. Starting Babashka in WSL and connecting VS Code is simplified with a sequence like this one defined in your User VS Code settings file:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-json" data-lang="json">
  <span style="color:#e6db74">&#34;calva.replConnectSequences&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> [

    {

      <span style="color:#f92672">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;Bashbabka (WSL)&#34;</span>,

      <span style="color:#f92672">&#34;projectType&#34;</span>: <span style="color:#e6db74">&#34;custom&#34;</span>,

      <span style="color:#f92672">&#34;customJackInCommandLine&#34;</span>: <span style="color:#e6db74">&#34;bash -c &#39;bb --nrepl-server JACK-IN-NREPL-PORT&#39;&#34;</span>,

    },

  ]<span style="color:#960050;background-color:#1e0010">,</span>

</code></pre></div></li>
<li>
<p>Actually, in order to support ^that^ sequence we also needed to add support for fully custom connect sequences. The <code>&quot;custom&quot;</code> project type is new since a few weeks.</p>
</li>
<li>
<p><a href="https://calva.io/notebooks/">Calva Notebooks</a> are a bit of a special take on notebooks in that we insist that any Clojure file can be a notebook. This has been more than a tiny bit hampered by that evaluating a notebook has also evaluated the Rich Comments in there&hellip; This is now fixed. You dare evaluate a Calva Notebook if you dare evaluate the file in its regular form.</p>
</li>
<li>
<p>There were also numerous small fixes and things happening that I either skip mentioning here, or that I have forgotten about. 😀</p>
</li>
<li>
<p>For a few days of this period I was <a href="https://hbr.org/2000/07/stop-fighting-fires">fire fighting</a>. My changes introduced regressions, and my fixes for the regressions introduced regressions. Nothing super major, but there is a promise we want to keep with Calva: <strong>We prioritize regressions that we introduce.</strong> As can be picked up in <a href="https://calva.io/tao/">The Tao of Calva</a>: Moving fast is great. Breaking things is fine, <strong>as long as you fix them fast</strong>.</p>
</li>
</ul>
<h3 id="starter-projects">Starter projects</h3>
<p>I am a big fan of small starter projects. They can load a lot of experimentation and failure experience into a simple and approachable package that is easy for beginners and non-beginners alike to pick up and use. Hopefully for a quicker and smoother experience than the starter project creator had. Hereby I am encouraging you all to consider this when you have experimented with some tech stack, or tech stack component. It is my experience that I learn better from creating them as well. Both by the activity of structuring the project and writing the README in a way that I can hope is understandable, and from the feedback and contributions I get from others trying to use my project.</p>
<p>Anyway. This period around I created one new starter project and gave some love to an old and still popular one.</p>
<ul>
<li>
<p><a href="https://github.com/PEZ/clojure-clr-starter">Dockerized ClojureCLR Starter Project</a>. Celebrating that <a href="https://github.com/clojure/clojure-clr">ClojureCLR</a> got <a href="https://github.com/clojure/clr.tools.nrepl">a new nREPL server</a>, and confirming that it works well with Calva, the result was a starter project. As I am on a Mac and don&rsquo;t have reasons for having .Net installed, I choose to use Docker Compose to set the project up. This also makes it super quick to go from Zero to a ClojureCLR REPL running and connected to your editor. Special Calva convenience added. Please consider contributing configuration for your favorite Clojure IDE.</p>
</li>
<li>
<p><a href="https://github.com/PEZ/rn-rf-shadow">rn-rf-shadow</a> is a <a href="https://clojurescript.org/">ClojureScript</a> + <a href="https://reagent-project.github.io/">Reagent</a> + <a href="https://day8.github.io/re-frame/re-frame/">re-frame</a> + <a href="https://reactnative.dev/">React Native</a> starter project, powered by <a href="https://github.com/thheller/shadow-cljs">shadow-cljs</a> and <a href="https://expo.dev/">Expo</a>. It has helped a quite a few ClojureScript React Native projects to get started.</p>
<ul>
<li>
<p>It is now up-to-date with latest React, latest Reagent, latest everything.</p>
</li>
<li>
<p>The dependency bumps were the result of me adding <a href="https://reactnavigation.org/">React Navigation</a> to the project. This makes sense for a lot of projects and is easy enough to rip out if your project does not need it. There is now also <a href="https://github.com/PEZ/rn-rf-shadow/blob/pez/try-countdown-circle-timer/src/main/example/app.cljs#L37">a branch</a> demonstrating how to use React Native libraries, in this case the <a href="https://www.npmjs.com/package/react-native-countdown-circle-timer">react-native-countdown-timer</a> (no README update for this yet).</p>
</li>
</ul>
</li>
</ul>
<h3 id="please-follow-me">Please follow me</h3>
<ul>
<li>I&rsquo;m <a href="https://github.com/PEZ">@PEZ</a> on Github.</li>
<li>I&rsquo;m <a href="https://twitter.com/pappapez">@pappapez</a> on Twitter.</li>
</ul>
<h3 id="thanks-for-sponsoring-me-">Thanks for sponsoring me! ❤️</h3>
<ul>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a>: This long term sponsoring is fantastic. It makes wonders for how I can fit open source contributions into my family life.</li>
<li><a href="https://github.com/sponsors/PEZ#sponsors">Github Sponsors</a>: Same here, it&rsquo;s long term and it makes my family respect Clojure, Calva, Open Source and that I want to spend time with it.<br></li>
</ul>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>You can read more from Peter at <a href="https://www.taoensso.com/">Peter Taoussanis</a></p>
<h3 id="recent-releases-include">Recent releases include:</h3>
<ul>
<li><a href="https://github.com/ptaoussanis/sente">Sente</a>: <code>v1.18.0</code> - see <a href="https://github.com/ptaoussanis/sente/releases">release notes</a> for details</li>
<li><a href="https://github.com/ptaoussanis/timbre">Timbre</a>: <code>v6.2.1</code> - see <a href="https://github.com/ptaoussanis/timbre/releases">release notes</a> for details</li>
<li><a href="https://github.com/http-kit/http-kit">http-kit</a>: <code>v2.7.0</code> - see <a href="https://github.com/http-kit/http-kit/releases">release notes</a> for details</li>
</ul>
<h3 id="upcoming-work">Upcoming work:</h3>
<ul>
<li><a href="https://github.com/ptaoussanis/carmine">Carmine</a> <code>v3.3.0-RC1</code> will be out in the first week of July. This includes a rewrite of Carmine&rsquo;s message queue system, with major improvements in mq performance, observability, and documentation.</li>
<li><a href="https://github.com/ptaoussanis/tempel">Tempel</a> <code>v1.0.0-beta1</code> is still on track for end of August, more info on that closer the time.</li>
<li>Moving forward, all my libraries will include testing for GraalVM when relevant. Thanks to Michiel Borkent for Babashka, and for his assistance with testing.
As usual, my current open-source plan is available <a href="https://www.taoensso.com/clojure/2023">here</a>.</li>
</ul>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="https://github.com/sponsors/ptaoussanis#sponsors">other sponsors</a> of my open-source work 🙏 <br></p>
<hr>
<h2 id="q2-2023-project-updates">Q2 2023 Project Updates</h2>
<h2 id="alephmanifold-matthew-davidson">Aleph/Manifold: Matthew Davidson</h2>
<p>(Report 2. Published 30 June 2023)</p>
<h3 id="http2-support">HTTP/2 support</h3>
<ul>
<li>Client-side HTTP/2 is now generally available, as of 0.7.0-alpha1</li>
<li>H2C cleartext is now supported (use with caution)</li>
</ul>
<h3 id="other-aleph-changes">Other Aleph changes</h3>
<ul>
<li><em>Massive</em> refactoring of Aleph internals</li>
<li>Much better documented</li>
<li>Split up pipelines for multiplex codec</li>
<li>Added helper Java classes for channel initialization and ALPN negotiation</li>
<li>Added pr support for Netty classes<br></li>
</ul>
<hr>
<h2 id="donut-daniel-higginbotham">Donut: Daniel Higginbotham</h2>
<p>(Report 2 Published 25 May, 2023)<br>
Over the last couple months I&rsquo;ve made a lot of changes across the Donut ecosystem to get the framework closer to realizing the vision of providing a foundation for building single-page apps. I&rsquo;ve focused on creating a cookie-based auth plugin that provides both backend API endpoints and frontend components.</p>
<p>Per-repo changes include:</p>
<h3 id="donut-partyendpointhttpsgithubcomdonut-partyendpoint"><a href="https://github.com/donut-party/endpoint">donut-party/endpoint</a></h3>
<p>This repo provides components you can add to your system to configure it for serving HTTP API requests.</p>
<ul>
<li><strong>Added <code>ServerComponent</code> donut.system components</strong><br>
This encapsulates a default configuration for running a jetty server</li>
<li><strong>Added <code>HTTPComponentGroup</code> donut.system component group and <code>http-plugin</code> plugin</strong><br>
These make it possible for a developer to add a collection of donut.system components to their system with just a lien of code</li>
<li><strong>Improved docstrings</strong></li>
</ul>
<h3 id="donut-partyendpoint-testhttpsgithubcomdonut-partyendpoint-test"><a href="https://github.com/donut-party/endpoint-test">donut-party/endpoint-test</a></h3>
<p>This repo provides a test harness for applications that use donut.system and donut.endpoint to define API handlers. It handles system setup/teardown and provides helpers to:</p>
<ul>
<li>Construct endpoint paths</li>
<li>Send requests to your app&rsquo;s request handler</li>
<li>Parse responses back into Clojure data structures</li>
</ul>
<p>Updates:</p>
<ul>
<li><strong>Updated plugin definition to use latest syntax from donut.system</strong>
I&rsquo;d updated donut.system&rsquo;s plugin syntax to be more readable and more data-oriented, and this required an update to <code>donut.endpoint.test.harness/test-harness-plugin</code>. The plugin provides some default configuration for the library&rsquo;s helpers.</li>
<li><strong>Revised interface for request helpers</strong><br>
I significantly rewrote the interface for request handlers to take a single argument, a map, rather than relying on variadic positional arguments. I found the positional arguments too difficult to remember and not as readable.</li>
<li><strong>Added a README</strong></li>
<li><strong>Added support for edn content-type</strong></li>
</ul>
<h3 id="donut-partyfrontendhttpsgithubcomdonut-partyfrontend"><a href="https://github.com/donut-party/frontend">donut-party/frontend</a></h3>
<ul>
<li>
<p><strong>Added support for auth responses</strong>
The frontend framework can handle API responses structured to convey an auth token to the frontend, and store that token in the re-frame app db.</p>
</li>
<li>
<p><strong>Update XHR handling to add auth header when token present</strong>
The frontend library has a lot of tools for performing XHR requests. I updated them to include an <code>Authorization</code> HTTP header when an auth token is present in the re-frame app db.</p>
</li>
</ul>
<h3 id="donut-partydonut-clihttpsgithubcomdonut-partydonut-cli"><a href="https://github.com/donut-party/donut-cli">donut-party/donut-cli</a></h3>
<ul>
<li><strong>Updated project generator</strong>
Updated the template used for new projects, and updated the CLI to use the updated templated.</li>
</ul>
<h3 id="donut-partysystemhttpsgithubcomdonut-partysystem"><a href="https://github.com/donut-party/system">donut-party/system</a></h3>
<ul>
<li><strong>Added <code>dependency-pairs</code> function</strong><br>
This makes it easier to grok depedencies and put them in a graph</li>
<li><strong>Added ability to specify repl system</strong><br>
Previously, the tools in <code>donut.system.repl</code> required you to use a named-system named <code>:donut.system/repl</code>. This change makes it possible to pass in the name of any named system and use that.</li>
<li><strong>Added namespace for visualizing the dep graph with visjs</strong><br>
Calling <code>(donut.view.visjs/show your-system)</code> will open a browser window that uses visjs to show a dependency graph of your system.</li>
<li><strong>Added component caching</strong><br>
Sometimes you don&rsquo;t want to constantly stop and restart components. For example, you probably don&rsquo;t want to stop and start a threadpool for every test. This addition lets you cache a component, preserving a component instance across stops and starts. Clearing the cache will make the component respond to the next stop signal.<br></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Call for New Proposals. June Survey Results.</title>
      <link>https://www.clojuriststogether.org/news/call-for-new-proposals.-june-survey-results./</link>
      <pubDate>Tue, 27 Jun 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/call-for-new-proposals.-june-survey-results./</guid>
      <description>We are accepting proposals for our next $44K funding round. Our members speak.</description>
      <content:encoded><![CDATA[<h2 id="call-for-proposals">Call for Proposals</h2>
<p>Clojurists Together is pleased to announce that we are opening our Q3 2023 funding round for Clojure Open Source Projects.
Applications are open until the 20th of July 2023. <a href="https://clojuriststogether.org/open-source/"><strong>Apply today!</strong></a></p>
<p>We will be awarding a total of $44,000 USD for 8 projects – 4 projects at $2,000 each and 4 projects at $9,000 each.
The $2k funding tier is for experimental projects or smaller proposals, whereas the $9k tier is for those that are more established.
Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months as needed.
We expect projects to start for this round between Sept. 1 and Oct. 1, 2023.</p>
<p>We surveyed our members in late June - to find out what types of initiatives they would like us to focus on for this round of funding.
Their responses are summarized below. Thanks as always – it is extremely helpful in ensuring that the community is a vital source of input.</p>
<p>If you work on a Clojure open source project, especially one mentioned as a focus area for our members, please consider <a href="https://clojuriststogether.org/open-source/">applying</a>.</p>
<h2 id="our-members-speak-feedback-from-the-june-survey">Our Members Speak: Feedback from the June Survey.</h2>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/5c803ab5-dbe9-4a81-b49e-1c1f614510a2" alt="ImproveAreas"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/03109a64-501f-4c79-9049-c8eec4acb5e8" alt="CScriptImprove"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/789e7124-3b25-4bad-8a49-df3b4c04850c" alt="UserYears"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/7ff369e4-8121-4b1e-94c2-53b2022cc2e1" alt="UserSupport"></p>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/1b3dc5f5-038d-4022-b978-fe09574ec316" alt="libraryprojecttool"></p>
<h3 id="what-groups-meetups-or-sites-do-you-visit-regularly-that-might-be-a-good-place-to-introduce-both-beginning-and-seasoned-clojurists-to-our-work-outside-of--clojurians-slack-github-reddit---rclojure-and-twitter">What groups, meetups, or sites do you visit regularly that might be a good place to introduce both beginning and seasoned Clojurists to our work? (outside of  Clojurians Slack, GitHub, Reddit - /r/clojure, and Twitter)?</h3>
<ul>
<li>Clojure Berlin</li>
<li>Clojure Hispano group at Telegram</li>
<li>clojure-toolbox</li>
<li>clojureverse</li>
<li>clojuredocs</li>
<li>Clojurians Zulip</li>
<li>Hacker News</li>
<li>lobste.rs</li>
<li>London Clojurians</li>
<li>Mastodon</li>
<li>NYC Clojure Meetup and other Meetups</li>
<li>r/programming subreddit</li>
<li>Youtube channels and content creators</li>
</ul>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure Community in the next 12 months?</h3>
<p>Some selected comments from the survey are listed below:</p>
<p><strong>Documentation</strong></p>
<ul>
<li>Much better and slicker documentation and outreach. Documentation that is slick and fun and makes it clear how you enter into using the language and why.</li>
</ul>
<p><strong>Support for Beginners</strong></p>
<ul>
<li>
<p>The Clojure survey finds &ldquo;learning the idioms&rdquo; as the top obstacle to learning Clojure, so that might be a place to make a difference. Also, people often want to see sample Clojure applications (not libs) to understand how to put pieces together, develop, and deploy them. More support on things like that would be great.</p>
</li>
<li>
<p>I think we should bring more stuff under the CljTogether umbrella, including e.g. clj-commons &amp;c, and then have people work on the commons directly; same goes for beginner training; discoverability matters.</p>
</li>
<li>
<p>I&rsquo;d like there to be much more up-to-date, maintained beginner material and maybe also mentoring. Using Clojure has made me enjoy programming much more, and I&rsquo;d like more people to also have that experience. Some of the barriers to entry may seem artificial to seasoned Clojure devs, but I think it&rsquo;s important to remember that in some cases even a little bit of friction can deter people away from the language. While some may think &ldquo;well those people aren&rsquo;t fit for the language if they give up from a little friction,&rdquo; I think that&rsquo;s a poor way to think, and trying to get more people into using Clojure is, in general, going to improve the language, the tooling, and the community.</p>
</li>
<li>
<p>Make Clojure reachable to beginners in any aspect possible. Write official documentation for people who are learning to program. What we have is great for experienced programmers. We need a different layer of documentation. Also make debugging easier as it is beginners will make a lot of mistakes. Error messages are Key.  Gve them colors, or at least the option to have them. Elevate everything to and from Java to Clojure at least with an official wrapper just to have a unified way to present the errors.</p>
</li>
<li>
<p>I&rsquo;ve been running workshops at meetups for 5+ years. Could be an opportunity to have a small ClojuristsTogether &ldquo;meetup pizza fund&rdquo; (IMO, a fairly high-leverage use of funds to get support Clojure growth).</p>
</li>
<li>
<p>I&rsquo;m now part of Clojure Camp (and we appreciate CT&rsquo;s support!). There may be an opportunity for &ldquo;summer of code&rdquo; type open-source internships &ndash; ie. sponsor <em>new</em> people to Clojure, not experienced devs; pair them with an experienced dev, to work on an open-source project (ex. as part of yearly developer funding, each developer is expected to mentor one junior clojure dev; the junior also gets some small funding and has expectations to be met) &ndash; I could help with administering this; could do this in partnership with Clojure Camp if interested.</p>
</li>
<li>
<p>I think it&rsquo;s rather hard to discover all the cool libraries clojure has to offer. There are enough amazing resources to learn the basics, but next step when one starts to build apps is underserved. You can find frameworks like biff or kit to get you started, and they&rsquo;re great start, but discovering things beyond their default choices is hard. Probably some lib finder tools on top of clojars can help?</p>
</li>
<li>
<p>It seems that having a more standard, official, well-documented way to create new projects using templates is something that could help with adoption, or at least with getting started. Developers from other languages are used to having that kind of tooling, and while it exists in the Clojure world, it&rsquo;s not quite as straightforward in my experience (maybe that has changed more recently). People are still starting out with Leiningen and I think that&rsquo;s partly because it still seems more straightforward to them in terms of creating new projects and running tests than does the Clojure CLI.</p>
<p>The responsibility for improving the official tooling is more on the Clojure core team, but I think the community could improve this by<br>
creating more guides that discuss the existing tools around the Clojure CLI, like for using clj-new. Library and tooling authors can also <br>
add examples for the Clojure CLI, rather than just having Leiningen examples (or in some cases maybe they should even get rid of the <br>
Leiningen examples in favor of the Clojure CLI).</p>
<p>This sort of dichotomy, while not a big deal to seasoned Clojure devs, seems to create some friction for beginners. They&rsquo;re immediately hit<br>
with a decision they may feel is pretty important - &ldquo;Which build tool should I use?&rdquo; - and for which they may have a hard time deciding.<br>
They pick one, but inevitably find examples for the other for things they&rsquo;re trying to do.  <br></p>
</li>
</ul>
<p><strong>Comprehensive, Multi-media Clojure Resource and Destination</strong></p>
<ul>
<li>I wish there was something like what Onyx was trying to be.</li>
<li>Culture wise I come back to that youtube idea. There needs to be more free, quality content for beginner and intermediate devs. It’s a trope (that clojurists love to hate) that clojure needs is Rails. I think this misses the most underrated contributor to Rails’ success: Railscasts.</li>
<li>Michael Hartl’s tutorials/books are a good example. This isn’t to detract from the quality stuff that does exist, and perhaps this isn’t something that can be bought; it might just require a singular voice with the type of dedication (to say nothing of skill &amp; resources) to produce such content consistently over a fairly long time</li>
<li>I think we should bring more stuff under the CljTogether umbrella, including e.g. clj-commons &amp;c, and then have people work on the commons directly; same goes for beginner training; discoverability matters</li>
</ul>
<p><strong>Grow the Clojure Community</strong></p>
<ul>
<li>More companies using Clojure; Making Clojure more known in the business circles. More new users.</li>
<li>I think the Clojure community is amazing and I like seeing the language grow, albeit slowly. I think we all as a community need to figure out a way to break the stigma of starting new projects in clojure. Wild idea, working on creating some partnerships with companies that like what Clojure has to offer but fear that they won&rsquo;t be able to hire enough developers. This kind of partnership can help companies give clojure a go as their backbone technology and bring more hobby-clojurists to make their main language of choice. I know too many people who love Clojure and fantastic developers, but don&rsquo;t put effort to dive deeper than basics as they aren&rsquo;t sure they can find a job with Clojure.</li>
<li>I think the presence of Clojure in the greater developer community has decreased quite a bit from a few years ago. Probably more stuff should be done to get more people to adopt it. Introductory-type stuff would be most critical I think.</li>
<li>There is an opportunity to grow the community by creating python to clojure specific material.</li>
<li>There is a high bar of entry into Clojure compared to some other languages, like JavaScript. That is because for many, in my experience, the Lisp syntax is intimidating and unusual. It&rsquo;s also because the community is small and so getting oriented in the beginning is hard. We love Emacs but for many it is a tool that belongs to people who love their tools, and there are a lot of programmers who find that off-putting. Clojure errors are also scary. Anyway, all these things ensure Clojure may remain &ldquo;niche&rdquo;, and maybe that is okay, but mentoring people, being friendly and welcoming, having documentation that is slick, etc etc. &ndash; all that costs money and it&rsquo;s maybe the only thing that can get people into the language, no matter how good a language it is.</li>
<li>There are more people coming to Clojure from Python and JavaScript backgrounds, where there is no prior knowledge of the JVM. It would be helpful to also teach the basics of the Java SDK (threads, IO, etc.).</li>
<li>We need more marketing efforts to attract people to the language.</li>
<li>Developer advocates, DevRels, Marketing</li>
</ul>
<p><strong>Other Feedback</strong></p>
<ul>
<li>AI-assisted coding solutions. They&rsquo;ll improve and become a part of developer workflow in the next year(s), so we need to have some good story here. At least integrate clojure repl with popular tools/agents, once the leaders emerge.</li>
<li>Standard recommended frameworks for building applications (back-end HTTP services and front-end UI framework) with documentation. These exist now, but there is no one accepted way to accomplish these things, and it makes Clojure appear immature to people new to the ecosystem. It also discourages the development of tooling for those frameworks.</li>
<li>I would target python interopt so we can use the data science libraries.</li>
<li>Community-aided core development. I&rsquo;d like the community to think about what it can do without waiting on the core team.</li>
<li>Keep supporting <code>reagent</code> and <code>re-frame</code>.</li>
<li>Support improvements in server-side rendering (preferably using Reagent)</li>
<li>I see the clojure community being less concentrated on ClojureScript&hellip;</li>
<li>Integration JS ecosystem: I would love to see funding for better integration with the overall JS ecosystem. ES6 module output would be great to future-proof ClojureScript for use with tools like Remix etc.</li>
<li>ClojureScript feels behind JS in many ways. I would love to see more guides, tutorials or blog post about how to get some of the many cool things from the JS world to play nice with ClojureScript.</li>
<li>Consider being a fiscal host on OpenCollective? They&rsquo;ve changed their pricing model now so that they take 0% if you take 0% as a host. Could make certain logistics things easier.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2023 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q2-2023-funding-announcement/</link>
      <pubDate>Mon, 29 May 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2023-funding-announcement/</guid>
      <description>We are funding 8 projects for a total of $44K USD in Q2 2023.</description>
      <content:encoded><![CDATA[<p>Greetings all. We’re excited to announce the projects we&rsquo;ll be funding for Q2 2023. (8 projects $44K USD  in total).
There were a lot of great projects - so making a decision was, as usual, difficult. The good news, however, is
that proposals will automatically be reconsidered for the next 2 cycles.
We have supported many projects in the past that did not make it in the initial round - so stay tuned!
Thanks to everyone for your thoughtful proposals - this is the kind of thinking and sharing that makes the Clojurists Together community so awesome!</p>
<h3 id="projects-awarded-9k-usdbr">Projects Awarded $9K USD<br></h3>
<p><strong>Emmy:</strong> Sam Ritchie<br>
<strong>Clj-kondo, babashka, cherry, SCI:</strong> Michiel Borkent<br>
<strong>Clojure Camp:</strong>  Daniel Higginbotham<br>
<strong>Neanderthal, Clojure CUDA, Deep Diamond:</strong> Dragan Duric<br></p>
<h3 id="projects-awarded-2k-usdbr">Projects Awarded $2K USD<br></h3>
<p><strong>clj-nix:</strong> José Luis Lafuente<br>
<strong>Jank:</strong> Jeaye Wilkerson<br>
<strong>Lucene Grep:</strong> Dainius Jocas<br>
<strong>Portfolio:</strong> Christian Johansen<br></p>
<h3 id="larger-projects-awarded-9k-usdbr">LARGER PROJECTS AWARDED $9K USD<br></h3>
<hr>
<h2 id="emmyhttpgithubcomsicmutilssicmutils-sam-ritchie"><a href="http://github.com/sicmutils/sicmutils">Emmy</a>: Sam Ritchie</h2>
<p>I want to make the SICMUtils computer algebra system into a best-in-class, modular set of tools for doing serious work and exploration in math and physics, and sharing that work in the browser. When used with NextJournal&rsquo;s Clerk, <a href="https://maria.cloud/,">https://maria.cloud/,</a> and the components I built with last quarter&rsquo;s funding, I think SICMUtils could take the place of Mathematica for students and educators and help cement Clojure as a serious contender for top data science language.</p>
<p>Concretely, I would use the quarter to:</p>
<ul>
<li>Rebrand SICMUtils as &ldquo;Emmy&rdquo; after <a href="https://en.wikipedia.org/wiki/Emmy_Noether">Emmy Noether</a></li>
<li>split the 30kloc project into modules, to make the components easy to use from other projects. Examples of useful components include:</li>
<li>A battle-tested symbolic expression simplifier and pattern-matching rules</li>
<li>An extensible symbolic expression compiler, capable of emitting LaTeX, fast numerical functions, fast matrix-valued functions, etc</li>
<li>Forward- and reverse-mode automatic differentiation</li>
<li>Modules for mathematical objects like polynomials, rational functions, quaternions, and geometric algebra</li>
<li>Differential geometry code used in general relativity research</li>
</ul>
<p>With last quarter&rsquo;s funding, I produced a number of components for creating and interacting with 2d and 3d visualizations, as well as tooling for NextJournal&rsquo;s Clerk to make it easy to create interactive documents embedding these components.</p>
<p>I&rsquo;ll extend this work by building out a library of Clerk viewers that make it easy to visualize and work with interactive versions of all of the important mathematical objects in the SICMUtils library.</p>
<p>Finally, I&rsquo;ll use the system to produce a series of interactive essays that explore mathematics and physics, as a way of showing off the power of the system.<br>
A stretch goal would be to ship these interactive essays both using Clerk and using <a href="https://www.maria.cloud/,">https://www.maria.cloud/,</a> so that all text and code would become interactive as well.</p>
<p>As an example of what is possible, see <a href="https://mathbox.mentat.org/dev/mathbox/examples/math/pq_knot.html">this interactive visualization of a (p, q) torus knot</a>.</p>
<p>I was able to use the SICMUtils automatic differentiation and function compilation features to turn the following inefficient
description of the curve for one of these knots into a highly optimized JavaScript function that ran 10-20x faster
than the hand-tuned JavaScript of the example I was porting: ```clojure (defn torus-knot &ldquo;Returns a function of <code>theta</code>
that produces a 3-vector of the XYZ coordinates of a <code>(p, q)</code> torus knot wrapped around a torus (donut) with major radius <code>R</code> and minor radius <code>r</code>.&rdquo; <br></p>
<hr>
<h2 id="clj-kondo-babashka-cherry-sci-michiel-borkent">Clj-kondo, babashka, cherry, SCI: Michiel Borkent</h2>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a>:</h3>
<ul>
<li>Support an arbitrary amount of reader conditionals in .cljc files via configuration. This is mostly useful for ClojureDart (<code>:cljd</code>),</li>
<li>babashka (<code>:bb</code>), nbb (<code>:org.babashka/nbb</code>) and shadow-cljs targets like <code>:node</code>. It&rsquo;s often not selfevident if people are writing both for JVM Clojure + ClojureScript (which is how clj-kondo by default understands <code>.cljc</code> files) or for other combinations of Clojure dialects. I want to add support for configuring what Clojure dialects apply to your project and what Clojure dialects should be linted as (e.g. <code>:node</code> should just be linted as <code>:cljs</code>). If necessary I&rsquo;ll also add support for specific dialects like ClojureDart.</li>
<li>Help with clj-kondo configuration for Electric Clojure</li>
<li>Numerous other issues, there&rsquo;s always plenty to do!
See the <a href="https://github.com/clj-kondo/clj-kondo/projects/1">clj-kondo project board:</a> and
see <a href="https://github.com/clj-kondo/clj-kondo/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc">here for a list of most upvoted issues:</a></li>
<li>As clj-kondo is the foundation for the static analysis in clojure-lsp: improvements in the interaction between the two, most specifically the analysis data.</li>
</ul>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<ul>
<li>Make it easier to use scripts in projects from anywhere on the <a href="https://github.com/babashka/bbin">system. bbin</a> is already helping a lot with this. However, if we allow scripts that are on the path to be combined with their relative <code>bb.edn</code> file to be invoked while taking into account the dependencies from <code>bb.edn</code>, this would be a lower bar of entry for having system wide scripts and might also simplify the implementation of bbin itself. Eventually I&rsquo;d like to include some of bbin&rsquo;s features into babashka itself, as a <code>bb install</code> command and this would be the first step towards that.</li>
</ul>
<h3 id="port-clojure-112-features-to-babashka">Port Clojure 1.12 features to babashka</h3>
<ul>
<li>Allow user-land middleware to participate in the babashka nREPL server</li>
<li>babashka.http-client: this library is now included in babashka but still needs some better configuration options for SSL contexts and http proxy.</li>
<li>Addressing issues of several other built-in libs in bb: babashka.cli, fs, process, etc.</li>
<li>Better error locations for clojure.test output (<a href="https://github.com/babashka/babashka/issues/1518">https://github.com/babashka/babashka/issues/1518</a>)</li>
<li>Report exception causes in console error report (<a href="https://github.com/babashka/babashka/issues/1515">https://github.com/babashka/babashka/issues/1515</a>)</li>
<li>Several other issues: <a href="https://github.com/babashka/babashka/issues">https://github.com/babashka/babashka/issues</a></li>
</ul>
<h3 id="cherryhttpsgithubcomsquint-cljscherry"><a href="https://github.com/squint-cljs/cherry">Cherry</a></h3>
<ul>
<li>Cherry is a CLJS compiler that can be used as a standalone tool but also to (partially) replace self-hosted CLJS in exising projects. This mode is known as <a href="https://github.com/squint-cljs/cherry/blob/main/doc/embed.md">cherry.embed:</a> The embed mode is already used in malli as an alternative to SCI: instead of interpreted CLJS we now get compiled CLJS for serializable functions. To be more generally useful, cherry needs to emit namespaced functions which it currently doesn&rsquo;t. Eventually something like <a href="https://github.com/babashka/scittle">scittle</a> may be implemented using cherry which would give the same convenience but a smaller bundle and better performance.</li>
</ul>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a>:</h3>
<ul>
<li>Add the ability to request the stacktrace at arbitrary execution points in user land (<a href="https://github.com/babashka/sci/issues/871">https://github.com/babashka/sci/issues/871</a>) (also related to the babashka issue about clojure.test locations)</li>
<li>Multiple minor issues related to JVM and CLJS interop: <a href="https://github.com/babashka/sci/issues">https://github.com/babashka/sci/issues</a><br></li>
</ul>
<hr>
<h2 id="clojure-camphttpstheclouncilcom-daniel-higginbotham"><a href="https://theclouncil.com">Clojure Camp</a>: Daniel Higginbotham</h2>
<p><strong>Vision</strong><br>
At Clojure Camp, we are creating a free learning community to help new developers of all backgrounds build a secure foundation for professional programming success — with Clojure! We hope to model a positive tech environment through a commitment to diversity and through our emphasis on creating a fun, friendly, supportive, and kind environment.</p>
<p>Clojure Camp is rooted in an equity ethos: it&rsquo;s open to all while prioritizing the experience of those who face the most hurdles in tech. Our Community is a place where Women, BIPOC folks, and LGBTQ+ folks belong.</p>
<p>We believe that learning Clojure is a great long-term investment because it helps people learn a better way of approaching programming, and because it brings creative satisfaction. We want to make it accessible to more people.</p>
<p>We believe this will have a long-term positive impact on the Clojure community by improving our reputation as a welcoming and helpful community, and by increasing the pool of Clojure developers. <br></p>
<p><strong>Product</strong><br>
For the next six months, we are focusing on two “products”: a study group matchmaking service and a metacircular project incubator.  <br></p>
<p><strong>Study Group Matchmaking</strong><br>
We have created a study group format and matchmaking service that’s proving to be effective with our initial cohort of learners. About five learners are paired with two mentors who guide the learners during weekly video calls, reviewing the work the learners have done over the previous week. In between video calls, learners use a tool to match them with other learners in their group for pair programming and support.</p>
<p>We want to continue building out this model by refining the curriculum and developing other avenues of learning and collaboration. Also, we want to start doing some outreach to attract new developers to participate. We’ve received a lot of interest from potential mentors; now we just need to find some students for them!<br></p>
<p><strong>Metacircular Project Incubator</strong><br>
We’ve designed Clojure Camp to be a kind of project incubator, where motivated volunteers can propose their learning projects and get our support. The kinds of support we provide include:<br>
• <strong>Implementation feedback.</strong> We are available to brainstorm ideas or otherwise spend time chatting with project leaders to help them refine their offering.<br>
• <strong>Networking.</strong> We can refer project leaders to others who might be able to help, and we run a discord server for project leaders to reach out to each other.<br>
• <strong>Moral Support.</strong> Part of our motivation for creating this structure is that we want to help people avoid burnout. It’s a lot easier to do this sustainably when you’re in community.<br>
• <strong>Advertising.</strong> We help project leaders get their projects in front of a qualified audience, allowing them to focus on what they do best: helping people learn!</p>
<p>Our core team already has a number of projects we’ve begun working on in this spirit, including:</p>
<ul>
<li>Speaker coaching</li>
<li>Email newsletter <Br>
<br></li>
</ul>
<hr>
<h2 id="neanderthal-clojure-cuda-deep-diamondhttpsgithubcomuncomplicate-dragan-duric"><a href="https://github.com/uncomplicate">Neanderthal, Clojure CUDA, Deep Diamond</a>: Dragan Duric</h2>
<p>In short, I propose to implement:</p>
<ul>
<li>a port of Neanderthal&rsquo;s MKL engines and CPU related stuff to JavaCPP instead of neanderthal-native (for sure).</li>
<li>a port of ClojureCUDA to JavaCPP&rsquo;s CUDA. (probably, depending how 1 goes) - a port of Neanderthal&rsquo;s GPU matrix engine to new, JavaCPP-based ClojureCUDA (almost sure, if ClojureCUDA port goes well)</li>
<li>update Deep Diamond to use new infrastructure.</li>
<li>improve relevant internal parts of Neanderthal code with more macrology (double-edged sword, I know, but also concentrates bugs at one place each).</li>
<li>TESTS! to make sure everything works as well as before (of course!)<br></li>
</ul>
<h3 id="experimental-or-short-term-projects-awarded-2k-usdbr">EXPERIMENTAL OR SHORT-TERM PROJECTS AWARDED $2K USD<br></h3>
<hr>
<h2 id="clj-nixhttpsgithubcomjlesquembreclj-nix-josé-luis-lafuentebr"><a href="https://github.com/jlesquembre/clj-nix">clj-nix</a>: José Luis Lafuente<br></h2>
<p><strong>Why is this project important to the Clojure community?</strong>
Nix is a great tool to build and deploy software, but Clojure is not well supported in
the Nix ecosystem. clj-nix makes easier to integrate Clojure on a Nix project.</p>
<p><strong>What are you wanting to achieve with this funding?</strong><br>
I want to refactor the CLI to be more granular about the dependencies used at build time.
Currently, all dependencies in all aliases are added to the lock file. I want to add some
flags to the CLI to allow users to manually define the <code>deps.edn</code> files, and the aliases to use.
Once CLI refactor is done, I want to add support for calling Babashka at build time, adding
the possibility to use Babashka, and the dependencies defined in the <code>bb.edn</code> file, in the Nix build phase.<br></p>
<hr>
<h2 id="jankhttpsgithubcomjank-langjank-jeaye-wilkerson"><a href="https://github.com/jank-lang/jank">Jank</a>: Jeaye Wilkerson</h2>
<p>jank is the <em>only</em> native Clojure dialect which has its own JIT and embraces interactive programming. It unlocks REPL-driven development for a whole ecosystem previously unserved by Clojure.</p>
<p>Clojurists have demonstrated their desire for native executables with their use of GraalVM. Compared to Graal, jank will offer REPL support, better native interop, smaller binaries, and faster compilation times.</p>
<p>Clojure&rsquo;s object model is intense. In fact, representing it 1:1 from Java to C++ is impossible, since C++ has stricter rules are duplicate base classes and bases with same-name fields and different types. Furthermore, C++, even with the Boehm GC, is much slower at creating objects than the JVM is. It&rsquo;s bread and butter work for the JVM. Also, while everything is an Object in the JVM, C++ doesn&rsquo;t have the same notion. If every jank class were to inherit from the same Object class, it would have <em>very</em> serious performance implications when it comes to allocations.</p>
<p>So jank has two key problems here:</p>
<ol>
<li>Creating new boxed values is slow, compared to the JVM</li>
<li>Not every jank type can actually be turned into an object, which sometimes means doing some weird dancing to get from one type, through another, and finally to the object base; this generally requires virtual function calls</li>
</ol>
<p>So far, I&rsquo;ve worked around the first one by optimizing other things, so jank can be faster than Clojure in a given program for example, but when measuring just the object creations, Clojure is still around twice as fast. I want to fix this.</p>
<p>This task would entail implementing and benchmarking a few different solutions, all of which move jank&rsquo;s object model away from C++ inheritance and toward something more dataoriented. This gets us around C++&rsquo;s virtual inheritance allocation costs, but it can also allow <em>every jank type</em> to be treated as an object, which will not only simplify jank&rsquo;s runtime code, but will itself be a key optimization.</p>
<p>Right now, I have two key design ideas:</p>
<ol>
<li>A very template-heavy approach, which uses bit fields to keep track of which behaviors an object has, as well as which data storage it has</li>
<li>An ECS-based approach, which separates object identity from storage, which would aid in cache performance and data locality issues</li>
</ol>
<p>So far, I have prototyped the first approach and found object creation is nearly twice as fast. This funding
would allow me to implement both of these solutions fully, benchmark them, and research further ways
to improve them. Finally, I will integrate the fastest solution into jank and reap the benefits.<br></p>
<hr>
<h2 id="lucene-grephttpsgithubcomdainiusjocaslucene-grep-dainius-jocas"><a href="https://github.com/dainiusjocas/lucene-grep">Lucene Grep</a>: Dainius Jocas</h2>
<p><strong>What are you wanting to achieve with this funding?</strong> I want to tear the lucene-grep project apart into several reusable idiomatic Clojure libraries/tools/tutorials that would help the Clojure community to leverage the Apache Lucene library, e.g. a Clojure library whose single purpose is to create Lucene Analyser in a data driven fashion <a href="https://github.com/dainiusjocas/lucene-custom-analyzer">https://github.com/dainiusjocas/lucene-custom-analyzer</a>.</p>
<p>Also, I want to combine the knowledge encoded in other Clojure projects when it comes to using Apache Lucene and either contribute to existing or fill in the gaps by creating several single purpose idiomatic Clojure libraries.</p>
<p><strong>Why is this project important to the Clojure community?</strong>  Apache Lucene is a treasure trove of a battle tested functionality for
building search and data analysis applications. As of now, there are few ok&rsquo;ish Lucene wrapper
options e.g. <a href="https://github.com/jaju/lucene-clj">https://github.com/jaju/lucene-clj</a>. But Apache Lucene is already a dependency in
multiple Clojure systems such as Datomic, Crux, etc. I wan&rsquo;t to spend some quality time going
through the use cases and expose modularise the functionality. <br></p>
<hr>
<h2 id="portfoliohttpsgithubcomcjohansenportfolio-christian-johansen"><a href="https://github.com/cjohansen/portfolio">Portfolio</a>: Christian Johansen</h2>
<p><strong>What are you wanting to achieve with this funding?</strong>
I will use the funding to improve the experience for new users. Specifically I will add some self-hosted documentation such that Portfolio can guide users via its UI once set up. I will also improve Portofolio&rsquo;s error handling and make it provide more helpful pointers when things go wrong. If time permits, I will keep working on a recently started accessibility testing feature for Portfolio.</p>
<p><strong>Why is this project important to the Clojure community?</strong>
The community has voiced a desire for more developer tooling. Portfolio is a developer tool for frontend ClojureScript work. While it is good that Clojure(Script) makes it easy to use tools built for the underlying platform (e.g. Storybook), strong native CLJ(S) tooling is necessary to fully harness the power of our amazing language and runtime, and make it an attractive alternative. My hope is that Portfolio eventually is one piece of what makes ClojureScript the greatest frontend toolkit out there.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>May 2023: Short Term Project Updates</title>
      <link>https://www.clojuriststogether.org/news/may-2023-short-term-project-updates/</link>
      <pubDate>Wed, 24 May 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/may-2023-short-term-project-updates/</guid>
      <description>Updates from Clerk, Clojure-ts-mode, Exercism, Kaocha, Neanderthal</description>
      <content:encoded><![CDATA[<p>With several project cycles winding down, we have final reports in from
Clerk, Clojure-ts-mode, Exercism, Kaocha, and Uncomplicate Neanderthal.
Great work all!  As always thanks for your commitment and
contributions to the Clojurists Together community.</p>
<p><a href="#project-clerk-martin-kavalar">Project Clerk: Martin Kavalar</a><br>
<a href="#project-clojure-ts-mode-danny-freeman">Project Clojure-ts-mode: Danny Freeman</a><br>
<a href="#project-exercism-bobbi-towers">Project Exercism: Bobbi Towers</a><br>
<a href="#project-kaocha-arne-brasseur">Project Kaocha: Arne Brasseur</a><br>
<a href="#project-uncomplicate-neanderthal-dragan-duric">Project Uncomplicate Neanderthal: Dragan Duric</a></p>
<h2 id="project-clerk-martin-kavalar">Project Clerk: Martin Kavalar</h2>
<p>Update: 2 May 2023; Final Report<br>
Funding Round: Q1 2023<br></p>
<h3 id="interactive-links--homepage-book-updates-viewer-customizationbr">Interactive Links &amp; Homepage, Book Updates, Viewer Customization<br></h3>
<p>In April we worked on the following:</p>
<ul>
<li>
<p><strong>🔗 Interactive Links, Index and Homepage</strong><br>
Links can now be followed in interactive mode and the index can be viewed.
Previously this could only be seen after a <code>build!</code>. Add support evaluating
a given doc by entering it in the browser&rsquo;s address bar.  Use these features to build a new welcome page that gives more useful information,
including links to potential notebooks in the project.<br>
Getting this right took a bit longer than we hoped but we&rsquo;re looking forward to
build on top of those features to better surface the docs going forward.
Wikidata-style links to other notebooks and vars are also on the roadmap.<br></p>
</li>
<li>
<p><strong>👁 Improved support for customization of viewer options</strong><br>
Customization of viewer options like the budget or auto-expansion
of results has gotten an overhaul. They can now be set per-doc or
per-result consistently using the same keys.<br></p>
</li>
<li>
<p><strong>🍒 Experimental support for cherry for compiling viewer fns</strong><br>
Took a first step towards supporting compiling Clerk viewer functions
using <a href="https://github.com/squint-cljs">cherry</a>. This opens the door to more performant
viewer fns since it removes the interpretation overhead.<br></p>
</li>
<li>
<p><strong>📖 Book Updates</strong><br>
Documented the <a href="https://github.clerk.garden/nextjournal/book-of-clerk/commit/c47477cb3ca72740de82c9fd3ddcb384f7c7eeb9/#customizations">Viewer Customization Options</a> in the Book of Clerk.<br></p>
</li>
<li>
<p><strong>🐞 Smaller Bugfixes &amp; Improvements</strong><br>
We plan to follow up with a v0.14 release shortly. What we had planned but didn&rsquo;t yet get around to is documenting how to use Clerk
as a library for Dashboards. We did settle on an approach that we&rsquo;re happy with
however, so getting the docs updated should not be long. Thanks again for supporting
Clerk with this funding! 🙏</p>
</li>
</ul>
<hr>
<h2 id="project-clojure-ts-mode-danny-freeman">Project clojure-ts-mode: Danny Freeman</h2>
<p>Update: 15 May 2023; Final Report<br>
Funding Round: Q1 2023</p>
<h3 id="project-update">Project Update:</h3>
<p>Clojure-ts-mode is now in a pretty usable state and should be ready for
people to try out. Through this funding project I&rsquo;ve implemented the following features:</p>
<ul>
<li>
<p>Syntax Highlighting</p>
</li>
<li>
<p>Fixed style indentation</p>
</li>
<li>
<p>Complete imenu support</p>
</li>
<li>
<p>S-expression navigation</p>
</li>
</ul>
<p>Additionally I&rsquo;ve been working on the documentation to make getting started
with clojure-ts-mode easier.  It is available for install now through package-vc on Emacs 29</p>
<pre><code>
(package-vc-install &quot;https://github.com/clojure-emacs/clojure-ts-mode&quot;)

</code></pre><p>And should be available on MELPA package repository soon.</p>
<h3 id="next-steps">Next steps</h3>
<p>I was not able to get semantic indentation implemented yet, as I found the
indentation mechanisms in tree-sitter difficult to use at first. However,
I have a much better understanding now of them (and how to debug them).
Over the coming months I will be working on semantic indentation to more
closely match what clojure-mode does today. Once I have semantic indentation
in a good place I will probably consider clojure-ts-mode ready for
a 1.0.0 release. Until then it will stay in the 0.<em>.</em> version range.</p>
<p>Documentation is always a work in progress and will continue to improve over time.</p>
<p>Additionally, I will request to have clojure-ts-mode listed in
Non-GNU ELPA package repository. This should make it easier to install
for people that do not have MELPA configured.<br></p>
<hr>
<h2 id="project-exercism-bobbi-towers">Project Exercism: Bobbi Towers</h2>
<p>Update 29 April 2023: Final Report<br>
Funding Round: Q1 2023<br></p>
<h3 id="inline-evaluation-via-sci">Inline evaluation via SCI</h3>
<p>I&rsquo;m very excited about this feature because it transforms the online
editor into a proper interactive Clojure environment. When the track
was first launched in 2021 we received some valuable feedback from
fellow Clojurists, who said that the online editor was quite lacking
to someone familiar with using an editor connected REPL. I too consider
this an inseparable part of the Clojure development experience, so this
is something I&rsquo;ve wanted to do for a long time.</p>
<p>Once I <a href="https://github.com/bobbicodes/typomaniac">prototyped</a> the desired
behavior using <a href="https://github.com/nextjournal/clojure-mode">Nextjournal&rsquo;s clojure-mode</a>, the next
task was to figure out how to best integrate it into the existing <a href="https://github.com/exercism/website">Ruby on Rails/React application</a> while making as minimal impact on the codebase as possible. The first thing I tried was to use <a href="https://github.com/babashka/scittle">scittle</a> to load <a href="https://github.com/babashka/sci">SCI</a> via the <code>&lt;script&gt;</code> tag. This worked great, but I wanted something more modular and realized the best thing to do would be to make it into a proper plugin for Codemirror 6 and package it as an npm library similar to <a href="https://github.com/nextjournal/lang-clojure">@nextjournal/lang-clojure</a> which I was able to fork and use as a template, which is itself based on <a href="https://github.com/codemirror/lang-javascript">@codemirror/lang-javascript</a>. This makes it extremely easy on the website team because it simply replaces the legacy plugin used previously, with the added benefit of creating a Clojure-evaluation plugin that can be used by the rest of the Clojure community to build highly interactive editors on the web. Repo: <a href="https://github.com/bobbicodes/clojure-eval">https://github.com/bobbicodes/clojure-eval</a></p>
<h3 id="syllabus">Syllabus</h3>
<h4 id="revised-existing-exercisesbr">Revised existing exercises:<br></h4>
<ul>
<li>
<p><a href="https://github.com/exercism/clojure/pull/548">Basic intro</a> - I tried to give special attention to the very first lesson, because for the majority of students this is their first contact with Clojure and I take that as a considerable responsibility. Its objective is to provide the fastest possible onramp to get the student started without them needing to immediately look anywhere else. Since Exercism is all about teaching new languages to folks who already know how to code, our target experience level is someone who has never seen Clojure, Lisp, or functional programming concepts before, but is fluent in at least one other language. So far, feedback has been very positive :)</p>
</li>
<li>
<p><a href="https://github.com/exercism/clojure/tree/main/exercises/concept/tracks-on-tracks-on-tracks">Lists exercise</a> - This one needed to be revamped because the idiomatic solution included threading macros, which were not yet taught at that point. So this exercise now teaches threading macros, and the Card Games exercise (see below) is being ported from the Python track because it is a better exercise for teaching list operations.</p>
</li>
</ul>
<h3 id="new-concept-exercises-in-progress">New concept exercises in progress:</h3>
<ul>
<li>Hashmaps - <a href="https://github.com/exercism/clojure/tree/international-calling-coonoisseur/exercises/concept/international-calling-connoisseur">International Calling Connoisseur</a></li>
<li>Chars - <a href="https://github.com/exercism/clojure/tree/main/exercises/concept/squeaky-clean">Squeaky Clean</a></li>
<li>Regex - <a href="https://github.com/exercism/clojure/pull/492">Date Parser</a></li>
<li>closures - <a href="https://github.com/exercism/clojure/tree/main/exercises/concept/coordinate-transformation">Coordinate Transformation</a></li>
<li>Multimethods - <a href="https://github.com/exercism/clojure/tree/wizards-and-warriors/exercises/concept/wizards-and-warriors">Wizards and Warriors</a></li>
</ul>
<h3 id="concept-exercises-planned">Concept exercises planned:</h3>
<ul>
<li>Lists - <a href="https://github.com/exercism/python/tree/main/exercises/concept/card-games">Card games</a></li>
<li>Atoms</li>
<li>Threading macros</li>
<li><a href="https://github.com/exercism/clojure/issues/542">Protocols</a> - My idea for this is to do something inspired by <a href="https://github.com/mentat-collective/emmy">emmy</a>, which is a very nice example of protocols. For example, an exercise involving defining operations for complex numbers would be cool. A long term vision is to create a mathematics mini-course, since Clojure is superb for this and more people should try it! The main part of the syllabus takes priority, however.</li>
<li><a href="https://github.com/exercism/clojure/issues/479">Partition</a>, <code>juxt</code>, <code>for</code></li>
<li>Associative destructuring</li>
<li><a href="https://github.com/exercism/clojure/issues/306">Multiarity</a>, <a href="https://github.com/exercism/clojure/issues/308">variadic</a>, <a href="https://github.com/exercism/clojure/issues/309">anonymous</a> functions</li>
</ul>
<h3 id="new-practice-exercises">New practice exercises</h3>
<ul>
<li>Yacht</li>
<li>Zipper</li>
</ul>
<h3 id="test-runner-upgrade">Test runner upgrade</h3>
<p>The learning exercise test suites now include metadata linking each test case to its respective task in the instructions. This enables a better user experience, because now after the tests are run, there is a button to return the student to the proper place.</p>
<h3 id="gratitude">Gratitude</h3>
<p>Besides allowing me to work on this full-time, the funding enabled me to adopt two beautiful kitty cats! Now, coding is even more fun. Many thanks to all who made this possible.<br></p>
<hr>
<h2 id="project-kaocha-arne-brasseur">Project Kaocha: Arne Brasseur</h2>
<p>Update: 4 May 2023; Final Report<br>
Funding Round: Q3 2022<br></p>
<p>In this last month of Clojurists Together funding the Gaiwan Team, in particular
Alys and Laurence, worked on a few different fronts. Kaocha, kaocha-cljs, and
kaocha-cucumber all saw smaller maintenance releases. Kaocha-cljs in particular
had some documentation improvements done. Testing ClojureScript is a bit
trickier than testing Clojure. The reason is that the compiler and the runtime
live in different processes (one runs in the JVM, the other in a JS environment
like your browser), and so there&rsquo;s significantly more communication and
coordination involved.</p>
<p>You might also be wondering about Kaocha-cljs vs Kaocha-cljs2. Why are we still
releasing updates to the old version? In fact we maintain both, since they take
radically different approaches, and so are suitable for different situations.
The short version is that kaocha-cljs is much simpler in its setup, but is only
usable with a very &ldquo;vanilla&rdquo; ClojureScript setup. We use it a lot for testing
our libraries for instance.</p>
<p>If kaocha-cljs doesn&rsquo;t cut if for you, you can use kaocha-cljs2. This one is
adaptable to virtually any cljs setup and compiler config, but it takes more
effort. We have some stuff in the pipeline though to hopefully make that easier,
so stay tuned!</p>
<p>If you want to know more about what&rsquo;s involved in testing ClojureScript, and
about the differences between the two kaocha-cljs versions, you can listen to
the <a href="https://podcasts.apple.com/us/podcast/s4-e30-testing-wtih-arne-brasseur-part-2/id1461500416?i=1000523138440&amp;l=da">ClojureScript Podcast with Jacek Schae Ep30</a>
(since renamed to ClojureStream) where Arne and Jacek talk at length about these Topics.</p>
<p>April also saw the first release of <a href="https://github.com/lambdaisland/plenish">Plenish</a> a tool we (the Gaiwan Team)
have been using to help one of our clients do analytics over Datomic. It lets
you transfer your Datomic database to a Postgres database, allowing for
analytical workloads to run on Postgres. For a, watch <a href="https://www.youtube.com/watch?v=BxK44tRhKMQ">Arne&rsquo;s talk about it</a>. A related project is EmbedKit,
which allows you to use Metabase as a dashboard engine, which is also mentioned
in Arne&rsquo;s talk, and which also saw a maintenance release in April.</p>
<p>Finally we released a new version of Ornament, our css-in-clj(s) styled component libraries, improving support for Tailwind 3 classnames.</p>
<p>We want to thank the community for putting their trust in us, and allowing us to
work on these different projects over the last 6 months. And a huge thanks to
the people who support us directly on
<a href="https://opencollective.com/lambda-island">OpenCollective</a>. Due to staffing
challenges we didn&rsquo;t yet dip into the OpenCollective budget. We&rsquo;re going to do
some internal reflecting on how to best approach our open source work going
forward, to make sure it&rsquo;s relevant, visible, and sustainable, so stay tuned!</p>
<h3 id="kaochahttpsgithubcomlambdaislandkaocha-1831314-2023-05-05--1438ce7"><a href="https://github.com/lambdaisland/kaocha">Kaocha</a> 1.83.1314 (2023-05-05 / 1438ce7)</h3>
<ul>
<li>The watcher now prints the output from plugins, eg. <code>bin/kaocha --watch --plugin kaocha.plugin/profiling</code></li>
</ul>
<h3 id="kaocha-cljshttpsgithubcomlambdaislandkaocha-cljs-15154-2023-04-17--f969eae"><a href="https://github.com/lambdaisland/kaocha-cljs">Kaocha-cljs</a> 1.5.154 (2023-04-17 / f969eae)</h3>
<ul>
<li>
<p>Add documentation of common issue when trying to run tests that reference the DOM in a context without a DOM (e.g., Node.js).</p>
</li>
<li>
<p>Add documentation for using Kaocha-cljs with Node.js dependencies.</p>
</li>
<li>
<p>Fix integration test Windows error when setting POSIX file permissions</p>
</li>
</ul>
<h3 id="kaocha-cucumberhttpsgithubcomlambdaislandkaocha-cucumber-011100-2023-05-08--5c7009a"><a href="https://github.com/lambdaisland/kaocha-cucumber">Kaocha-cucumber</a> 0.11.100 (2023-05-08 / 5c7009a)</h3>
<ul>
<li>
<p>Added documentation for working with step definitions in the REPL.</p>
</li>
<li>
<p>Added documentation about Gherkin tag support.</p>
</li>
<li>
<p>Updated Kaocha dependency.</p>
</li>
<li>
<p>Bump version prefix to reflect total number of releases.</p>
</li>
</ul>
<h3 id="ornamenthttpsgithubcomlambdaislandornament-0987-2023-04-15--dac82f4"><a href="https://github.com/lambdaisland/ornament">Ornament</a> 0.9.87 (2023-04-15 / dac82f4)</h3>
<ul>
<li>Added a <code>:tw-version</code> flag for the preflight, similar to <code>set-tokens!</code></li>
<li>Document how to opt-in to Tailwind v3</li>
</ul>
<h3 id="plenishhttpsgithubcomlambdaislandplenish-0450-2023-04-24--1d5eca9"><a href="https://github.com/lambdaisland/plenish">Plenish</a> 0.4.50 (2023-04-24 / 1d5eca9)</h3>
<ul>
<li>First public release</li>
<li>Convenience function <code>sync-to-latest</code></li>
<li>Fixed issue where multiple cardinality-many attributes would lead to clashing constraint names</li>
</ul>
<h3 id="embedkithttpsgithubcomlambdaislandembedkit-0056-2023-04-14--fd0bc4a"><a href="https://github.com/lambdaisland/embedkit">Embedkit</a> 0.0.56 (2023-04-14 / fd0bc4a)</h3>
<ul>
<li>[breaking] Support only metabase version &gt;= <code>0.46.1</code></li>
<li>Change the API call parameters on `/api/dashboard/:id/cards<br></li>
</ul>
<hr>
<h2 id="project-uncomplicate-neanderthal-dragan-duric">Project Uncomplicate Neanderthal: Dragan Duric</h2>
<p>Project Update: 28 April 2023; Final Report<br>
Funding Round: Q1 2023<br></p>
<p>My goal with this round was to implement Sparse Matrix support in Neanderthal.</p>
<p>During the initial phases of the project, I realized that the domain area is bigger than I thought. I also
decided to use JavaCPP MKL bindings instead writing my own JNI C code. This prompted me to create
the ClojureCPP library, with lots of helpers and convenience functions. It proved a great help when
dealing with JavaCPP pointers and native shenanigans.</p>
<p>Since Neanderthal is not based on JavaCPP pointers, I needed to create a port of Neanderthal&rsquo;s native CPU engine. I could have attached the new JavaCPP parts to the existing ByteBuffer-based engines, but that would introduce complexity in code. So I decided to take the opportunity and implement a prototype of native CPU implementation of a part of Neanderthal core that is based on JavaCPP. This helped me in learning how to deal with JavaCPP itself, since it has sparse documentation and a ton of functionality.</p>
<p>So all this work went into another new project, Neanderthal Sparse, which I eventually plan to merge into Neanderthal. It contains both the port of existing CPU engines for vectors and GE matrices to JavaCPP, and the new sparse vector and sparse matrix implementations.</p>
<p>Regarding sparse matrices, the domain is larger than I expected, which was not helped by extreme sparseness of the documentation, and even related information on the Internet in general. I had to discover many things by poking and experimenting (Clojure REPL wins big here!). In the end, I managed to implement compressed sparse vectors (CSV), and compressed sparse row matrices (CSR) (with both row and column layout support), all related data structure interfaces that make sense with sparseness, the Float and Double engines with sparse vector operations, and the Float and Double engines with CSR operations for GE CSR matrices. I tested a lot of this, but it still needs polishing.</p>
<p>I could only release snapshots, as I discovered a few omissions in JavaCPP MKL preset that are then fixed in the new version 1.5.9, which is still only a snapshot, so Neanderthal Sparse is still only available only as a snapshot on <a href="https://github.com/uncomplicate/neanderthal-sparse">GitHub</a>.</p>
<p>All in all, I am satisfied with what has been done in this round. It may not be exactly what I imagined when I started, but become much broader, with a huge chunk of work that is more general and will benefit Uncomplicate libraries in future.</p>
<p><strong>In short, Q12023 resulted in:</strong></p>
<ul>
<li>
<p>The core of <a href="https://github.com/uncomplicate/neanderthal-sparse">Spare Matrix and Vectors implementations</a> that is not as complete and polished as the rest of Neanderthal but that is a great first milestone.</p>
</li>
<li>
<p>The port of the core Neanderthal CPU engine (GE matrices and vectors) to JavaCPP, which will be the base of porting the rest of Neanderthal&rsquo;s CPU and CUDA implementation to JavaCPP.</p>
</li>
<li>
<p>A pretty complete <a href="https://github.com/uncomplicate/clojure-cpp">ClojureCPP library</a>, which opens the door for convenient integration of the whole JavaCPP native library ecosystem in Clojure.</p>
</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>2023 Long Term Projects: March &amp; April Updates</title>
      <link>https://www.clojuriststogether.org/news/2023-long-term-projects-march-april-updates/</link>
      <pubDate>Wed, 10 May 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2023-long-term-projects-march-april-updates/</guid>
      <description>Reports from our 10 developers working on 2023 long term projects</description>
      <content:encoded><![CDATA[<br> 
<p>There is a lot to catch up on! Check out the March and April 2023 updates from:<br>
<a href="#bozhidar-batsov">Bozhidar Batsov</a><br>
<a href="#michiel-borkent">Michiel Borkent</a><br>
<a href="#sean-corfield">Sean Corfield</a><br>
<a href="#eric-dallo">Eric Dallo</a><br>
<a href="#christophe-grand">Christophe Grand</a><br>
<a href="#thomas-heller">Thomas Heller</a><br>
<a href="#nikita-prokopov">Nikita Prokopov</a><br>
<a href="#tommi-reiman">Tommi Reiman</a><br>
<a href="#peter-stromberg">Peter Stromberg</a><br>
<a href="#peter-taoussanis">Peter Taoussanis</a><br></p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>(Published 29 April 2023)</p>
<h3 id="cider">CIDER</h3>
<ul>
<li>Released CIDER 1.7.</li>
<li>Deprecate <code>cider-*-global-options</code> configuration options.</li>
<li>Document how to load REPL utils in REPL buffers.</li>
<li>Disable the problematic <code>paredit-RET</code> keybinding automatically.</li>
<li>Some work-in-progress work towards adding &ldquo;debug-on-exception&rdquo; functionality.</li>
<li>Discussed how to support <code>add-lib</code> in CIDER it&rsquo;s bundled with Clojure.</li>
</ul>
<h3 id="inf-clojure">inf-clojure</h3>
<ul>
<li>Updated CI pipeline to match that of CIDER.</li>
<li>Added the ability to start socket REPLs straight from Emacs (see <code>inf-clojure-socket-repl</code>).</li>
<li>That&rsquo;s similar to <code>cider-jack-in</code></li>
</ul>
<h3 id="clojure-ts-mode">clojure-ts-mode</h3>
<ul>
<li>Improve the CI (made it similar to that of <code>clojure-mode</code>).</li>
<li>Various documentation and code consistency updates.</li>
</ul>
<h3 id="clojure-mode">clojure-mode</h3>
<ul>
<li>Font-lock <code>defproject</code> as a keyword.</li>
</ul>
<h3 id="nrepl">nREPL</h3>
<ul>
<li>Make the test suite compatible with Windows.</li>
<li>Various small Windows-related fixes (e.g. now Unix sockets should work on recent versions of Windows).</li>
<li>Replace <code>Makefile</code> with <code>bb</code> for portability reasons.<br></li>
</ul>
<hr>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<h3 id="sponsors">Sponsors</h3>
<p>But first off, I&rsquo;d like to thank all the sponsors and contributors that make this work possible! Top sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://www.adgoji.com/">Adgoji</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.  On to the projects that I&rsquo;ve been working on!</p>
<h3 id="march-report">March Report</h3>
<p>(Published 07 April 2023)</p>
<h3 id="cherryhttpsgithubcomsquint-cljscherry"><a href="https://github.com/squint-cljs/cherry">cherry</a></h3>
<p><em>Experimental ClojureScript to ES6 module compiler</em> <br>
This month I&rsquo;ve been preparing cherry as a compiler that you can embed in your existing CLJS / shadow-cljs applications. This makes cherry an additional alternative to <a href="https://github.com/babashka/sci">SCI</a> and self-hosted CLJS.</p>
<p>Read about embedding cherry into your application <a href="https://github.com/squint-cljs/cherry/blob/main/doc/embed.md">here</a>.<br>
I&rsquo;ve been working on several PRs to include cherry as an additional evaluator in:</p>
<ul>
<li><a href="https://github.com/nextjournal/clerk/pull/446">clerk</a></li>
<li><a href="https://github.com/metosin/malli/pull/888">malli</a></li>
<li>One project that is still unpublished but will be coming soon!</li>
</ul>
<h3 id="scimacshttpsgithubcomjackrusherscimacs"><a href="https://github.com/jackrusher/scimacs">scimacs</a></h3>
<p><em>The Small Clojure Interpreter (SCI) integrated with emacs as a loadable module.</em><br>
This is a new project by Jack Rusher and I&rsquo;ve helped him with the SCI integration.</p>
<h3 id="clj2elhttpsborkdudegithubioclj2el"><a href="https://borkdude.github.io/clj2el/">clj2el</a></h3>
<p><em>Transpile clojure to elisp. A brand new project to transpile Clojure to Elisp.</em><br>
It might be of value for those who know Clojure better than Elisp and want to have something to get started. It&rsquo;s far from complete. Try it in the playground <a href="https://borkdude.github.io/clj2el/">here</a>.</p>
<h3 id="deflethttpsgithubcomborkdudedeflet"><a href="https://github.com/borkdude/deflet">deflet</a></h3>
<p><em>Make let-expressions REPL-friendly!</em><br>
The <code>deflet</code> macro lets your write inline-def expressions, while expanding those to regular let expressions, giving you the benefits of REPL-driven development without polluting production code with top level vars.</p>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">babashka</a></h3>
<p><em>Native, fast starting Clojure interpreter for scripting</em></p>
<p>New release: 1.3.175 (2023-03-18)), 1.3.176 (2023-03-18)<br>
Highlights:</p>
<ul>
<li>The <code>clojure.core.async/go</code> macro now uses virtual threads.</li>
<li>Many small fixes and upgrades.</li>
<li>See the complete <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">CHANGELOG</a>.</li>
</ul>
<h3 id="babashkajsonhttpsgithubcombabashkajson"><a href="https://github.com/babashka/json">babashka.json</a></h3>
<p>This is a JSON abstraction library that you can include in babashka and JVM projects while also including your own favorite JSON implementation. The idea is that babashka libraries can include this, while JVM projects don&rsquo;t have to switch their JSON implementation to cheshire.core.</p>
<h3 id="babashka-compatibility-in-external-libs">Babashka compatibility in external libs</h3>
<p>I worked together with the maintainers of the following libraries to make them compatible with babashka:</p>
<ul>
<li><a href="https://github.com/oliyh/martian/commit/f0f7679364f58eb4ef558e9ad2340274b9742542">martian</a>: HTTP abstraction library for Clojure/script, supporting OpenAPI, Swagger, Schema, re-frame and more</li>
</ul>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a></h3>
<p><em>Static analyzer and linter for Clojure code that sparks joy</em></p>
<p><strong>New release: 2023.03.17   Some highlights:</strong></p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2010">#2010</a>: Support inline macro configuration. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/config.md#inline-macro-configuration">docs</a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2010">#2010</a>: Short syntax to disable linters: <code>{:ignore [:unresolved-symbol]}</code> or <code>{:ignore true}</code>, valid in ns-metadata, <code>:config-in-ns</code>, <code>:config-in-call</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2009">#2009</a>: new <code>:var-same-name-except-case</code> linter: warn when vars have names that differ only in case (important for AOT compilation and case-insensitive filesystems)</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1269">#1269</a>: warn on <code>:jvm-opts</code> in top level of <code>deps.edn</code></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2003">#2003</a>: detect invalid arity call for function passed to <code>update</code>, <code>update-in</code>, <code>swap!</code>, <code>swap-vals!</code>, <code>send</code>, <code>send-off</code>, and <code>send-via</code></li>
</ul>
<p><a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelog</a> for details.</p>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p><em>Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</em></p>
<p>New release: 0.7.39 (2023-03-07)</p>
<ul>
<li><a href="https://github.com/babashka/sci/issues/874">#874</a>: Keyword arguments as map support for CLJS</li>
<li>See <a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md">changelog</a> for more.</li>
</ul>
<h3 id="contributions-to-other-projects">Contributions to other projects:</h3>
<ul>
<li><a href="https://github.com/clojure/clojurescript">clojurescript</a>:
<ul>
<li><a href="https://github.com/clojure/clojurescript/pull/202">PR 202</a>: a <code>macroexpand</code> fix</li>
<li><a href="https://github.com/clojure/clojurescript/pull/203">PR 203</a>: a symbol optimization fix</li>
</ul>
</li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/commit/b7111ef6b5f9c1d93b2272683ff4b6eb58b240c9">clojure-lsp</a>: fix reflection issue on JDK 19</li>
<li><a href="https://github.com/http-kit/http-kit/commit/e2d71039ea2617e789a08606a0c404c41367dca8">http-kit</a>: add native-image tests</li>
<li><a href="https://github.com/funcool/promesa/commit/18fea52fd99b24a65927907eff6879b970c71dfd">promesa</a>: fix GraalVM native-image compilation</li>
<li><a href="https://github.com/clj-commons/etaoin/commit/706f342216af69d23de671803ac67c3e1f515941">etaoin</a>: JDK 19 + babashka issue</li>
</ul>
<h3 id="brief-mentions">Brief mentions:</h3>
<p>The following projects also got updates, mostly in the form of maintenance and performance improvements. This post would get too long if I had to go into detail about them, so I&rsquo;ll briefly mention them in random order:</p>
<ul>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</li>
<li><a href="https://github.com/babashka/nbb">Nbb</a>: Scripting in Clojure on Node.js using SCI</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: Babashka&rsquo;s http-client</li>
</ul>
<h3 id="other-projects">Other projects:</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in the past month.</p>
<ul>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a></li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)   <br></li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.<br> Tagged: <em><a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></em></p>
<h3 id="april-2023-report">April 2023 Report</h3>
<p>(Published: 30 April 2023)</p>
<p>In this post I&rsquo;ll give updates about open source I worked on during April 2023. To see previous OSS updates, go <a href="https://blog.michielborkent.nl/tags/oss-updates.html">here</a>.</p>
<h3 id="babashka-confhttpsbabashkaorgconf"><a href="https://babashka.org/conf/">Babashka-conf</a></h3>
<p>Babashka-conf is happening June 10th in Berlin. Save the date and/or submit your babashka/clojure-related talk or workshop in the CfP!<br></p>
<h3 id="projects">Projects</h3>
<p>The following projects had updates in the last month. Note that only highlights are mentioned and not a full overview of all changes. See the project&rsquo;s changelogs for all changes.</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>: static analyzer and linter for Clojure code that sparks joy.
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1196">#1196</a>: show language context in <code>.cljc</code> files with <code>:output {:langs true}</code>. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/config.md#show-language-context-in-cljc-files">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2030">#2030</a>: Add a new <code>:discouraged-tag</code> linter for discouraged tag literals. See the <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#discouraged-tag">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/2058">#2058</a>: warn about <code>#()</code> and <code>#&quot;&quot;</code> in `.edn files</li>
</ul>
</li>
<li><a href="https://github.com/babashka/babashka">babashka</a>: native, fast starting Clojure interpreter for scripting
<ul>
<li>Released 1.3.177 - 1.3.179</li>
<li><a href="https://github.com/babashka/babashka/issues/1541">#1541</a>: respect <code>bb.edn</code> adjacent to invoked file. This eases writing system-global scripts from projects without using bbin. See <a href="https://book.babashka.org/#_script_adjacent_bb_edn">docs</a>.</li>
<li>See the complete <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">CHANGELOG</a>.</li>
</ul>
</li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a> Experimental ClojureScript to ES6 module compiler
<ul>
<li>Improve <code>cherry.embed</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs
<ul>
<li>Better error message when trying to <code>recur</code> across <code>try</code></li>
<li>Improvement for error locations in multiple threads</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata
<ul>
<li>Improvements for reading namespaced maps</li>
</ul>
</li>
<li><a href="https://github.com/babashka/book">babashka.book</a>: Babashka manual
<ul>
<li>Several corrections</li>
<li>Dynamic <code>:exec-args</code></li>
<li>Script-adjacent <code>bb.edn</code> docs</li>
</ul>
</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!
<ul>
<li>Support <code>--no-option</code> and parse as <code>{:option false}</code></li>
<li>Support grouped aliase like <code>-ome</code> as <code>{:o true, :m true, :e true}</code></li>
</ul>
</li>
<li><a href="https://github.com/babashka/http-client">http-client</a>: Babashka&rsquo;s http-client
<ul>
<li>Support <code>java.net.URI</code> directly in <code>:uri</code> option</li>
<li>Better <code>:ssl-config</code> option support</li>
<li>Better <code>:proxy</code> option support</li>
</ul>
</li>
<li><a href="https://github.com/babashka/pod-babashka-go-sqlite3">pod-babashka-go-sqlite3</a>: A babashka pod for interacting with sqlite3
<ul>
<li>Better error message when connection is not a string</li>
</ul>
</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI
<ul>
<li>Fix <code>:local/root</code> deps in <code>nbb.edn</code> when not invoking from current working directory</li>
<li>Fix regression, <code>cljs.core/PersistentQueue.EMPTY</code> no longer working</li>
</ul>
</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a>
<ul>
<li>Add transform function</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure
<ul>
<li>Add option to elide commas</li>
</ul>
</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure
<ul>
<li>Catch up with clojure CLI changes</li>
</ul>
</li>
</ul>
<h3 id="contributions-to-other-projects-1">Contributions to other projects:</h3>
<ul>
<li><a href="https://github.com/clojure/clojurescript">clojurescript</a>:
<ul>
<li><a href="https://github.com/clojure/clojurescript/pull/202">PR 202</a>: a <code>macroexpand</code> fix</li>
<li><a href="https://github.com/clojure/clojurescript/pull/203">PR 203</a>: a symbol optimization fix</li>
</ul>
</li>
<li><a href="https://github.com/metosin/malli/commit/cf918db28ff71a2f735f465f30f0bc1028ecd7d9">malli</a>: cherry integration</li>
<li><a href="https://github.com/nextjournal/clerk/commit/cb079b14213185d27c5a2d1cc1e80943521a4fb5">clerk</a>: cherry integration</li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/commit/60d67cca59f0747e8b68802157afbe7f61440c7f">clojure-lsp</a>: integrated a new clj-kondo feature: showing the languages in a CLJC context</li>
</ul>
<h3 id="other-projects-1">Other projects:</h3>
<p>These are (some of the) other projects I&rsquo;m involved with but little to no activity happened in the past month.</p>
<ul>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/borkdude/gh-release-artifact">gh-release-artifact</a>: Upload artifacts to Github releases idempotently</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/cljs-showcase">cljs-showcase</a>: Showcase CLJS libs using SCI</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</li>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: Interact with clojure-lanterna from babashka</li>
<li><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a>: babashka filewatcher pod</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://borkdude.github.io/clj2el/">clj2el</a>: transpile Clojure to elisp</li>
<li><a href="https://github.com/borkdude/deflet">deflet</a>: make let-expressions REPL-friendly!</li>
<li><a href="https://github.com/babashka/json">babashka.json</a>: babashka JSON library/adapter</li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.<br>
Tagged: <em><a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></em><br></p>
<hr>
<h3 id="sean-corfield">Sean Corfield</h3>
<p>(Published 30 April 2023)</p>
<p>In my <a href="https://corfield.org/blog/2023/02/28/long-term-funding-1/">previous Long-Term Funding update</a>) I said that I planned &ldquo;to review and/or overhaul the Getting Started, Introduction, and Web Development sections, with a focus on the latter.&rdquo; (of the <a href="https://clojure-doc.org">clojure-doc.org</a> website). I mostly achieved that goal but didn&rsquo;t get to the additional goal I set of writing a <code>tools.build</code> cookbook. I have sketched out the topics I hope to cover in that cookbook, however.<br></p>
<p>How did the past two months go?</p>
<h3 id="clojure-docorg">clojure-doc.org</h3>
<p>I updated <a href="https://clojure-doc.org/articles/tutorials/getting_started/">Getting Started with Clojure</a> to talk about both Leiningen <strong>and</strong> the Clojure CLI and wrote a new <a href="https://clojure-doc.org/articles/tutorials/getting_started_cli/">Getting Started with the Clojure CLI</a> page that also covers <code>tools.build</code> / <code>build.clj</code> and building uberjars. Both pages now have a new section highlighting <strong>Interactive Development</strong> (as opposed to &ldquo;just&rdquo; using a REPL).<br></p>
<p>I reviewed the <a href="https://clojure-doc.org/articles/tutorials/introduction/">Introduction to Clojure</a> and decided it was mostly sound, but added more examples, tweaked the formatting, and added references to the Clojure CLI.</p>
<p>I reworked John Gabriele&rsquo;s excellent <a href="https://clojure-doc.org/articles/tutorials/basic_web_development/">Basic Web Development guide</a> to use the Clojure CLI, updated all the library references, and reordered the sections to work bottom-up so that code could always be evaluated in the REPL.<br></p>
<p>I didn&rsquo;t get as far as I wanted with the <code>tools.build</code> cookbook due to a combination of writer&rsquo;s block (and stress over my mother being taken to hospital unexpectedly for a fractured hip &ndash; she&rsquo;s nearly 90, has osteoporosis, and her oxygen levels are too low/precarious for surgery at this point; she&rsquo;s home now but it&rsquo;s been a rough few weeks).</p>
<h3 id="deps-new">deps-new</h3>
<p>As the <a href="https://github.com/practicalli/project-templates">Practical.li project templates</a> were being developed, John found a bug in the <code>template</code> project which I fixed and in turn I reviewed drafts of his <a href="https://practical.li/blog/posts/create-deps-new-template-for-clojure-cli-projects/">articles about creating project templates using <code>deps.new</code></a>, both of which are now linked from the <code>deps-new</code> README and documentation.</p>
<h3 id="honeysql">honeysql</h3>
<p>During March/April, HoneySQL saw four new releases, which were mostly an even
split between improving documentation and expanding ANSI SQL support.<br> <br>
Many of the questions I see about HoneySQL on Slack (and other places) suggest
deficiencies in the documentation so, while I try to answer those questions
directly on Slack, I also tend to create GitHub issues for them to see if I
can improve the documentation in those areas.<br><br>
Some of the ANSI SQL improvements including support for <code>INTERVAL</code>,
keyword arguments in function calls, nested <code>JOIN</code>, standardizing <code>TRUNCATE</code> syntax,
and <code>WITH ORDINALITY</code>. There were also bug fixes and documentation
improvements around <code>DO UPDATE SET</code> and a number of other constructs.<br></p>
<p>I&rsquo;d also like to give a special shout-out to <a href="https://github.com/p-himik">Eugene Pakhomov</a>
who contributed three pull requests to the release that went out in early March.</p>
<h3 id="nextjdbc">next.jdbc</h3>
<p><code>next.jdbc</code> also saw four releases, which provided a mix of bug fixes,
compatibility improvements (with <code>clojure.java.jdbc</code>, to ease migration),
documentation improvements, and a few enhancements.</p>
<h3 id="nextjdbcxt">next.jdbc.xt</h3>
<p>The <a href="https://www.juxt.pro/">Juxt</a> team were present in force at
<a href="https://2023.clojure-conj.org/">Clojure/conj</a> this year and announced
early access to <a href="https://www.xtdb.com/blog/2x-early-access">XTDB 2.0</a>.<br> <br>
I think this will be a very exciting release, with improved bitemporality
(including temporal joins and range scans), a new columnar architecture,
and &ndash; the part that interests me the most &ndash; a dynamic relation engine
that provides both a Datalog API <strong>and</strong> a SQL API.<br><br>
That inspired me to create a new project, offering experimental support
for XTDB 2.0 in <code>next.jdbc</code>: <a href="https://github.com/seancorfield/next.jdbc.xt"><code>next.jdbc.xt</code></a>.
This allows you to treat an XTDB client &ldquo;node&rdquo; as a &ldquo;connectable&rdquo; so
you can call <code>execute!</code>, <code>execute-one!</code>, and <code>plan</code> on it (as well as the
full range of &ldquo;friendly SQL functions&rdquo;).<br></p>
<p>As XTDB 2.0 evolves, I plan to continue to enhance this new project to
hopefully support batch operations and perhaps full transaction support, if possible.<br></p>
<h3 id="whats-next">What&rsquo;s Next?</h3>
<p>In May/June, I hope to get the <code>tools.build</code> cookbook written and
to review/overhaul the Libraries pages (both authoring and the directory).</p>
<p>Tags:<em>&ldquo;clojure&rdquo; &ldquo;clojure-doc.org&rdquo; &ldquo;open source&rdquo; &ldquo;tools.build&rdquo; &ldquo;community&rdquo;</em><BR></p>
<hr>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>(Published 1 May 2023)</p>
<p>These 2 months I spent a considerable time improving java interop support in both clj-kondo and clojure-lsp, so LSP can understand it better and provide completion, definition, hover and other features in a close future as mentioned below.</p>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>The main highlights for this release are:<br></p>
<ul>
<li>clojure-lsp feedback for Editor UI is faster (Emacs users you may notice that reducing <code>lsp-idle-delay</code> to something lower like <code>0.05</code>)</li>
<li>We now have a new edn tree visualization from <code>documentSymbolfeature</code>, showing all keyords of a edn for faster navigation/visualization!</li>
<li>Adds support for completion of Static java classes (for now only for classes from .class, not .java, check print), I&rsquo;m working on improvements on clj-kondo and clojure-lsp to improve that even further being able to see docs of java methods and more, stay tuned! <br></li>
</ul>
<p><img src="https://github.com/clojurists-together/clojuriststogether.org/assets/14980147/69ac058d-3d22-465a-a116-2332c95dab18" alt="endtreedallo">  <br></p>
<h4 id="20230419-124329br">2023.04.19-12.43.29<br></h4>
<p><strong>General:</strong></p>
<ul>
<li>Fix reflection issue in JDK19 with <code>Thread/sleep</code> #1520</li>
<li>Bump clj-kondo to <code>2023.04.15-20230418.173453-3</code>, fixing analysis inconsistencies with <code>schema.core</code></li>
<li>Ignore vars defined wrongly via config. #1510</li>
<li>Add support for <code>:output {:langs true}</code> in clj-kondo config to show <code>.cljc</code> language contexts</li>
</ul>
<p><strong>Editor:</strong></p>
<ul>
<li>Fix classpath issue message to properly ignore or retry after user input. #1500</li>
<li>Decreate debounce time for calculating changes and diagnostics, improving UX in cost of performance, it doesn&rsquo;t seem to highly affect performance though.</li>
<li>Add new setting to change diagnostics range type. #1530</li>
<li>Spec compliance: avoid registering client capabilities if dynamic registration is not set. #1535</li>
<li>Improve java support: using new <code>java-member-definitions</code> analysis, first feature is the allow completion of static members (fields and methods) for java classes.</li>
<li>Show edn tree when in edn files via <code>documentSymbol</code> feature.</li>
<li>Improve java db cache consistency + analysis performance.</li>
</ul>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo-1"><a href="https://github.com/clj-kondo/clj-kondo/">clj-kondo</a></h3>
<p><a href="https://github.com/clj-kondo/clj-kondo/pull/2053">#2503</a>: parse java files via javaparser to produce java-member-definitions analysis
<a href="https://github.com/clj-kondo/clj-kondo/issues/1983">#1983</a>: add support for java member analysis, via new java-member-definitions bucket (@ericdallo).</p>
<h3 id="clojureconj-2023">ClojureConj 2023</h3>
<p>I gave a talk at ClojureConj about how to use clojure-lsp as a linter for multiple projects and how to manage everything in a single place, should be available soon in <a href="https://www.youtube.com/@ClojureTV/videos">https://www.youtube.com/@ClojureTV/videos</a> <br></p>
<hr>
<h2 id="christophe-grand">Christophe Grand</h2>
<p>(Published 4 May 2023)</p>
<h3 id="clojuredart">ClojureDart</h3>
<p>The period ended with the Conj and our ClojureDart talk was well received 🎉.
Still it&rsquo;s worth repeating the core message: ClojureDart is useable <em>right now</em>!
You can use it to write mobile or desktop apps, CLIs and lambdas. Web even.
It doesn&rsquo;t mean our work is done but language-wise the only missing feature are multimethods.
Macros do work but sometimes need some annotations &ndash; this will be fixed once we are self-hosted.
And there are so many places where we can still make interop nicer.</p>
<p>Speaking of self-hosted, the reader rewrite (the previous one was accidentally quadratic 🙄) is coming to fruition now that the design is settled. Design took time because I wanted to have a chunked reader, so as to be able to process big files and REPL input.</p>
<p>A lot of time was spent fixing bugs or making usability improvements (I&rsquo;m looking forward to porting gen tests from CLJ/CLJS) and helping users on Slack. More often than not fixes/improvements were an answer to users experiences.</p>
<h3 id="fixes">Fixes:</h3>
<p>Chunked seqs on vectors (twice!), inconsistent hash values across platforms (web vs others), fixed cross-nses protocols which AOT compiled fine but failed on hot-reload, fixed bug with collisions on transient maps, fixed issue with comparator fns.</p>
<h3 id="improvements">Improvements:</h3>
<ul>
<li>better error message on macro expansion failure,</li>
<li>update README Flutter example to use <code>cljd.flutter</code> (plain interop before) as we are confident with our design now and that the default experience (especially towards hot reloading works as expected)</li>
<li>removed small inefficiencies in maps</li>
<li>tear-off support: unlike in JS, in Dart <code>obj.meth</code> returns a function closing over <code>obj</code> as <code>this</code> &ndash;   like <code>obj.meth.bind(obj)</code> would do in JS. That&rsquo;s what they call &ldquo;tear-offs&rdquo; in Dart. We have added (or rather re-enabled) support for tear-offs in Dart. More work needs to be done for better type inference of the returned function.</li>
<li>removed <code>nullWriter</code> usage which required Java 11 and caused bad first experiences for some users. So now Java 8 is enough.</li>
</ul>
<h3 id="new-features">New features:</h3>
<ul>
<li>sorted colls are at parity with Clojure&rsquo;s: rseq, subseq, rsubseq support have been added.</li>
<li>rseq on subvecs</li>
<li>in <code>cljd.flutter</code>, <code>:watch</code> accepts an <code>:as</code> option for the common case of local state, e.g. <code>:watch [the-value (atom nil) :as the-atom]</code> . Previously the more involved <code>:managed [the-atom (atom nil) :dispose nil] :watch [the-value the-atom]</code> was required and non-obvious to many users. While we are on it <code>:dispose nil</code> (or <code>false</code>) is new too: previously to have the same effect (no disposal) you had to write hacks such as <code>:dispose comment</code>, <code>:dispose do</code>, <code>:dispose -&gt;</code>&hellip;</li>
</ul>
<h3 id="future-work">Future work:</h3>
<h3 id="clojuredart-1">ClojureDart</h3>
<ul>
<li>Finish the new chunked reader</li>
<li>We have found a path allowing a Flutter-only REPL could be hacked in a couple of days, is it worth the hack?</li>
<li>Look into porting Datascript and SCI to ClojureDart</li>
<li>New APIs to leverage our persistent data structures:
<ul>
<li>maps (hash and sorted) in ClojureDart are original implementations (not the same as CLJ/CLJS) &ndash; hash maps could be seen as another refinement of the original, sorted maps constitute a novel implementation.</li>
<li>Sorted colls should be good enough for direct use by Datascript.</li>
<li>Both hash and sorted maps can support accelerated merge/diff/join/etc. operations.</li>
</ul>
</li>
<li>Multimethods</li>
<li>Dart 3 support</li>
<li><code>cljd</code> CLI written in <code>cljd</code> for easier project creation etc.</li>
<li>gen tests<br></li>
</ul>
<hr>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>(Published 3 May 2023)</p>
<h3 id="shadow-cljs">shadow-cljs</h3>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).<br>
Current shadow-cljs version: 2.23.3 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p><strong>Notable Updates:</strong></p>
<ul>
<li>Tweaked <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#js-provider-external">:js-provider :external</a> to optionally output ESM code (JS <code>import</code>), which enables some tools such as webpack to tree shake npm dependencies properly.<BR></li>
</ul>
<hr>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>(Published 1 May 2023)</p>
<p>Three big things happened in the last two months:</p>
<ul>
<li>Clojure Sublimed 3.0 release with new pluggable REPL infrastructure and Socket Server REPL support</li>
<li>Proper accented input support in JWM on macOS</li>
<li>Majority of research for new state implementation and component DSL for Humble UI</li>
</ul>
<h3 id="humble-uihttpsgithubcomhumbleuihumbleui"><a href="https://github.com/HumbleUI/HumbleUI">Humble UI</a></h3>
<ul>
<li>Text fields now support accented input with ApplePressAndHoldEnabled on macOS</li>
<li>Basic paragraph impl (!)</li>
<li>Fixed linux dependencies #72</li>
<li>Setting/Debug toggle works across tools.namespace reloads</li>
<li>fixed label to apply all features instead of just last one</li>
<li>Draw inside vscroll uses child height instead of Integer/MAX_VALUE</li>
<li>Preliminary signals impl</li>
<li>Treemap example that scans a directory on your disk and displays what occupies the most space</li>
<li>Switched to Socket REPL</li>
<li>hash-p for easier debugging</li>
</ul>
<h3 id="jwmhttpsgithubcomhumbleuijwm"><a href="https://github.com/HumbleUI/JWM">JWM</a></h3>
<ul>
<li>macOS: Fixed missed trackpad clicks when tap to click is enabled. This has been annoying me and few other folks for quite a while, turned out you can’t trust AppKit API, but luckily can work around it.</li>
<li>macOS: Reworked text input system to support accented input with ApplePressAndHoldEnabled. Also quite a ride, at some point I had to dig into OpenJDK sources and use same proprietary APIs Apple built into macOS just for AWT (accented input was added much later than JDK).</li>
<li>Windows: Merged Window::bringToFront &amp; ::isFront #266</li>
</ul>
<h3 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a></h3>
<ul>
<li>Released 3.0.0 and some quick fixes (3.1.0) after that.</li>
<li>Documented my journey at <a href="https://tonsky.me/blog/clojure-sublimed-3/">Adventures in REPL implementation</a></li>
</ul>
<h3 id="sublime-executorhttpsgithubcomtonskysublime-executor"><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a></h3>
<ul>
<li>Convenience: executor_repeat_last will now automatically stop current process if present. Stop + start again now is a single command!</li>
<li>Execute any shell command #4</li>
</ul>
<h3 id="uberdepshttpsgithubcomtonskyuberdeps"><a href="https://github.com/tonsky/uberdeps">Uberdeps</a>:</h3>
<ul>
<li>Fixed merging data_readers.cljc with reader conditionals #51</li>
</ul>
<h3 id="blogging">Blogging:</h3>
<ul>
<li><a href="https://tonsky.me/blog/clojure-sublimed-3/">Adventures in REPL implementation</a>. It even inspired some people to implement their own REPLs!</li>
<li><a href="https://tonsky.me/blog/humble-state/">Humble Chronicles: State Management</a>. Great feedback on that one, with lots more to learn!  <br></li>
</ul>
<hr>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>(Published 03 April 2023)</p>
<h3 id="malli">Malli</h3>
<ul>
<li>pushed out 3 patch and 1 minor releases (0.10.2, 0.10.3, 0.10.4 and 0.11.0) with lot&rsquo;s of stuff in</li>
</ul>
<h3 id="reitit">Reitit</h3>
<ul>
<li>mostly reviewing and helping with upcoming <a href="https://github.com/metosin/reitit/blob/master/doc/ring/openapi.md">OpenAPI3</a> release, releasing it next month</li>
</ul>
<h3 id="new-stuff">New stuff</h3>
<ul>
<li>worked on <code>metosin/viesti</code> and the attached state machine abstraction, something have used in project, planning to push as open source.</li>
<li>created <code>metosin/ctrl-merge</code>, a fork of <code>weavejester/meta-merge</code> with breaking changes needed to simplify reitit interanls. Rationale on fork <a href="https://github.com/weavejester/meta-merge/issues/11">here</a>.</li>
</ul>
<h3 id="malli-changelog">Malli CHANGELOG</h3>
<h4 id="0110-2023-04-12">0.11.0 (2023-04-12)</h4>
<ul>
<li>BREAKING: remove map syntax: <code>mu/from-map-syntax</code>, <code>mu/to-map-syntax</code>. Note that AST syntax and lite syntax remain unchanged.</li>
<li>BREAKING: walking a <code>:schema</code> with an <code>id</code> no longer passes <code>[id]</code> instead of <code>children</code> to the walker function [#884] (<a href="https://github.com/metosin/malli/issues/884">https://github.com/metosin/malli/issues/884</a>)</li>
<li>Support converting recursive malli schemas to json-schema <a href="https://github.com/metosin/malli/issues/464">#464</a> <a href="https://github.com/metosin/malli/issues/868">#868</a></li>
<li>Add cherry as alternative CLJS evaluator <a href="https://github.com/metosin/malli/pull/888">#888</a></li>
<li>Replace <code>goog/mixin</code> with <code>Object.assign</code> <a href="https://github.com/metosin/malli/pull/890">#890</a></li>
<li>Simplify uuid regex for accept non-standard and zero uuids <a href="https://github.com/metosin/malli/pull/889">#889</a></li>
<li>Fix clj-doc API import <a href="https://github.com/metosin/malli/pull/887">#887</a></li>
</ul>
<h4 id="0104-2023-03-19">0.10.4 (2023-03-19)</h4>
<ul>
<li>FIX <code>malli.swagger</code> ns, broken test on reitit.</li>
</ul>
<h4 id="0103-2023-03-18">0.10.3 (2023-03-18)</h4>
<ul>
<li>Add support for default branch <code>::m/default</code> for <code>:map</code> schema
<a href="https://github.com/metosin/malli/pull/871">#871</a>, see docs: README.md#map-with-default-schemas.</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">  
(<span style="color:#a6e22e">m/validate</span>  

 [<span style="color:#e6db74">:map</span>

  [<span style="color:#e6db74">:x</span> <span style="color:#e6db74">:int</span>]

  [<span style="color:#e6db74">:y</span> <span style="color:#e6db74">:int</span>]

  [<span style="color:#e6db74">::m/default</span> [<span style="color:#e6db74">:map-of</span> <span style="color:#e6db74">:string</span> <span style="color:#e6db74">:string</span>]]]

 {<span style="color:#e6db74">:x</span> <span style="color:#ae81ff">1</span>, <span style="color:#e6db74">:y</span> <span style="color:#ae81ff">2</span>, <span style="color:#e6db74">&#34;kikka&#34;</span> <span style="color:#e6db74">&#34;kukka&#34;</span>})

<span style="color:#75715e">; =&gt; true</span>

</code></pre></div><ul>
<li><code>mt/strip-extra-keys-transformer</code> works with <code>:map-of</code>.</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">
(<span style="color:#a6e22e">m/decode</span>

 [<span style="color:#e6db74">:map-of</span> <span style="color:#e6db74">:int</span> <span style="color:#e6db74">:int</span>]

 {<span style="color:#ae81ff">1</span> <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">2</span> <span style="color:#e6db74">&#34;2&#34;</span>, <span style="color:#e6db74">&#34;3&#34;</span> <span style="color:#ae81ff">3</span>, <span style="color:#e6db74">&#34;4&#34;</span> <span style="color:#e6db74">&#34;4&#34;</span>}

 (<span style="color:#a6e22e">mt/strip-extra-keys-transformer</span>))

<span style="color:#75715e">; =&gt; {1 1}</span>

</code></pre></div><ul>
<li><code>m/default-schema</code> to pull the <code>::m/default</code> schema from entry schemas</li>
<li><code>m/explicit-keys</code> to get a vector of explicit keys from entry schemas (no <code>::m/default</code>)</li>
<li>Simplify content-dependent schema creation with <code>m/-simple-schema</code> and <code>m/-collection-schema</code> via new 3-arity <code>:compile</code> function of type <code>children properties options -&gt; props</code>. Old 2-arity top-level callback function is <code>m/deprecated!</code> and support for it will be removed in future versions. <a href="https://github.com/metosin/malli/pull/866">#866</a></li>
<li>FIX Repeated calls to <code>malli.util/assoc-in</code> referencing non-existing maps fail <a href="https://github.com/metosin/malli/issues/874">#874</a></li>
<li>Updated dependencies:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">
borkdude/edamame <span style="color:#ae81ff">1.1</span>.17 -&gt; <span style="color:#ae81ff">1.3</span>.20

</code></pre></div><h4 id="0102-2023-03-05">0.10.2 (2023-03-05)</h4>
<ul>
<li>Implement <code>malli.experimental.time</code> schemas for clojurescript using js-joda <a href="https://github.com/metosin/malli/pull/853">#853</a></li>
<li>Allow instrumenting external functions <a href="https://github.com/metosin/malli/pull/841">#841</a></li>
<li>Add clj-kondo support for cljs function schemas <a href="https://github.com/metosin/malli/pull/833">#833</a></li>
<li>Turn on instrumentation for <code>mx/defn</code> with <code>:malli/always</code> meta <a href="https://github.com/metosin/malli/pull/825">#825</a></li>
<li>Support type-properties in <code>m/-map-schema</code>, <code>m/-map-of-schema</code> and <code>m/-tuple-schema</code> <a href="https://github.com/metosin/malli/pull/856">#856</a></li>
<li>FIX: properly compose interceptors in :map-of json-transformer <a href="https://github.com/metosin/malli/pull/849">#849</a></li>
<li>FIX: error paths for <code>:multi</code> schemas when value is not a map <a href="https://github.com/metosin/malli/pull/845">#845</a></li>
<li>FIX: Malli generates <code>:nilable/any</code> which is not a valid type in clj-kondo <a href="https://github.com/metosin/malli/issues/821">#821</a></li>
<li>FIX: <code>mi/collect!</code> without args doesn&rsquo;t work properly <a href="https://github.com/metosin/malli/issues/834">#834</a></li>
<li>Updated dependencies:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">
mvxcvi/mvxcvi <span style="color:#ae81ff">2.0</span>.0 -&gt; <span style="color:#ae81ff">2.1</span>.0

borkdude/edamame <span style="color:#ae81ff">1.0</span>.0 -&gt; <span style="color:#ae81ff">1.1</span>.17

</code></pre></div><h3 id="something-else">Something else</h3>
<p>Retuning from my first Conj, really enjoyed the trip!</p>
<p><img src="https://user-images.githubusercontent.com/567532/235355537-22aa71c6-1d3f-4660-9458-0686bba0156b.jpg" alt="conj"><br></p>
<hr>
<h2 id="peter-stromberg">Peter Stromberg</h2>
<p>(Published 3 May 2023)</p>
<p>It&rsquo;s fantastic being sponsored to work on something I love to work with, for people I love to work for. These two month I have been even more user feedback driven than usual. Letting the conversations with users inform me where Calva could help them better. I have then quite immediately addressed the things I think I understand how to address.</p>
<p>With other things it can take quite some time to understand what should be done. The idea for a solution needs to present itself, but some times the idea is very shy! This has been the case with REPL connection automation. It&rsquo;s an area where Calva is strong, yet it hasn&rsquo;t been possible to bring it to zero interaction, and some users really want that. Now, finally, Calva can quite easily be configured for this. While at it, Calva REPL start and connection (a.k.a. Jack-in) is now available for many more projects, even with quite special setup requirements. The solution was to let the user provide their own scripts and Calva will call the script providing environment and command line arguments to control that the REPL is started in a shape that Calva needs it to be. It&rsquo;s quite obvious, but it took several years to figure it out. 😄</p>
<p>A common mistake in monorepos was to use the Calva command for copying the Jack-in command line for a particular project and then run this command line in the wrong monorepo directory. Note the past tense there. Now the copied command can be run from any directory on the computer. Further, the problems on some OS:s with Calva Jack-in zombies walking around after a REPL session are now much less pronounced.</p>
<p>Another thing that talking to users make obvious is that a lot of Calva&rsquo;s functionality is something of a secret. It is satisfying to be able to answer: ”How do I do X?” with: ”There&rsquo;s a settings Y”, or ”Use the command Z”. Though, this often means that Calva is making Y and Z hard to find. We&rsquo;ve now been able to focus a bit on this and to use feedback from users to surface important REPL functionality better.</p>
<p>Calva Notebooks got some nice attention from <a href="https://www.youtube.com/watch?v=xEvkT9YeBQU">Kira McLean at The Conj</a>. As great as the Notebooks are for some users, a bug in VS Code LiveShare has made the Notebook feature a blocker for using Calva in LiveShare sessions. Stefan van den Oord have been maintaining a build of Calva with Notebooks disabled, but many users probably have had no idea about this. We finally found a more convenient workaround, where we can ship the Notebook configuration in a separate extension (named Calva Spritz) that is bundled with Calva. This extension can easily be disabled during LiveShare sessions.</p>
<p>As a side effect to the LiveShare and Notebooks problem workaround, we also realized that the same mechanism can be used to make Joyride reach the parts of the VS Code API we thought was denied to Joyride scripts. Users can <a href="https://blog.agical.se/en/posts/extend-vs-code-in-user-space--without-invented-restrictions/">provide Joyride with a Sidecar</a> extension manifest, and this way control all of VS Code with ClojureScript, in user space.</p>
<p>** Some more things we got done:</p>
<ul>
<li>Add commands for copying HTML code as Hiccup, and also for pasting HTML code as Hiccup.</li>
<li>Provide access to clojure-lsp commands from VS Code keyboard shortcuts (and from Joyride).</li>
<li>Add some more Rich Comment Form evaluation convenience.</li>
<li>Fix many issues with Calva&rsquo;s Clojure indenter, and also a few regarding the formatter.</li>
</ul>
<p>During the past months both Brandon Ringe and I have gotten increasingly fed up with a family of problems stemming from the limitations posed by using a regular file for REPL output, and other output, and also for REPL input. This is a bit ironic because with the <a href="https://www.clojuriststogether.org/news/summer-of-bugs-update-2020/#calva">Clojurists Together Summer of Bugs 2020 sponsoring</a>, I used a lot of the time to get rid of the problematic Webview solution for REPL Window that Calva had back then. Misunderstand this correctly (as we say in Sweden), the regular file solution has served Calva very well, and saved us from the impossible task of fixing the problems with the old Webview. But the limitations are getting too obvious, and now replacing the regular file REPL Window with one based on a Webview is a hot candidate for our time spent the coming two months&hellip; <br></p>
<hr>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<p>(Published 25 April 2023)</p>
<p><strong>Mar/Apr 2023 updates</strong> for <a href="https://www.taoensso.com/">Peter Taoussanis</a>
More details now also at <a href="https://www.taoensso.com/clojure/2023">taoensso.com/clojure/2023</a> 👍</p>
<h3 id="http-kit">http-kit</h3>
<p><a href="https://github.com/http-kit/http-kit/releases/tag/v2.7.0-beta2">http-kit v2.7.0-beta2</a> has been released 🎉
This is the first major http-kit release since June 2022, and includes work from 15 contributors.</p>
<p><strong>Improvements include:</strong></p>
<ul>
<li>Several important <strong>stability fixes</strong></li>
<li>Client+server support for <strong>Unix Domain Sockets</strong></li>
<li><strong>SNI client</strong> is now enabled by default on Java 8+</li>
<li>A new <a href="https://github.com/http-kit/http-kit/wiki">wiki</a> for community documentation  See the <a href="https://github.com/http-kit/http-kit/releases/tag/v2.7.0-beta2">release notes</a> for more info.</li>
</ul>
<h3 id="tempel">Tempel</h3>
<p>One of my major open-source goals for this year is the release of a new <strong>data security framework</strong>, currently <a href="https://www.taoensso.com/clojure/2023">planned</a> for August. This will be the first major all-new Clojure work I&rsquo;ve put out in over 7 years, and has been my main focus so far this year.<br>
Will share more details closer to release, but as a quick teaser: the high-level goal is to make it easy for non-experts to quickly integrate solid data encryption into a variety of types of apps. The work is being grown from an expansion of techniques I&rsquo;ve used in my own apps, and heavily optimised for ease-of-use.</p>
<h3 id="more-beginner-focused-documentation">More beginner-focused documentation</h3>
<p>Another of my goals for this year (and moving forward) is to put more <strong>emphasis on documentation quality</strong>, and on providing a <strong>smoother experience for beginners</strong>.<br>
As part of that work, I&rsquo;ve started rolling out <strong>GitHub wikis</strong> for community documentation on my various <a href="https://www.taoensso.com/clojure">projects</a>.</p>
<p>I&rsquo;ll be seeding these myself over time, but ultimately my hope is to make it easier and more sustainable for each project&rsquo;s own community to contribute documentation and tips. Tempel (mentioned above) will be my first release to be built from the start with this wiki-focused documentation concept in mind.</p>
<h3 id="whats-next-1">What&rsquo;s next:</h3>
<p>The current <a href="https://www.taoensso.com/clojure/2023">plan</a>:<br></p>
<ul>
<li>A major <a href="https://github.com/ptaoussanis/sente">Sente</a> release in May.</li>
<li>A major <a href="https://github.com/ptaoussanis/carmine">Carmine</a> release in June.</li>
<li>The first Tempel release in August.</li>
<li>Additional Carmine work through EoY.<br></li>
</ul>
<p>A big thanks to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="https://github.com/sponsors/ptaoussanis#sponsors">other sponsors</a> of my open-source work 🙏</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>April 2023 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/april-2023-project-updates/</link>
      <pubDate>Thu, 27 Apr 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/april-2023-project-updates/</guid>
      <description>Updates from Aleph/Manifold, Clerk, Clojure_ts_mode, Donut, Exercism, Neanderthal, Tablecloth</description>
      <content:encoded><![CDATA[<p>Check out the updates from Matthew Davidson, Dragan Djuric, Danny Freeman, Daniel Higginbotham, Martin Kavalar, Ethan Miller, and Bobbi Towers.</p>
<h2 id="project-alephmanifold-matthew-davidson-update-1">Project Aleph/Manifold: Matthew Davidson (Update 1)</h2>
<h3 id="http2-support">HTTP/2 support</h3>
<ul>
<li>Draft HTTP/2 ADR published <a href="https://github.com/clj-commons/aleph/blob/feature/http2/adr/adr-001-http2.adoc">here</a>. Comments welcome in <code>#aleph</code> on Clojurians. I&rsquo;d like to hear what people are hoping for re HTTP/2 in Aleph.</li>
<li>Initial HTTP/2 support implemented on the client-side. SSL/TLS ALPN is working, Netty pipeline setup is working, input is implemented, and currently debugging codec issue on output side.
<ul>
<li>Long-overdue clean-up of internals to support moving forward.</li>
</ul>
</li>
</ul>
<h3 id="other-aleph-changes">Other Aleph changes</h3>
<ul>
<li>
<p>Fixed logging dependency conflict</p>
</li>
<li>
<p>Ring validation PR in final review</p>
</li>
</ul>
<h3 id="supporting-library-work">Supporting library work</h3>
<ul>
<li>
<p>Brainstorming with Zach Tellman (back from the dead!), Arnaud, and Moritz on how to improve Manifold&rsquo;s executor behavior. No solution chosen yet.</p>
</li>
<li>
<p>Working with figurantpp on making manifold deferreds implement CompletionStage</p>
</li>
<li>
<p>Worked with bo-tato on debugging a long-standing gloss decode-stream bug</p>
</li>
</ul>
<h3 id="community-support">Community support</h3>
<ul>
<li>
<p>Helped debug figwheel SSL issue with Aleph</p>
</li>
<li>
<p>Helped debug let-flow/executor interaction issue</p>
</li>
<li>
<p>Helped debug middleware/Websocket issue</p>
</li>
<li>
<p>Helped debug tricky connection timeout issue</p>
</li>
</ul>
<p>Update March 31, 2023<br></p>
<hr>
<h2 id="project-clerk-martin-kavalar-update-1">Project Clerk: Martin Kavalar (Update 1)</h2>
<p><strong>Issue Gardening</strong>
We took the Clojurists Together funding (which I&rsquo;m very grateful for 🙏) as an opportunity to do housekeeping in Clerk&rsquo;s issues.
We took inspiration from how José Valim manages to keep Elixir&rsquo;s issue count below the threshold of a <a href="https://github.com/elixir-lang/elixir/issues">single page on GitHub (25)</a>.</p>
<p>I&rsquo;m happy that we&rsquo;ve been able to <a href="https://github.com/nextjournal/clerk/issues?q=is%3Aissue+is%3Aclosed+closed%3A%3E2023-02-01">close 49 issues since the beginning of February</a>) and are now also well <a href="https://github.com/nextjournal/clerk/issues">below this threshold</a>. We hope to be able to respond more quickly to issues that folks encounter going forward. 🤞
We&rsquo;ve updated <a href="https://github.com/nextjournal/clerk/blob/17df9a51028b8ab046f3080aba685ee72c8f4257/CHANGELOG.md#unreleased">Clerk&rsquo;s changelog</a> (it&rsquo;s big!) and we&rsquo;re improving error messages to ease the upgrade process before cutting a release.<br>
Besides the various smaller fixes, the highlight features of this release will be:</p>
<ul>
<li>👁 Simplifying Clerk&rsquo;s Viewer API by switching viewer names and render-fns to fully-qualified symbols that support jump to definition add clarity</li>
<li>🔌 Support for working offline (once the browser had the chance to cache Clerk&rsquo;s render deps)</li>
<li>🌄 <code>clerk/image</code> and <code>clerk/caption</code> helpers</li>
<li>📇  support for <code>js/import</code></li>
<li>🐞 Fixing a deficiency in Clerk&rsquo;s dependency analysis that could lead to incorrect caching behavior<br>
Next up is weaving those changes into the 📖 <a href="https://book.clerk.vision">Book of Clerk</a> and improving Clerk&rsquo;s support for dashboards.
Update
March 1, 2023</li>
</ul>
<h2 id="project-clerk-martin-kavalar-update-2">Project Clerk: Martin Kavalar (Update 2)</h2>
<p><strong>Clerk v0.13, Execution Progress, Fragments</strong></p>
<p>We started March with the release of <a href="https://github.com/nextjournal/clerk/blob/614a632b9cfcd2446259ee05cdd88eae52ec52e7/CHANGELOG.md#013838-2023-03-02">Clerk v0.13</a>.
Since then, we&rsquo;ve been focused on the following new features:</p>
<ul>
<li>
<p>💈 Show execution progress
When Clerk is doing work, we now show a progress bar with a little status badge to show you what&rsquo;s happening. Would love to get more feedback on this design from the community and we&rsquo;re thinking about following up with updating the doc while the computation is running to further improve on the feedback.</p>
</li>
<li>
<p>🍕 <code>clerk/fragment</code> is a new viewer function that allows splicing a seq of values into the document as if they were produced by results of individual cells. It&rsquo;s useful when programmatically generating content. This took a few tries to get it right and we ended up simplifying the DOM structure along the way.</p>
</li>
<li>
<p>🔌 Automatic reconnect for Clerk&rsquo;s websocket</p>
</li>
<li>
<p>🍱 Support pagination of nested values inside <code>clerk/html</code></p>
</li>
</ul>
<p>We&rsquo;ve reworked the Composing Viewers section in the <a href="https://book.clerk.vision">Book of Clerk</a>.</p>
<p>We also had the chance to <a href="https://px23.clerk.vision">present a Clerk essay</a> at the <a href="https://2023.programming-conference.org/home/px-2023/">Programming Experience workshop</a>. The essay is written with Clerk and published with <a href="https://clerk.garden">Garden</a>. We&rsquo;ve also been able to <a href="https://storage.clerk.garden/nextjournal/clerk-px23@eace4eb4123b1f791e188205e77aa07dc136b9c9/README.pdf">generate a PDF</a> (via <a href="https://github.com/nextjournal/markdown">nextjournal/markdown</a>, <a href="https://pandoc.org">Pandoc</a> and LaTeX) which will be included in the ACM Digital Archives. If you&rsquo;re interested in how this works, check out the <a href="https://github.com/mk/clerk-px23">source code</a>.</p>
<p>Update April 5, 2023<br></p>
<hr>
<h2 id="project-clojure_ts_mode-danny-freeman-update-1">Project Clojure_ts_mode: Danny Freeman (Update 1)</h2>
<p><strong>So far I have working:</strong></p>
<ul>
<li>Basic syntax highlighting</li>
<li>Support automatic installation</li>
<li>Simple non-semantic clojure indentation</li>
<li>Fixed a bug related to comment-region reported by sogaiu</li>
<li>Included readme instructions for install with <code>package-vc-install</code> (new to Emacs 29, pointed out by</li>
<li>Imenu support</li>
</ul>
<p><strong>Upcoming work for the rest of the project</strong></p>
<ul>
<li>More work on indentation, support semantic indentation style (like clojure-mode currently does)</li>
<li>More imenu definitions (types, records, protocols, interfaces, multimethods, etc)</li>
<li>Listing on MELPA/Non_GNU ELPA</li>
<li>More testing, basic major mode things I might have missed</li>
<li>A good readme</li>
</ul>
<p>Update March 15, 2023<br></p>
<hr>
<h2 id="project-donut-daniel-higginbotham-update-1">Project Donut: Daniel Higginbotham (Update 1)</h2>
<p>For late January / February I mostly focused on
<a href="https://github.com/donut-party/system">https://github.com/donut-party/system</a>. The immediate goal is to get it ready for
a 1.0 release. Changes include:
<strong>Added helpers for documenting and inspecting a system</strong><br>
A challenge with working with DI libraries is that, over time, it&rsquo;s easy to
lose track of what components do, why they&rsquo;re there, and how they relate. I&rsquo;ve
added helper functions that structure present top-level views and
documentation of a system so that a system is more comprehensible to devs and
maintainers.</p>
<p><strong>Added <code>with-*system*</code> macro and testing tools and docs</strong><br>
Users brought up that there weren&rsquo;t clear ways to test projects built with
donut.system. I added the <code>with-*system*</code> macro and <code>system-fixture</code> function
to aid testing, and updated docs with testing recommendations.</p>
<p><strong>Removed specter</strong><br>
Specter was thoroughly woven into the code base. I removed it to lighten the
compilation size for ClojureScript projects, and to reduce the learning curve
for contributing to the project.</p>
<p><strong>Added plugin system</strong><br>
One of the goals for donut.system is to provide a foundation for composition,
a more structured way to provide libraries that others can use to extend their
system with minimal manual work to wire things up. I&rsquo;ve added a plugin system
to achieve this goal.</p>
<p><strong>Make component selection independent of signal</strong><br>
In response to feedback, I&rsquo;ve tried to simplify the way component selection works:</p>
<ul>
<li>Disentangle it from signaling</li>
<li>Make <code>select-components</code> dumber by making it always set the specified
components; no logic around detecting <code>::start</code> signal</li>
<li>Add component selection to <code>system</code> function. Lets you do <code>(system :system-name nil #{[:env] [:component-group :component-name]}</code></li>
</ul>
<p>This also seems to be a bit more semantically accurate, in that selecting
components is more about defining the system you&rsquo;re using than it is about
signalling</p>
<p><strong>Significantly updated README</strong><br>
I&rsquo;ve made numerous improvements to the README to make it easier to learn how
to use the library and to cover more use cases, like mocking components.</p>
<p>Update April 8, 2023<br></p>
<hr>
<h2 id="project-exercism-bobbi-towers-update-1">Project Exercism: Bobbi Towers (Update 1)</h2>
<p>The work proposed included expanding the track syllabus by teaching additional concepts, and improving the automated analysis tooling to provide better feedback.<br></p>
<p>As part of the Exercism #12in23 challenge (to learn 12 languages in 2023), I was invited to host Functional February on YouTube and Twitch. So I developed the syllabus in real time, with the live audience representing our most popular type of student, which is one who has skills in some language, but may be completely foreign to functional programming concepts. On one stream we <a href="https://github.com/exercism/clojure/tree/elyses-transformative-enchantments/exercises/concept/elyses-transformative-enchantments">ported an exercise</a> that teaches <code>map</code>, <code>reduce</code> and <code>filter</code>. On another, we built an <a href="https://github.com/exercism/clojure/blob/generator/generator.clj">exercise generator</a> and used it to automate the porting of <a href="https://github.com/exercism/clojure/pull/534">additional</a> practice <a href="https://github.com/exercism/clojure/pull/538">exercises</a> using the canonical data from Exercism&rsquo;s <a href="https://github.com/exercism/problem-specifications">problem-specifications repo</a>. The streams have been so much fun we&rsquo;ve decided to extend the series with Functional Forever. <br></p>
<p>An area of improvement <em>not</em> mentioned in the proposal, but certainly valuable is the in-browser editor. While there are those who are most at home in their text editor, the online editor exists for a good reason and the experience should be good enough that should one choose to use it, they won&rsquo;t be missing out on the interactive style of development using the REPL which makes working with Clojure so special. Conveniently the Exercism editor uses Codemirror 6 which has been wrapped by Nextjournal for outstanding Clojure support for structural editing/navigation and inline evaluation. I&rsquo;ve <a href="https://github.com/bobbicodes/mecca/tree/inline-eval">prototyped</a> my vision for a more interactive coding experience and plan to help integrate it into the site in the coming months. Rather than add a separate output window, I&rsquo;ve opted to show the results entirely inline, but the text will be selectable, and will be cleared when the user presses a key. The evaluation context is powered by SCI, and will pair well with the exercise test runner which runs the unit tests and submits the solution. <br></p>
<p>The <a href="https://porkostomus.gitlab.io/posts-output/2022-12-17-representer/">Clojure representer</a> is responsible for grouping exercise submissions into common approaches. It does this by running the code through a series of normalizations, like formatting, names and macro-expansion. This enables automated feedback comments to be attached to approaches, which is done using the dashboard available to a select group of super-mentors. The representer is functioning well and usage statistics are available on the <a href="https://exercism.org/tracks/clojure/build">build status page</a> which at the time of writing reflects that 1637 representer comments have been shown from the 47 feedback submissions I&rsquo;ve written so far. <br></p>
<p>Update March 15, 2023<br></p>
<hr>
<h2 id="project-neanderthal-dragan-djuric-update-1">Project Neanderthal: Dragan Djuric (Update 1)</h2>
<p>My goal with this round is to implement Sparse Matrix support in Neanderthal.</p>
<p>I started by exploring the vendors engines and APIs, with the main goal on deciding whether to write
a custom C layer to MKL (as I did for Neanderhtal up to this point), or to use machine-generated JavaCPP MKL bindings (which were not available in the early days of Neanderthal). The current state of JavaCPP&rsquo;s MKL turned out to suit well for Neanderthal&rsquo;s needs, so I decided to try to use these instead of writing C from scratch.</p>
<p>I found a way to use JavaCPP side-by side with my custom C bindings for the existing parts of Neanderthal. (It might be a good thing to completely port Neandrthal to JavaCPPs bindings, but that is a larger task more appropriate for the focused project of its own).</p>
<p>I compiled neanderthal-native to work with recent MKL that is compatible with JavaCPP, which made it more compatible with up-to-date distributions.</p>
<p>I released Neandeathal and neanderthal-native 0.46.0 as a starting point for this project.</p>
<p>Since the support for sparse matrices will be based on JavaCPP, while the rest of neanderthal is still on my custom bindings,
I decided that the sparse parts fit into a new add-on library neanderthal-sparse (<a href="https://github.com/uncomplicate/neanderthal-sparse),">https://github.com/uncomplicate/neanderthal-sparse),</a> which might eventually be merged into Neanderthal.</p>
<p>JavaCPP might be a good base for integrating many native libraries other than MKL, so I decided to create a dedicated library Clojure CPP. It integrates the general parts of JavaCPP into the Clojure ecosystem.</p>
<p>The first version is fairly featureful, and is now available at <a href="https://github.com/uncomplicate/clojure-cpp">https://github.com/uncomplicate/clojure-cpp</a>.</p>
<p>Having implemented these general parts, I set to discover how JavaCPP+MKL cobination works, and how to fit it into Neanderthal. So far, I did a port of Neanderthal&rsquo;s CPU vector engines to this new backend.
I identified the glitches and tricky spots, and found the best ways to solve them.</p>
<p>It seems that the stage is ready for the actual sparse vector implementations during the next reporting period, and further ironing out the rough edges. The sparse implementation would follow in the third period, or sooner if possible.</p>
<p>I expect that by the end of this funding round I&rsquo;ll be able to release a fully functional neanderthal-sparse, and clojure-cpp.</p>
<h2 id="project-neanderthal-dragan-djuric-update-2">Project Neanderthal: Dragan Djuric (Update 2)</h2>
<p>My goal with this round is to implement Sparse Matrix support in Neanderthal.</p>
<p>After preparing the stage in the 1st reporting period by creating ClojureCPP, and writing basic JavaCPP bits,
and writing a dense vector prototype that works with JavaCPP, I continued with sparse vector implementation, and
a port of general matrix based on JavaCPP. Along the way, I made various improvements to Neanderthal&rsquo;s internals
to simplify this port, and to make the eventual complete switch to JavaCPP backend easier and more reliable.</p>
<p>Particularly, this has been achieved in the past month.</p>
<ul>
<li>Completed the Dense vector port to JavaCPP, including both real and integer numbers.</li>
<li>An alternative implementation of various primitive engines in Neanderthal sparse is now macro oriented to achieve more DRY (this will be used in Neanderthal eventually)</li>
<li>Completed the implementation of compressed sparse vectors, including engines, and various transfer methods to/from Java and Clojure collections.</li>
<li>Completed an alternative implementation of general matrices, including engines, based on macros and DRY.</li>
<li>Implemented the new implementation for integer general matrices, which were previously not supported in Neanderthal. We need these for sparse matrix indices.</li>
<li>Refactored Neanderthal to support integers in many places where only floats had been supported previously. This war essential for sparse matrix support, but would also streamline the future port to JavaCPP backend.</li>
<li>Fixed various issues along the way that were not the problem in Neanderthal, but that would have made future features more difficult to support.</li>
<li>I&rsquo;ve probably forgot to mention something, but the important thing is that a lot of grunt preparation work has been done to make the implementation of the actual sparse matrices smooth and straightforward.</li>
</ul>
<p>Update March 31, 2023 <br></p>
<hr>
<h2 id="project-tablecloth-ethan-miller">Project Tablecloth: Ethan Miller</h2>
<p>During the last quarter, my focus has been on building consensus around what an MVP for the Tablecloth `column` API should be and working to complete that MVP. I discussed this with members of Clojurians Slack <a href="https://clojurians.zulipchat.com/#narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/tablecloth.20columns.20project/near/329028436">here</a>.</p>
<p>Broadly speaking the MVP will include the following:</p>
<ul>
<li>✅ Column creation methods</li>
<li>✅ Indexing &amp; Subsetting methods</li>
<li>✅ Basic operations (e.g. adding, subtracting, mean etc)</li>
<li>✅ Type validation and introspection methods (i.e. knowing the types of column elements)</li>
<li>✅ Transformation &amp; mapping (i.e. mapping over column elements)</li>
<li>✅ Sorting &amp; Filtering methods</li>
<li>✅ Basic handling for missing values (i.e identify, drop, replace missing
values)</li>
<li>🕑 Documentation of the `column` in the Tablecloth docs</li>
</ul>
<p>The only major piece from this list that remains to be done is the documentation. So, the next steps are to work on documentation and begin a broader review process with @generateme, the author of Tablecloth. That review process will likely take place on the column dev branch <a href="https://github.com/scicloj/tablecloth/tree/ethan/column-api-dev-branch-1">here</a>.</p>
<p>As this is the end of the period where this project is receiving support form Clojurists Together, I wanted to say a few words about where I think this project is heading. When we merge it into Tablecloth, the main impact will be that the <code>column</code> will have a definite presence within the library. Users can then interact with <code>column</code>s using an API that follows the same syntactical conventions everyone enjoys in the <code>dataset</code> API. For a draft run-through of what that API looks like, please download <a href="https://drive.google.com/file/d/1T9XozKu15q6jrXQmr51wNPkBMvufQ27-/view?usp=share_link">this PDF</a></p>
<p>While the ability to manipulate columns is useful in its own right, the presence of the column will also eventually enrich Tablecloth&rsquo;s dataset API. Here one of the critical innovations provided by the <code>column</code> API is the ability to have functions that take a column and return a column: <code>column =&gt; column</code>.</p>
<p>Let me provide one example shared by Carsten Behring that illustrates the simple value of this for the existing dataset API. Consider this dataset-level code that creates a new column <code>:c</code> by adding columns <code>:a</code> and <code>:b</code> together:</p>
<pre><code>(tablecloth.api/add-column ds :c
                           (fn [ds]
                             (tech.v3.datatype.functional/+
                              (:a ds)
                              (:b ds))))
</code></pre><p>This is the only way to express this change Tablecloth does not currently have column =&gt; column operations. Once the column API is part of Tablecloth, we can do the same thing more succinctly:</p>
<pre><code>(tablecloth.api/add-column ds :c (tablecloth.column.api/+ ds :a :b))
</code></pre><p>This example illustrates the value of this work that has laid the foundation for the presence of the <code>column</code> in Tablecloth as a first class citizen.</p>
<p>Update March 31, 2023</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2023 Call for Proposals plus April Survey Results</title>
      <link>https://www.clojuriststogether.org/news/q2-2023-call-for-proposals-plus-april-survey-results/</link>
      <pubDate>Sat, 15 Apr 2023 08:32:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2023-call-for-proposals-plus-april-survey-results/</guid>
      <description>Apply for our next funding round and check out feedback from our members.</description>
      <content:encoded><![CDATA[<h2 id="call-for-proposals">Call for Proposals</h2>
<p>Clojurists Together is pleased to announce that we are opening our Q2 2023 funding round
for Clojure Open Source Projects. Applications are open until the 24th of April 2023. <a href="https://clojuriststogether.org/open-source/"><strong>Apply today!</strong></a></p>
<p>We will be awarding a total of $44,000 USD for 8 projects – 4 projects at $2,000 each
and 4 projects at $9,000 each. The $2k funding tier is for experimental projects or
smaller proposals, whereas the $9k tier is for those that are more established.
Projects generally run 3 months, however, the $9K projects can run between 3 and 12 months
as needed. We expect projects to start for this round between May 1 and June 1, 2023.</p>
<p>In early April, we surveyed our members - to find out what types of initiatives they
would like us to focus on for this round of funding. Their responses are summarized below.
Thanks as always – it is extremely helpful in ensuring that the community is a
vital source of input.</p>
<p>If you work on a Clojure open source project, especially one mentioned as a focus area for our members,
please consider <a href="https://clojuriststogether.org/open-source/">applying</a>.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>As usual, we were inundated with responses to our April 2023 survey.</p>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<p><img src="https://user-images.githubusercontent.com/14980147/232254782-e18b8482-f87e-45df-9283-4e631061b3dd.jpg" alt="Platform"><br>
<br>
<br></p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p><img src="https://user-images.githubusercontent.com/14980147/232254792-5bc388a1-07a0-48c2-b823-e1e013436f0d.jpg" alt="improvements"><br>
<br>
<br></p>
<h3 id="what-areas-of-clojurescript-would-you-like-to-see-improvement-in">What areas of ClojureScript would you like to see improvement in?</h3>
<p><img src="https://user-images.githubusercontent.com/14980147/232254815-1604e6bb-07fb-4c6e-b0b7-05f711b2420a.jpg" alt="clojurescript"><br>
<br>
<br></p>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<p><strong>Growing and Supporting New and Beginning Developers</strong></p>
<ul>
<li>Growing the userbase and general advocacy to attract new talent</li>
<li>Getting started documentation and tutorials that include materials that help guide beginners</li>
<li>Onboarding support for non-senior developers</li>
<li>Example projects, both on the JVM (Clojure) and on Browsers (ClojureScript)</li>
<li>Guides on the fundamentals of Java SDK, like Threads, Threadpools, IO (streams, readers, files)</li>
</ul>
<p><strong>Developer Tooling and Documentation</strong></p>
<ul>
<li>Events handling, interconnect, cross-platform support</li>
<li>Better integration of ClojureScript and JS land. Using JS libs and tools often feel
rough around the edges, impacting the developer experience negatively</li>
<li>I love using Clojure CLI, CIDER, shadow-cljs, and a few other developer tools
but getting everything to work together correctly and to gracefully degrade is
a constant source of pain and a time sink. I&rsquo;d love to see some more love and
attention paid to making the holistic experience and setup easier, better
documented, and less error-prone.</li>
<li>Easier integration with Java and JS, especially interaction with object-oriented
code; machine learning, statistics, time series data</li>
<li>Tools that make initial setup easier</li>
<li>A larger set of tooling and ecosystem around Node.js could also be very useful for a lot of projects.</li>
<li>Vega /vega-lite renderer</li>
<li>Additional work on the Neanderthal framework (bayesian inference, GAM models)</li>
<li>Libraries still have a tendency to fall into an unmaintained state, with
even simple things like updating dependencies failing to be done.</li>
<li>A larger set of tooling and ecosystem around Node.js</li>
</ul>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong?</h3>
<ul>
<li>Great community 💯 We are a stable and wonderful community, building fun projects.</li>
<li>Stability. Simplicity. Getting things done.</li>
<li>Build tooling and linting is getting very solid.</li>
<li>Quality of the support available on Slack is insane.</li>
<li>The reliability. I have a server I built for a financial services client 6 or 7 years ago and it has run with basically no downtime in that period.</li>
<li>The language excels at being compact and supports functional style while allowing one to dip into imperative programming when needed.</li>
<li>The core libraries are strong, and the Clojure build tooling is pretty strong now.</li>
</ul>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>aleph<br>
Babashka<br>
buddy<br>
CIDER<br>
clj-kondo<br>
Clojure-LSP<br>
HoneySQL<br>
http-kit<br>
jdbc.next<br>
Malli<br>
next.jdbc<br>
nrepl<br>
pathom<br>
Reagent<br>
re-frame<br>
Reitit<br>
Ring<br>
shadow-cljs</p>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h3>
<p>Growth of the Community was the focus of many comments:</p>
<ul>
<li>Increased user growth.</li>
<li>I&rsquo;d like to see more newcomers for the long-term health of Clojure.</li>
<li>More startups and projects that use Clojure and speak openly about it.</li>
<li>More professional job opportunities and information about demanding clojure skills amd knowledge.</li>
<li>Maybe funding &ldquo;internships&rdquo; / &ldquo;apprenticeships&rdquo;, or &ldquo;clojure summer of code&rdquo; type
things (for newbies to clojure) (Clojure Camp would be willing to supply the mentorship and
structure), work that grows clojure outside of where it currently reaches</li>
<li>Better materials and tools for beginners to start using Clojure to build applications</li>
<li>I wish there would be an excellent getting started webapp template :)</li>
<li>Growth of the community in general. An additional significant commercial sponsor.</li>
<li>I&rsquo;d like to see more newcomers for the long-term health of Clojure.</li>
<li>More startups and projects that use Clojure and speak openly about it.</li>
<li>More professional job opportunities and information about demanding Clojure skills and knowledge.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>March 2023 Report: Jan. and Feb. Updates for 2023 Long Term Projects</title>
      <link>https://www.clojuriststogether.org/news/march-2023-report-jan.-and-feb.-updates-for-2023-long-term-projects/</link>
      <pubDate>Thu, 30 Mar 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-2023-report-jan.-and-feb.-updates-for-2023-long-term-projects/</guid>
      <description>Updates from Bozhidar Batsov, Michiel Borkent, Sean Corfield, Eric Dallo, Christophe Grand, Thomas Heller, Nikita Prokopov, Tommi Reiman, Peter Stromberg, and Peter Taoussanis</description>
      <content:encoded><![CDATA[<p>Here are the first reports (Jan. and Feb. 2023) from our developers who are receiving annual funding for their 2023 projects. They have been busy! Thanks all for the great work!</p>
<h2 id="2023-annual-funding-bozhidar-batsov">2023 Annual Funding: Bozhidar Batsov</h2>
<p>January/February 2023 Report</p>
<h3 id="cider">CIDER</h3>
<p>I&rsquo;ve been mostly working on the next CIDER release, which I hope to release in March. Here&rsquo;s how things are shaping up so far:</p>
<h3 id="new-features">New features</h3>
<ul>
<li><a href="https://github.com/clojure-emacs/cider/issues/3314">#3314</a>: Detect <code>nrepl+unix</code> sockets (say via <code>lein nrepl :headless :socket nrepl.sock</code>).</li>
<li><a href="https://github.com/clojure-emacs/cider/issues/3262">#3262</a>: Add navigation functionality to <code>npfb</code> keys inside the data inspector&rsquo;s buffer.</li>
<li><a href="https://github.com/clojure-emacs/cider/issues/3310">#3310</a>: Add ability to use custom coordinates in jack-in-dependencies.</li>
<li><a href="https://github.com/clojure-emacs/cider-nrepl/issues/766">#766</a>: Complete local bindings for ClojureScript files.</li>
<li><a href="https://github.com/clojure-emacs/cider/issues/3179">#3179</a>: Introduce <code>cider-jack-in-universal</code> to support jacking-in without a project from a set of pre-configured Clojure project tools.</li>
</ul>
<h3 id="changes">Changes</h3>
<ul>
<li>Allow using <code>npx nbb</code> as <code>cider-nbb-command</code>.</li>
<li><a href="https://github.com/clojure-emacs/cider/pull/3281">#3281</a>: Replace newline chars with actual newlines in <code>*cider-test-report*</code> buffer, for prettier error messages.</li>
<li>Bump the injected <code>cider-nrepl</code> to 0.30.</li>
<li><a href="https://github.com/clojure-emacs/cider/issues/3219">#3219</a>: Disable by default forcing the display of output when the REPL prompt is at the first line of the of the REPL window. This behavior is desirable, but very slow and rarely needed. It can be re-enabled by setting <code>cider-repl-display-output-before-window-boundaries</code> to <code>t</code>.
I&rsquo;ve also did a bunch of documentation improvements here and there. There were also a bunch of improvements to CIDER&rsquo;s test suite during this period.</li>
</ul>
<h3 id="inf-clojure">inf-clojure</h3>
<p>There has been one small improvement here recently:</p>
<ul>
<li><a href="https://github.com/clojure-emacs/inf-clojure/pull/208">#208</a> Display message after setting the current REPL.</li>
</ul>
<h3 id="nrepl">nREPL</h3>
<p>Things have been relatively quiet on this front. There&rsquo;s some ongoing work to improve the test suit and have it running on Windows.
I&rsquo;ve also been in communication with David Miller to discuss the state of nREPL for ClojureCLR and the outstanding work there. The project is very close to being usable and it&rsquo;s current status is documented <a href="https://github.com/clojure/clr.tools.nrepl#status">here</a>. David could definitely use some help from people knowledgeable in CLR to drive it through the finish line!<br></p>
<hr>
<h2 id="2023-annual-funding-michiel-borkent-january-2023">2023 Annual Funding: Michiel Borkent (January 2023)</h2>
<p>In this post I&rsquo;ll give updates about open source I worked on during January 2023.</p>
<p><strong>Sponsors:</strong> But first off, I&rsquo;d like to thank all the sponsors and contributors that make this work possible! Top sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://www.adgoji.com/">Adgoji</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Togethe</a>r</li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.</p>
<p><strong>Attention:</strong>  If you are using Github Sponsors and are making payments via Paypal, please update to a credit card since Github Sponsors won&rsquo;t support Paypal from February 23rd 2023. Read their statement <a href="https://github.blog/changelog/2023-01-23-github-sponsors-will-stop-supporting-paypal/">here</a>. If you are not able to pay via a credit card, you can still sponsor me via one of the ways mentioned above.</p>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast starting Clojure interpreter for scripting. New releases in the past month: 1.0.170 - 1.1.173. Highlights:</p>
<ul>
<li>Support for data_readers.clj(c)</li>
<li>Include <a href="https://github.com/babashka/http-client">http-client</a> as built-in library</li>
<li>Compatibility with <a href="https://github.com/clojure/tools.namespace">clojure.tools.namespace.repl/refresh</a></li>
<li>Compatibility with <a href="https://github.com/clojure/java.classpath">clojure.java.classpath</a> (and other libraries which rely on java.class.path and RT/baseLoader)</li>
<li>Compatibility with <a href="https://github.com/weavejester/eftest">eftest</a> test runner (see demo)</li>
<li>Compatibility with <a href="https://github.com/weavejester/cljfmt">cljfmt</a></li>
<li>Support for <em>loaded-libs</em> and (loaded-libs)</li>
<li>Support add-watch on vars (which adds compatibility with potemkin.namespaces)</li>
<li>BREAKING: make printing of script results explicit with &ndash;prn</li>
</ul>
<h3 id="babashka-compatibility-in-external-libs">Babashka compatibility in external libs</h3>
<p>I contributed changes to the following libraries to make them compatible with babashka:</p>
<ul>
<li><a href="https://github.com/weavejester/cljfmt">cljfmt</a> - A tool for formatting Clojure code</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/philoskim/debux">debux</a> - A trace-based debugging library for Clojure and ClojureScript</li>
</ul>
<p>Check the <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">changelog</a> for all the changes!</p>
<h3 id="http-clienthttpsgithubcombabashkahttp-client"><a href="https://github.com/babashka/http-client">Http-client</a></h3>
<p>The new babashka http-client project mostly replaces <a href="https://github.com/babashka/babashka.curl">babashka.curl</a>. This month the default client was improved to accept gzip and deflate as encodings by default, reflecting what babashka.curl did. Also babashka.http-client is now available as a built-in namespace in babashka v1.1.171 and higher.</p>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>Static analyzer and linter for Clojure code that sparks joy
Three new releases with many fixes and improvements in the last month. <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelog</a> for details.
Some highlights:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1742">#1742</a>: new linter :aliased-namespace-var-usage: warn on var usage from namespaces that were used with :as-alias. See <a href="https://twitter.com/borkdude/status/1613524896625340417/photo/1">demo</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1926">#1926</a>: Add keyword analysis for EDN files. This means you can find references for keywords throughout your project with clojure-lsp, now including in EDN files.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1902">#1902</a>: provide :symbols analysis for navigation to symbols in quoted forms or EDN files. See <a href="https://twitter.com/borkdude/status/1612773780589355008">demo</a>.
The symbol analysis is used from clojure-lsp for which I provided a patch <a href="https://github.com/borkdude/clojure-lsp/commit/f662adab1b17d5dbc3648d6d8208334dc920aa0e">here</a>.</li>
</ul>
<p>A new project around clj-kondo is <a href="https://github.com/clj-kondo/clj-kondo-bb">clj-kondo-bb</a> which enables you to use clj-kondo from babashka scripts.<br>
Also <a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a> got an update.</p>
<h3 id="instaparse-bbhttpsgithubcombabashkainstaparse-bb"><a href="https://github.com/babashka/instaparse-bb">Instaparse-bb</a></h3>
<p>This is a new project and gives you access to a subset of <a href="https://github.com/Engelberg/instaparse">instaparse</a> via a <a href="https://github.com/babashka/pod-babashka-instaparse">pod</a>. Instaparse was request a few times to have as a library in babashka and instaparse-bb is a good first step, without making a decision on that yet. See the relevant discussion <a href="https://github.com/babashka/babashka/discussions/1335">here</a>.</p>
<h3 id="carvehttpsgithubcomborkdudecarve"><a href="https://github.com/borkdude/carve">Carve</a></h3>
<p>Remove unused Clojure vars. In the <a href="https://github.com/borkdude/carve/blob/master/CHANGELOG.md#035">0.3.5</a> version, Carve got the following updates:</p>
<ul>
<li>Upgrade clj-kondo version</li>
<li>Make babashka compatible by using the <a href="https://github.com/clj-kondo/clj-kondo-bb">clj-kondo-bb</a> library</li>
<li>Discontinue the carve binary in favor of invocation with babashka. Instead you can now install carve with <a href="https://github.com/babashka/bbin">bbin</a>:</li>
</ul>
<pre><code> bbin install io.github.borkdude/carve
</code></pre><ul>
<li>Implement <a href="https://github.com/babashka/cli">babashka.cli</a> integration</li>
<li>Implement &ndash;help</li>
</ul>
<h3 id="jethttpsgithubcomborkdudejet"><a href="https://github.com/borkdude/jet">Jet</a></h3>
<p>CLI to transform between JSON, EDN, YAML and Transit using Clojure Version 0.4.23:</p>
<ul>
<li><a href="https://github.com/borkdude/jet/issues/123">#123</a>: Add base64/encode and base64/decode</li>
<li>Add jet/paths and jet/when-pred</li>
<li>Deprecate interactive mode</li>
<li>Deprecate &ndash;query in favor of &ndash;thread-last, &ndash;thread-first or &ndash;func</li>
</ul>
<h3 id="fshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure. Fs has gotten a few new functions:</p>
<ul>
<li>unifixy, to turn a Windows path into a path with Unix-style pathseparators. Note that that style is supported by the JVM and this offers a morereliable way to e.g. match filenames via regexes.</li>
<li>several xdg-*-home helper functions, contributed by <a href="https://github.com/eval">@eval</a><br>
See <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md#changelog">changelog</a> for more details.</li>
</ul>
<h3 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h3>
<p>A CLI to add common aliases and features to deps.edn-based projects. his month there were several small fixes, one of them being to always pick stable versions when adding or upgrading libraries. See full <a href="https://github.com/babashka/neil/blob/main/CHANGELOG.md">changelog</a> for details.</p>
<h3 id="quickbloghttpsgithubcomborkdudequickblog"><a href="https://github.com/borkdude/quickblog">Quickblog</a></h3>
<p>Light-weight static blog engine for Clojure and babashka. The blog you&rsquo;re currently reading is made with quickblog. Version <a href="https://github.com/borkdude/quickblog/blob/main/CHANGELOG.md#023-2023-01-30">0.2.3</a> was released with contributions from several people, mostly enabling you to tweak your own blog even more, while having good defaults. Instances of quickblog can be seen here:</p>
<ul>
<li><a href="https://blog.michielborkent.nl/">Michiel Borkent&rsquo;s blog</a></li>
<li><a href="https://jmglov.net/blog">Josh Glover&rsquo;s blog</a></li>
<li><a href="https://jdt.me/strange-reflections.html">Jeremy Taylor&rsquo;s blog</a></li>
<li><a href="https://blog.cofx.nl/">Luc Engelen&rsquo;s blog</a> (<a href="https://github.com/cofx22/blog">source</a>)</li>
<li><a href="https://rattlin.blog/">Rattlin.blog</a></li>
</ul>
<p>If you are also using quickblog, please let me know!</p>
<p>A collection of ready to be used SCI configs for e.g. Reagent, Promesa, Re-frame and other projects that are used in nbb, joyride, scittle, etc. See recent <a href="https://github.com/babashka/sci.configs/commits/main">commits</a> for what&rsquo;s been improved.</p>
<h3 id="edamamehttpsgithubcomborkdudeedamame"><a href="https://github.com/borkdude/edamame">Edamame</a></h3>
<p>Edamame got a new function: parse-next+string which returns the original string along with the parsed s-expression.</p>
<h3 id="lein2depshttpsgithubcomborkdudelein2deps"><a href="https://github.com/borkdude/lein2deps">lein2deps</a></h3>
<p>Lein to deps.edn converter. This tool can convert a project.edn file to a deps.edn file. It even supports Java compilation and evaluation of code within project.clj. There is now a lein plugin which enables you to sync your project.clj with your deps.edn every time you start lein. Several other minor enhancements were made. See <a href="https://github.com/borkdude/lein2deps/blob/main/CHANGELOG.md">changelog</a>.</p>
<h3 id="4ever-clojurehttpsgithubcomoxalorg4ever-clojure"><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a></h3>
<p>I added the ability to build and deploy 4ever-clojure to Github Actions. Every time a commit is merged, the site is automatically updated.</p>
<h3 id="brief-mentions">Brief mentions</h3>
<p>The following projects also got updates, mostly in the form of maintenance and performance improvements. This post would get too long if I had to go into detail about them, so I&rsquo;ll briefly mention them in random order:</p>
<ul>
<li><a href="https://github.com/borkdude/jna-native-image-sci">jna-native-image-sci</a>: Compile a program that uses JNA to native-image and allow dynamic evaluation using <a href="https://github.com/babashka/sci">SCI</a>!</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</li>
<li><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a>: Run tools.deps as a native binary</li>
<li><a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>: Library of functions for building Clojure projects</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs</li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.. Published: 2023-02-05  Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a><br></p>
<hr>
<h2 id="2023-annual-funding-michiel-borkent-february-2023">2023 Annual Funding: Michiel Borkent (February 2023)</h2>
<p>In this post I&rsquo;ll give updates about open source I worked on during February 2023.</p>
<h3 id="babashkahttpsgithubcombabashkababashka-1"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast starting Clojure interpreter for scripting. New release: 1.2.174. Highlights:</p>
<ul>
<li>Use GraalVM 22.3.1 on JDK 19.0.2. This adds virtual thread support. See <a href="https://twitter.com/borkdude/status/1572222344684531717">demo</a>.</li>
<li>Add more java.time and related classes with the goal of supporting <a href="https://github.com/juxt/tick">juxt.tick</a> (<a href="https://github.com/juxt/tick/issues/86">issue</a>)<br>
See the complete <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">CHANGELOG</a>.</li>
</ul>
<h3 id="babashka-compatibility-in-external-libs-1">Babashka compatibility in external libs</h3>
<p>I worked together with the maintainers of the following libraries to make them compatible with babashka:</p>
<ul>
<li><a href="https://github.com/lambdaisland/kaocha">kaocha</a>: test runner</li>
<li><a href="https://github.com/greglook/clj-multiformats">multiformats</a>: Clojure(Script) implementations of the self-describing multiformat specs</li>
</ul>
<h3 id="http-clienthttpsgithubcombabashkahttp-client-babashkas-http-client"><a href="https://github.com/babashka/http-client">Http-client</a>: Babashka&rsquo;s http-client</h3>
<p>The babashka.http-client namespace mostly replaces <a href="https://github.com/babashka/babashka.curl">babashka.curl</a>.
This month support for :multipart uploads was added, mostly based on and inspired by <a href="https://github.com/gnarroway/hato">hato</a>&rsquo;s implementation.</p>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondobr"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a><br></h3>
<p>Static analyzer and linter for Clojure code that sparks joy. New release: 2023.02.17. Some highlights:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1976">#1976</a>: warn about using multiple bindings after varargs (&amp;) symbol in fn syntax</li>
<li>Add arity checks for core def</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1954">#1954</a>: new :uninitialized-var linter. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#uninitialized-var">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1996">#1996</a>: expose hooks-api/resolve. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/hooks.md#api">docs</a>.<br>
<a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelog</a> for details.</li>
</ul>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p>Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs. This month:</p>
<ul>
<li>Adding JS libraries to a SCI context. See <a href="https://github.com/babashka/sci#javascript-libraries">docs</a></li>
<li>Keyword arguments as map support for CLJS</li>
<li>Making loading of libraries thread-safe in JVM</li>
<li>Several fixes with respect to deftype and toString + equals</li>
</ul>
<h3 id="fshttpsgithubcombabashkafs-1"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure. Highlights:</p>
<ul>
<li>several xdg-*-home helper functions, contributed by <a href="https://github.com/eval">@eval</a></li>
<li>babashka.fs/zip now takes a :root option to elide a parent folder or folders.E.g. (fs/zip &ldquo;src&rdquo; {:root &ldquo;src&rdquo;}) will zip src/foo.clj into the zip file under foo.clj.
See <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md#changelog">changelog</a> for more details.</li>
</ul>
<h3 id="processhttpsgithubcombabashkaprocess"><a href="https://github.com/babashka/process">Process</a></h3>
<p>Clojure library for shelling out / spawning sub-processes. This month I looked into wrapping output of processes with a prefix so when ran in parallel, you can easily distuingish them. A preliminary solution is in <a href="https://github.com/babashka/process/discussions/102#discussioncomment-4903758">this thread</a>.</p>
<h3 id="pod-babashka-lanternahttpsgithubcombabashkapod-babashka-lanterna"><a href="https://github.com/babashka/pod-babashka-lanterna">Pod-babashka-lanterna</a></h3>
<p>Interact with clojure-lanterna from babashka. A very experimental 0.0.1 release was published. You can try it out by playing tetris in the console with babashka:</p>
<pre><code>bb -Sdeps '{:deps {io.github.borkdude/console-tetris {:git/sha &quot;2d3bee34ea93c84608c7cc5994ae70480b2df54c&quot;}}}' -m tetris.core
</code></pre><h3 id="nbbhttpsgithubcombabashkanbbstrongcode"><a href="https://github.com/babashka/nbb">Nbb</a></strong></code></h3>
<p>Scripting in Clojure on Node.js using SCI. Finally nbb has gotten support for passing maps to keyword argument functions:</p>
<pre><code>(defn foo [&amp; {:keys [a b c]}])
(foo :a 1 :b 2 :c 3)
(foo {:a 1 :b 2 :c 3})
</code></pre><p>Several other improvements have been made in the area of macros and resolving JS library references and resolving dependencies in an nbb.edn file, relative to an invoked script which is not in the current directory. See changelogs <a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">here</a>.</p>
<h3 id="joyridehttpsgithubcombetterthantomorrowjoyride"><a href="https://github.com/BetterThanTomorrow/joyride">Joyride</a></h3>
<p>VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>). This month I contributed a built-in version of <a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a> to joyride, so joyriders can rewrite their code from within VSCode.</p>
<h3 id="cljs-showcasehttpsgithubcomborkdudecljs-showcase"><a href="https://github.com/borkdude/cljs-showcase">Cljs-showcase</a>*</h3>
<p>Showcase CLJS libs using SCI. A little project to show how you can use SCI to showcare your CLJS library in an interactive way.</p>
<h3 id="brief-mentions-1">Brief mentions</h3>
<p>The following projects also got updates, mostly in the form of maintenance and performance improvements. This post would get too long if I had to go into detail about them, so I&rsquo;ll briefly mention them in random order:</p>
<ul>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS <em>syntax</em> to JS compiler</li>
</ul>
<h3 id="other-projects">Other projects</h3>
<p>These are some of the other projects I&rsquo;m involved with but little to no activity happened in the past month.</p>
<ul>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a></li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.  Published: 2023-03-01   Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a><br></p>
<hr>
<h2 id="2023-annual-funding-sean-corfield">2023 Annual Funding: Sean Corfield</h2>
<p>January/February 2023 Update<br>
:tags [&ldquo;clojure&rdquo; &ldquo;clojure-doc.org&rdquo; &ldquo;open source&rdquo; &ldquo;tools.build&rdquo; &ldquo;community&rdquo;]}</p>
<p>As part of <a href="https://www.clojuriststogether.org/news/clojurists-together-2023-long-term-funding-announcement/">Clojurists Together&rsquo;s Long-Term Funding for 2023</a> I talked about working on <a href="https://clojure-doc.org">clojure-doc.org</a> which I had resurrected a few years ago, as a GitHub Pages project, powered by <a href="https://cryogenweb.org/">Cryogen</a>.</p>
<p>It was originally created over a decade ago, intended as a community hub for general documentation related to Clojure that couldn&rsquo;t be found on
<a href="https://clojure.org">clojure.org</a> and which wasn&rsquo;t bound by the <a href="https://clojure.org/dev/contributor_agreement">Clojure Contributor Agreement</a>.</p>
<p>A lot has changed since then. The Contributor Agreement has gone from a purely paper and &ldquo;snail mail&rdquo; process to an online e-form. The <code>clojure.org</code> website is now <a href="https://github.com/clojure/clojure-site">on GitHub</a> and accepts Pull Requests (if you&rsquo;ve e-signed the CA) &ndash; and it has expanded massively,compared to the material it covered back then.<br></p>
<p><code>clojure-doc.org</code> itself grew a lot of ambitious content, including extensive guides to <code>clojure.java.jdbc</code> and <code>clojure.core.typed</code> that are now very dated.<br></p>
<p>In addition to cleaning up and modernizing <code>clojure-doc.org</code>, I also said that I wanted to help streamline the beginner experience around Clojure tooling, and I&rsquo;ve started to talk with Alex Miller about possible avenues for that.</p>
<p>My first couple of months have focused on reviewing the content on<code>clojure-doc.org</code> to establish what is still relevant and pruning outdated content, as well as streamlining my own open source projects around tooling.</p>
<h3 id="build-clj--toolsbuild"><code>build-clj</code> &amp; <code>tools.build</code></h3>
<p>I was very pleased when <a href="https://github.com/clojure/tools.build"><code>tools.build</code></a> landed and I aggressively switched all my open source projects and my work
projects over to it.</p>
<p>I initially felt that there was a lot of boilerplate and duplication in the <code>build.clj</code> files I was creating and my initial reaction was to create a simple wrapper that provided &ldquo;sane&rdquo; defaults to make build files smaller and simpler. As people started using this wrapper, it began to develop more &ldquo;knobs &amp; dials&rdquo; to make it more configurable &ndash; and then I created <a href="https://github.com/seancorfield/deps-new"><code>deps-new</code></a> as a modern &ldquo;replacement&rdquo; for [<code>clj-new</code> (https://github.com/seancorfield/clj-new)(which in turn derived from <code>boot-new</code>, which derived from <code>lein new</code>), with the idea of supporting more declarative templates for projects. That led to more &ldquo;knobs &amp; dials&rdquo; on my <code>tools.build</code> wrapper as the projects created by <code>deps-new</code> depended heavily on the wrapper.</p>
<p>In January, I stripped the wrapper out of all my open source projects
<code>build.clj</code> files as a way to make them a better example for beginners. I went on to strip the wrapper out of the usermanager example application](<a href="https://github.com/seancorfield/usermanager-example">https://github.com/seancorfield/usermanager-example</a>) that I regularly link beginners to, as a basic web application, and out of the project templates in <a href="https://github.com/seancorfield/deps-new"><code>deps-new</code></a> so that people creating projects via that will no longer use my wrapper.</p>
<p>The net result should be many more examples of how to use <code>tools.build</code>
directly and a normalization of how <code>build.clj</code> files should be written.
I think the <a href="https://github.com/seancorfield/honeysql/blob/develop/build.clj">HoneySQL <code>build.clj</code></a>
file in particular is a good example of how to run various tasks,
such as <a href="https://github.com/lread/test-doc-blocks"><code>test-doc-blocks</code></a>
and <a href="https://github.com/jonase/eastwood">Eastwood</a>, as well as running
multi-version testing, both Clojure and ClojureScript tests, and building
and deploying a library JAR to Clojars.</p>
<p>I plan to write a cookbook for <code>clojure-doc.org</code> that expands on the
<a href="https://clojure.org/guides/tools_build">official <code>tools.build</code> guide</a>,
covering the sorts of things I&rsquo;ve found useful in both my open source
and work projects.</p>
<h3 id="clojure-docorg"><code>clojure-doc.org</code></h3>
<p>As noted above, <code>clojure.org</code> has grown dramatically since <code>clojure-doc.org</code>
was created and provides more up-to-date content in many areas, so I&rsquo;ve
focused on pruning the duplicated and outdated content and linking to the
official site where up-to-date content now exists.</p>
<p>In particular, the following pages have been unlinked and removed from
the navigation, in favor of other sources:</p>
<ul>
<li>Books &ndash; deferring to clojure.org</li>
<li>Emacs &amp; vim-fireplace &ndash; the former was very outdated, and the latter is only one of several good vim/neovim plugins so deferring to other docs makes more sense</li>
<li>Typed Clojure &ndash; or <code>core.typed</code> as the old section was called, which was a decade old</li>
<li>User Groups, including how to start/run a user group &ndash; deferring to clojure.org</li>
</ul>
<p>I&rsquo;ve temporarily removed all the ecosystem and library pages from the navigation
to make the main sections easier to find, while I review and update them over
the next few months.</p>
<p>The following pages have been overhauled/updated:</p>
<ul>
<li>About &ndash; which is also the README now</li>
<li>Community &ndash; several sections defer to new material on clojure.org</li>
<li>Content &ndash; a work in progress as the site evolves</li>
<li>Editors &ndash; a new overview page has been added with key links to other material</li>
</ul>
<p>Nearly 60 pages have been updated to fix broken links.
<a href="https://github.com/clojure-doc/clojure-doc.github.io/compare/03d64232651eb6ca77630edca6059c0c70fa72be..source">Changes so far this year!</a></p>
<p>I welcome feedback on both the updated content and the site itself,
either via the <a href="https://app.slack.com/client/T03RZGPFR/C02M6N5C137">#clojure-doc channel on Slack</a>
<em>(self-signup at <a href="http://clojurians.net">clojurians.net</a>)</em> or via
<a href="https://github.com/clojure-doc/clojure-doc.github.io/discussions">clojure-doc discussions on GitHub</a>.
Feel free to open issues directly for errors on the site and of course
pull requests on the <code>source</code> branch are also welcome!</p>
<h3 id="whats-next">What&rsquo;s Next?</h3>
<p>In March/April, I plan to review and/or overhaul the Getting Started,
Introduction, and Web Development sections, with a focus on the latter.</p>
<h3 id="additional-project-releases">Additional Project Releases</h3>
<p>In addition to changing all my projects to use plain <code>tools.build</code> instead
of my wrapper for it,
<a href="https://github.com/seancorfield/honeysql">HoneySQL</a>
2.x has had four releases in January/February,
that have mostly focused on improving documentation and also compatibility
with 1.x to make it easier for folks to migrate.<br></p>
<hr>
<h2 id="2023-annual-funding-eric-dallo">2023 Annual Funding: Eric Dallo</h2>
<p>January/February 2023 Report</p>
<h3 id="jetelhttpsgithubcomericdallojetel"><a href="https://github.com/ericdallo/jet.el">jet.el</a></h3>
<p>New opensource project!</p>
<p>jet.el is a Emacs package that uses <a href="https://github.com/borkdude/jet">jet</a>, offering, via a smooth magit-like UI, multiple ways to quickly convert between edn/json/transit/yaml.</p>
<p>Parse edn/json/transit/yaml directly from Emacs using a smooth magit-like interface.
Besides the main entrypoint, the package has lots of commands to parse and:</p>
<ul>
<li>copy to clipboard</li>
<li>to a new buffer</li>
<li>print to messages</li>
<li>just paste at cursor</li>
</ul>
<p>Available at MELPA!
<img src="jet.gif" alt=""></p>
<h3 id="clojure-lsphttpsclojure-lspio"><a href="https://clojure-lsp.io/">clojure-lsp</a></h3>
<p>Clojure-lsp is a tool that can be used both in your editor like Calva, Emacs, Vim and others, and as a command line tool, mostly as a linter for formatting, cleaning and finding diagnostics for a whole project.</p>
<p>There were some improvements on the documentation regarding what and how clojure-lsp can be used in outside your editor <a href="https://clojure-lsp.io/api/what-is-it/">here</a>.</p>
<h3 id="release-20230126-110816">Release 2023.01.26-11.08.16</h3>
<p>The most important features of this release were the find definition of symbols and the edn file support for both editor and lint via CLI, improving the IDE experience, being able to find the definition and references of keywords and symbols, besides that, there was a lot of fixes, performance improvements, and new settings for more projects support.</p>
<p><img src="clojure-lsp-edn-keyword.gif" alt=""></p>
<h4 id="changelog">Changelog</h4>
<p><strong>General</strong></p>
<ul>
<li>Bump clj-kondo to <code>2023.01.20</code></li>
<li>Avoid false-positives of unused-public-var for functions used in :gen-class that starts with <code>-</code> as convention. #1443</li>
<li>New jar available on releases: <code>clojure-lsp-server.jar</code>, an Uberjar not aot-ed containing both clojure-lsp core + server code, improving startup time for JVM clients, for example for <code>lein-clojure-lsp</code>. Any lib using <code>clojure-lsp-standalone.jar</code> should consider switch to this new jar.</li>
<li>Change <code>:source-paths-ignore-regex</code> default value to <code>[&quot;target.*&quot;]</code>, removing resource folders. #1452</li>
<li>Bump cljfmt to 0.9.2</li>
<li>Bump lsp4clj to 1.7.0</li>
<li>Support <code>:style/indent</code> metadata for indentation with cljfmt #1420</li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>Fix add missing import code action when there are multiple options. #1422</li>
<li>Only show completion items if no changed code is being processed, avoiding wrong completion items. #1425</li>
<li>Improve semantic tokens for defprotocol, definterface coloring as <code>interface</code> tokens.</li>
<li>Include reffered vars in completion. #1440</li>
<li>Allow rename alias of function calls, renaming properly both function usages and alias definition.</li>
<li>Add support for keyword analysis in edn files, allowing find-references, document highlight and other lsp features to keywords.</li>
<li>find-definition and references for quoted symbols like <code>'clojure.core/inc</code> and symbols mentioned in <code>.edn</code> files. #1446</li>
<li>Show error messages when can&rsquo;t apply edits after commands. #1448</li>
</ul>
<p><strong>API/CLI</strong></p>
<ul>
<li>Make diagnostics command print as json or edn. #1419</li>
<li>Make possible starting a chan server with clojure-lsp components, useful to other clients extend.</li>
<li>Consider edn files when linting project, allowing to format edn files. #1452</li>
<li>Report diagnostics lines and columns as 1 based, not 0 like LSP, following clj-kondo standard. #1459</li>
</ul>
<h3 id="release-20230227-131212">Release 2023.02.27-13.12.12</h3>
<p>Mostly improvement on completion performance, some improvements on the <strong>hover</strong> feature, and fixes.</p>
<h4 id="changelog-1">Changelog</h4>
<p><strong>General</strong></p>
<ul>
<li>Add new setting <code>:paths-ignore-regex</code> to allow ignore analyzing/linting specific paths, useful if you have folders or files that are not relevant to be linted and are huge which may affect performance.</li>
<li>Bump clj-kondo. Fixes missing lint class constructors, making clojure-lsp show add import code action always.</li>
<li>Fix wrong ns rename for cljc files. #1508</li>
</ul>
<p><strong>Editor</strong></p>
<ul>
<li>Fix cache issue: wrong external dependencies analysis when running clojure-lsp in editor after running on CLI, affecting navigation. #1473</li>
<li>Bump lsp4clj fixing progress notifications during initialization for Calva.</li>
<li>Allow go to definition of namespace even when the var is not known. Ex: <code>clojure.string/foo</code> will go to the definition of <code>clojure.string</code>. This is useful for cases where the var was not created yet but user wants to go to the ns to check the available functions or check the correct name of the function.</li>
<li>Avoid basing results on old analysis.</li>
<li>Add new setting <code>:completion :analysis-type</code> to choose between <code>:fast-but-stale</code>(default) or <code>:slow-but-accurate</code>, this should define whether completion should wait for changes that may still happening, this by default reverts the behavior introduced after #1425. #1487</li>
<li>Fix <code>textDocument/hover</code> issue when doc metadata isn&rsquo;t a string literal.</li>
<li>Follow references to other vars in doc metadata for use in <code>textDocument/hover</code>.</li>
<li>Support <code>:arglists</code> meta when finding docs of functions via hover feature. #1504</li>
<li>Enhance hover to search clojuredocs on CLJS. #1506</li>
</ul>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo-1"><a href="https://github.com/clj-kondo/clj-kondo/">clj-kondo</a></h3>
<p>Worked on analysis stuff regarding edn support for clojure-lsp.<br></p>
<hr>
<h2 id="2023-annual-funding-christophe-grand">2023 Annual Funding: Christophe Grand</h2>
<p>January 2023 Report</p>
<p>This month we merged our changes for a better hot reload (see Update #2) and then went on bugfixing and doing small improvements for a while.<br></p>
<p>A problem kept bothering us: in our <code>cljd.flutter</code> (well in January it was still <code>cljd.flutter.alpha2</code>) we have <code>:watch</code> to react to updates to all kind of stateful objects and <code>sub</code> to narrow the scope of changes we are interested in for a given &ldquo;watchable&rdquo;. This is very useful as it allows to change the frequency at which a piece of UI is updated: one can have a big atom holding a lot of state (and this changing frequently) and watch a slower changing subset of it.<br></p>
<p>However <code>sub</code> only allowed to narrow <em>one</em> watchable. This led to awkward code were every other watchables (IO or framework related) updates had to be shoe-horned in a single canonical atom with the help of listeners (whose lifecycles have to be tied to specific parts of the widget tree) and hair-pulling naming decisions on paths inside this atom.<br></p>
<p>We first extended <code>sub</code> to allow to apply a function across several watchables latest values, somehow behaving like a join.<br></p>
<p>It worked but felt quite stiff and not very pleasing to use. <code>sub</code> relied on the <code>f &amp; args</code> update convention (as used in <code>swap!</code>, <code>update-in</code> etc.) but there&rsquo;s no agreed upon convention for when one has several input and thus it doesn&rsquo;t mesh as well as the single-input version with the core lib.<br></p>
<p>This dissatisfaction led us to develop &ldquo;cells&rdquo;. Cells as in spreadsheets. So cells are expressions which recompute their value when their dependencies values change. Obviously we made cells watchable. A cell is defined by using the <code>$</code> macro (because it caches its latest value) and inside (dynamically, not lexically) a cell one can take (<code>&amp;lt;!</code>) from other cell <em>or any other watchable</em>.<br></p>
<p>Example: assuming <code>now</code> is an atom (a plain old one) updated at 60fps, then <code>($ (.-day (&amp;lt;! now)))</code> is a cell recomputed at 60fps but yielding a new value once a day. So any widget (or other cell) depending on this cell will only be updated once a day. <br></p>
<p>This generalizes nicely to multiple dependencies and even to dynamic dependency graphs. Another interesting fact to know about cells is that a cell is recomputed only when it&rsquo;s watched (and this cascades transitively: an unwatched cell doesn&rsquo;t watch its dependencies&hellip;).<br></p>
<p>Another consequence of cells is that the push for a single big canonical atom goes away.</p>
<p>This changed positively the way we write apps. So much that in our February workshop we talked only about cells, not subs.</p>
<p><a href="https://3.basecamp.com/4323235/buckets/29639833/boosts/new?boost%5Bboostable_gid%5D=Z2lkOi8vYmMzL1JlY29yZGluZy81OTIxMTQ0MDY0">New boost</a> <br></p>
<hr>
<h2 id="2023-annual-funding-thomas-heller">2023 Annual Funding: Thomas Heller</h2>
<p>January/February 2023 Report</p>
<h3 id="shadow-cljs">shadow-cljs</h3>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).
Current shadow-cljs version: 2.21.0 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p><strong>Notable Updates</strong></p>
<ul>
<li>Fixed an issue related to <code>reify</code>, that could happen when <code>:advanced</code> optimizing multiple modules. Running into this had rather confusing and hard to debug errors, so I&rsquo;m glad this is gone. <a href="https://clojure.atlassian.net/browse/CLJS-3207">CLJS-3207</a> is the official issue for this and I hope to make a patch for that at some point</li>
<li>Fixed build reports not properly grouping some npm packages.</li>
<li>Fixed a react-native bad default, since RN apparently only supports ES5 via the now default Hermes engine. <code>:compiler-options {:output-feature-set :es5}</code> is now the default for <code>:target :react-native</code> builds.</li>
<li>Fixed an externs inference issue, which greatly improved externs inference warning coverage. Previously many places would not warn about possible externs issues, and potentially producing bad code in <code>:advanced</code> due to missing externs.<br></li>
</ul>
<hr>
<h2 id="2023-annual-funding-nikita-prokopov">2023 Annual Funding: Nikita Prokopov</h2>
<p>January and February have been two months dedicated to Clojure Sublimed, my Sublime Text plugin for Clojure development.</p>
<p>I wasn&rsquo;t happy how REPL implementation was coupled with syntax highlighting, so I decided to decouple them. That lead to a lot of yak shaving, but also to a much better code base (not in a single file anymore!) and to an ability to add new REPLs much easier. I also added Socket REPL support (no need to load nREPL anymore!) and gave Shadow-CLJS some long deserved love.</p>
<p>Unfortunately, while everything is <em>almost</em> ready, it just didn&rsquo;t make it to end-of-February deadline, so expect the proper release somewhere in the beginning of March. Brave people could already use it from master (I do). Also expect a huge blog posts with a lot of details on this adventure — it was very fun!</p>
<p>More detailed changelog:</p>
<h3 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a></h3>
<ul>
<li>Decoupled REPLs from syntax highlighting</li>
<li>Wrote Clojure parser in Python from scratch</li>
<li>Formatting based on parser (10x speedup)</li>
<li>Namespace and top-level form detection based on parser</li>
<li>Client-side pretty-printer</li>
<li>Split plugin code into modules</li>
<li>Refactored code so that new REPLs could be added</li>
<li>New REPL: Socket REPL</li>
<li>New REPL: Raw nREPL</li>
<li>Improved: Shadow-CLJS REPL</li>
</ul>
<h3 id="sublime-executorhttpsgithubcomtonskysublime-executor"><a href="https://github.com/tonsky/Sublime-Executor">Sublime Executor</a>:</h3>
<ul>
<li>Redid process management based on Default/exec.py</li>
</ul>
<h3 id="humble-uihttpsgithubcomhumbleuihumbleui"><a href="https://github.com/HumbleUI/HumbleUI/">Humble UI</a>:</h3>
<ul>
<li>Played with button and card effects, see video</li>
</ul>
<h3 id="skijahttpsgithubcomhumbleuiskija"><a href="https://github.com/HumbleUI/Skija">Skija</a>:</h3>
<ul>
<li>Merged Linux-arm64 support</li>
</ul>
<h3 id="sublime-color-schemeshttpsgithubcomtonskysublime-color-schemes"><a href="https://github.com/tonsky/sublime-color-schemes">Sublime Color Schemes</a></h3>
<ul>
<li>New repo!</li>
<li>Just some fun themes I make for Sublime from time to time. I spent my last two months in Berkeley scheme from that repo.<br></li>
</ul>
<hr>
<h2 id="2023-annual-fundingtommi-reiman">2023 Annual Funding:Tommi Reiman</h2>
<p>January/February 2023 Report</p>
<p>Spent a lot of time with <a href="https://github.com/metosin/malli">Malli</a> and <a href="https://github.com/metosin/reitit">Reitit</a> for revisiting, prioritizing and designing the essential missing core features.</p>
<p>For Malli, my top priority is to resolve <a href="https://github.com/metosin/malli/issues/264">the derivation and declaration of effective types</a>, which will simplify library internals, writing schema extensions and make CLJS bundle size smaller. Might have to break the protocol-api for this.</p>
<p>For Reitit, drafting a proper plugin system, have studied how this is solved in other ecosystems (e.g. <a href="https://www.fastify.io/">fastify</a>, <a href="https://www.phoenixframework.org/">phoenix</a>). Reitit is powerful, proper plugin system which makes it much more approachable.</p>
<p>Have also reviewed lot&rsquo;s of PRs, helped people online and pushed out some smaller features and release the following:</p>
<h3 id="malli">Malli</h3>
<h4 id="0101-2023-01-21">0.10.1 (2023-01-21)</h4>
<ul>
<li>Strip-extra-keys should not break on non-map values <a href="https://github.com/metosin/malli/pull/818">#818</a></li>
</ul>
<h4 id="0100-2023-01-12">0.10.0 (2023-01-12)</h4>
<ul>
<li>New optional time-schemas for the JVM on top of <code>java.time</code>:
<ul>
<li><code>:time/duration</code>, <code>:time/instant</code>, <code>:time/local-date</code>, <code>:time/local-date-time</code>, <code>:time/local-time</code>, <code>:time/offset-date-time</code>, <code>:time/offset-time</code>, <code>:time/zone-id</code>, <code>:time/zone-offset</code>, <code>:time/zoned-date-time</code>, see <a href="README.md#malliexperimentaltime">README</a></li>
</ul>
</li>
<li>automatic type inferring with <code>:enum</code> and <code>:=</code> with <code>malli.transform</code> and <code>malli.json-schema</code> - detects homogenous <code>:string</code>, <code>:keyword</code>, <code>:symbol</code>, <code>:int</code> and <code>:double</code>), <a href="https://github.com/metosin/malli/pull/782">#782</a> &amp; <a href="https://github.com/metosin/malli/pull/784">#784</a></li>
<li>New <code>malli.core/coercer</code> and <code>malli.core/coerce</code> to both decode and validate a value, see <a href="README.md#coercion">Docs</a></li>
<li>New <code>malli.core/-no-op-transformer</code></li>
<li><strong>BREAKING</strong>: new implemenation for <code>:map-of</code> inferring via <code>malli.provider/provide</code>:
<ul>
<li>Option <code>:malli.provider/map-of-threshold</code> default dropped (was 3)</li>
<li>New and configurable (<code>malli.provider/map-of-accept</code>) function of <code>stats -&gt; boolean</code> for identifying <code>:map-of</code></li>
</ul>
</li>
<li><strong>BREAKING</strong>: Prefer to real Schemas instead of predicates in inferring (e.g. <code>:int</code> over <code>'int?</code>)</li>
<li>Adds <code>:pred</code> option to <code>m/-map-schema</code> <a href="https://github.com/metosin/malli/pull/767">#767</a></li>
<li>New <code>:some</code> schema (like <code>some?</code>)</li>
<li>New <code>malli.experimental.describe</code> to describe Schemas in english:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">* (<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[malli.experimental.describe <span style="color:#e6db74">:as</span> med])

(<span style="color:#a6e22e">med/describe</span> [<span style="color:#e6db74">:map</span> {<span style="color:#e6db74">:closed</span> true} [<span style="color:#e6db74">:x</span> int?]])
<span style="color:#75715e">; =&gt; &#34;map where {:x -&gt; &lt;integer&gt;} with no other keys&#34;</span>
</code></pre></div><h3 id="reitit">Reitit</h3>
<h4 id="060-2023-02-21">0.6.0 (2023-02-21)</h4>
<ul>
<li>Add reitit-frontend support for fragment string <a href="https://github.com/metosin/reitit/pull/581">#581</a></li>
<li>reloading-ring-handler <a href="https://github.com/metosin/reitit/pull/584">#584</a></li>
<li>Remove redundant s/and <a href="https://github.com/metosin/reitit/pull/552">#552</a></li>
<li>FIX: redirect-trailing-slash-handler strips query-params <a href="https://github.com/metosin/reitit/issues/565">#565</a></li>
<li><strong>BREAKING</strong>: Drop tests for Clojure 1.9, run tests with 1.10 &amp; 1.11</li>
<li>NEW option <code>:meta-merge</code> on a router for custom merge strategy on route data</li>
<li>Swagger: support operationId in generated swagger json <a href="https://github.com/metosin/reitit/pull/452">#452</a> &amp; <a href="https://github.com/metosin/reitit/pull/569">#569</a></li>
<li>Update documentation and link to the startrek project <a href="https://github.com/metosin/reitit/pull/578">#578</a></li>
<li>Upgrade jackson for CVE-2022-42003 and CVE-2022-42004 <a href="https://github.com/metosin/reitit/pull/577">#577</a></li>
<li>Improved coercion errors perf <a href="https://github.com/metosin/reitit/pull/576">#576</a></li>
<li>Add example for Reitit + Pedestal + Malli coercion <a href="https://github.com/metosin/reitit/pull/572">#572</a></li>
<li>Handle empty seq as empty string in query-string <a href="https://github.com/metosin/reitit/pull/566">#566</a></li>
<li>Polish pedestal chains when printing context diffs <a href="https://github.com/metosin/reitit/pull/557">#557</a></li>
<li>Updated dependencies:</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">[metosin/ring-swagger-ui <span style="color:#e6db74">&#34;4.15.5&#34;</span>] is available but we use <span style="color:#e6db74">&#34;4.3.0&#34;</span>
[metosin/jsonista <span style="color:#e6db74">&#34;0.3.7&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.3.5&#34;</span>
[metosin/malli <span style="color:#e6db74">&#34;0.10.1&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.8.2&#34;</span>
[fipp <span style="color:#e6db74">&#34;0.6.26&#34;</span>] is available but we use <span style="color:#e6db74">&#34;0.6.25&#34;</span>
[ring/ring-core <span style="color:#e6db74">&#34;1.9.6&#34;</span>] is available but we use <span style="color:#e6db74">&#34;1.9.5&#34;</span>
[com.fasterxml.jackson.core/jackson-core <span style="color:#e6db74">&#34;2.14.2&#34;</span>] is available but we use <span style="color:#e6db74">&#34;2.14.1&#34;</span>
[com.fasterxml.jackson.core/jackson-databind <span style="color:#e6db74">&#34;2.14.2&#34;</span>] is available but we use <span style="color:#e6db74">&#34;2.14.1&#34;</span>  
</code></pre></div><h1 id="something-else">Something else</h1>
<p>Spring is coming!</p>
<img width="1728" alt="spring-fi" src="https://user-images.githubusercontent.com/567532/221986452-83d562ab-c3f0-4362-9041-475df7486af9.png">
<br>      
<hr>
<h2 id="2023-annual-funding-peter-stromberg">2023 Annual Funding: Peter Stromberg</h2>
<p>My first two months of 2023 long term funding was spent in a typical mostly-Calva-someJoyride-and-some-other-stuff manner. 😀 Even though it was an unusual two months in ways I hope will stick, as well as in ways I hope we will see less of.</p>
<h3 id="calvahttpsgithubcombetterthantomorrowcalva"><a href="https://github.com/BetterThanTomorrow/calva">Calva</a></h3>
<p>Calva is growing. This is wonderful and twofold:<br><br>
<strong>1. More users:</strong> We are in a period of picking up many new users. 🎉 It means we spend much more time on user support than we are used to. And that&rsquo;s coming from a situation where user support is the bulk of the time we spend on Calva. We gain many insights. What the beginner experience is like. Bugs we were not aware of are discovered. Use cases we didn&rsquo;t know existed look quite common. And so on.<br></p>
<p><strong>2. More contributions:</strong> With user growth, and the various new needs and problems that reveals, bring more contributors.<br></p>
<ul>
<li>
<p>Many more issues are contributed. The Calva issues list has always had a slow growth. We never close issues as &ldquo;won&rsquo;t fix&rdquo;, unless it is super clear that it is out of the project scope. The current issue growth is unusually high, though.<br></p>
</li>
<li>
<p>Moar PRs! Especially <a href="https://github.com/julienvincent">Julien Vincent</a> and <a href="https://github.com/SillyCoon">Aleksei Ivanov</a> have been busy. Julien has been fixing some big use cases he think were lacking. Aleksei has been focused on quality and fixing existing issues. Thanks! And also thanks to all contributors I am not even mentioning here.<br></p>
</li>
</ul>
<p>The growth has changed the characteristics of <a href="https://github.com/bpringe">Brandon Ringe</a>&rsquo;s and my work with Calva a bit. More time to support and learn from users and contributors, less time on adding features or fixing issues ourselves.<br></p>
<p>Brandon has nonetheless spent considerable time on trying to figure out a tool-chain where we can write more of Calva in ClojureScript. This is a theme throughout Calva&rsquo;s short history. 😀 He has had some successes and some of the usual boring &ldquo;this is really hard and strange&rdquo; moments.</p>
<p>There&rsquo;s a <a href="https://github.com/BetterThanTomorrow/calva-cljs-testbed">separate repository for figuring this out and learning</a> before we start to try implement in the Calva project. We&rsquo;ll see if that ever happens. There are advantages with the current tool-chain. Brandon mentions these:</p>
<ol>
<li>The official tooling and docs are geared toward TS, so there&rsquo;s no translating stuff or figuring out how to make stuff work with cljs, aside from what we&rsquo;ve already put in place.</li>
<li>It&rsquo;s really important to have input and contributions from beginners to Clojure to make Calva better for them. Some/most might be familiar with TS/JS or it might be easier for them to pick up than cljs. 1.</li>
<li>Some contributors might be pretty familiar with VS Code extension dev, but not using cljs, and they might be more likely to contribute if it&rsquo;s written somewhat or mostly in TS.<br></li>
</ol>
<p>February was also a bit different in a not so pleasant way. In releasing some quite big new things, we by mistake changed things we did not want to change, and even broke some things for Windows (non-WSL) users. We have had to make two rollbacks of releases. The content of both these releases have been reworked and released again, save for one new feature which we hope to get in there soon. By this I am reminded about how special a project like Calva is, with so many use cases and different operating system environments, projects and expectations. We hope that our rollbacks were quick enough to not impact work too much for too many people. We try to learn as much as possible from the incidents. (I am pretty sure it will happen many times again. It comes with <a href="https://calva.io/tao/">how the Calva project works</a>.) <br></p>
<p>All in all, we have had 13 new Calva releases, including rollbacks:</p>
<ul>
<li>We now have a model for supporting several clojure-lsp instances per VS Code Workspace. See <a href="https://calva.io/clojure-lsp/">https://calva.io/clojure-lsp/</a>. We think we can carry over some of general concept to when we start supporting more than two (CLJ + CLJS) nREPL sessions per workspace.</li>
<li>More scalable Project selection behaviour (mainly for monorepos) for both the REPL connection and for clojure-lsp.</li>
<li>The Calva indenter now behaves much, much better</li>
<li>[Project auto-selection] (<a href="https://calva.io/connect/#auto-select-project-type)">https://calva.io/connect/#auto-select-project-type)</a>. We&rsquo;re going for supporting fully automated REPL Jack-in and connect, including API that Joyriders can use. This is a step in that direction.</li>
<li>End-to-end testing (using the Joyride test-runner) added. It can test both the extension under development and a release packaged VSIX. Both these are tested in the CI build-test pipeline. There is very, very little coverage yet. The E2E testing compliments Calva&rsquo;s current unit and integration testing.</li>
<li>Many quality issues fixed.</li>
<li>Lessons given to us, some hopefully learnt. I&rsquo;ve started looking at adding Windows executors to our build and test steps in CI. This is WIP, because I got distracted. And I also was a bit defeated by YAML.</li>
</ul>
<h3 id="joyride-with-borkdude-is-so-fun">Joyride with Borkdude is so fun!</h3>
<p>I have spent most of my <a href="https://github.com/BetterThanTomorrow/joyride">Joyride</a> time, with a lot of assistance from <a href="https://github.com/borkdude">Michiel Borkent</a>, adding automatic testing. We&rsquo;ve written a test-runner which is using <code>clojure.test</code> and Joyride itself. It&rsquo;s for e2e testing so far (and possibly will stay like that). Like with Calva, the test-runner can support testing both the extension under development and a packaged VSIX. Both these are tested in the CI build-test pipeline.</p>
<p>There have been five new Joyride releases. * Basic e2e tests coverage (not tied to releases, but anyway) * Improvement in support for writing Joyride scripts with JavaScript * npm require fixes * Enable js/require * Improve JavaScript introspection from the REPL * Add rewrite-clj as a built-in library for Joyride scripts.</p>
<p>We have also made it possible to build Joyride using ESM, to make lazy requires possible. We got as far as we now need to make Joyride&rsquo;s execution async, line <a href="https://github.com/babashka/nbb">nbb</a>&rsquo;s is. This needs to be spearheaded by Michiel, because he&rsquo;s the one who knows what we are doing.</p>
<h3 id="github-readme-project-attention">GitHub ReadME project attention</h3>
<p>The GitHub ReadME Podcast geve <a href="https://github.com/readme/podcast/comaintaining-openness">the Calva model for comaintainership some focus</a>. Brandon and I were interviewed. Some super high level words on what is Clojure survived the editing as well.</p>
<h3 id="various-experiments-conducted">Various experiments conducted</h3>
<p>As always I have been trying to figure out how we can support people new to Clojure better. This is all still quite chaotic for me, with my ideas and thinking being all over the place. Very much still in the hammock, even if some things sometimes find their way to Calva. And this time I&rsquo;ve also created a <a href="https://github.com/PEZ/clojure-get-started-mini">Getting Started with Clojure mini-repo</a> as a result of this thinking process. I&rsquo;m hoping this project can help people find their footing quicker and give them help in starting their own first projects. I think example/starter projects in combination with Calva (and other IDE&rsquo;s) support for them, as well as carefully crafted support for [neil] (<a href="https://github.com/babashka/neil">https://github.com/babashka/neil</a>) might take us far.</p>
<p>I have been experimenting a bit with <a href="https://github.com/hyperfiddle/electric">Electric Clojure</a> to try figure out how Calva supports it as is, and get an idea what Calva (and/or other extensions) could do to leverage this new development model. Not much to show for it, just some instructions contributed to the main and example app repositories. Electric Clojure is under rapid development, so this will have to be a revisited often this year. Thanks to the Electric Clojure team for assisting me so generously and kindly in my explorations.</p>
<p>I arranged my first Meetup, a [Clojure Meetup at that] (<a href="https://www.meetup.com/sthlm-clj/events/291204199/),">https://www.meetup.com/sthlm-clj/events/291204199/),</a> featuring talks from [Josh Glover] (<a href="https://github.com/jmglov">https://github.com/jmglov</a>) and myself. It was hosted at the <a href="https://agical.se">Agical</a> (my employer) office, and food was provided by <a href="https://pitch.com/">Pitch</a>. The event was live streamed. Which was also a first for me, and not without problems. Our production broke with Josh&rsquo;s presentation, leaving us only with a presenters camera which could only barely be convinced to film the slides as they where projected in the room. People tell us that it was still very enjoyable to follow the stream. * The full stream: <a href="https://www.youtube.com/watch?v=NfgYon96dsE">Meetup Feb 23: Blambda! The sound of Babashka and Lambda colliding</a> (talks start at 30 minutes) * My talk: [Give me Interactive Programming, or give me death] (<a href="https://www.youtube.com/watch?v=L0-yDtVUWMQ">https://www.youtube.com/watch?v=L0-yDtVUWMQ</a>) (please share around) I would summarize the meetup with the words of [Verner von Heidenstam] (<a href="https://en.wikipedia.org/wiki/Verner_von_Heidenstam):">https://en.wikipedia.org/wiki/Verner_von_Heidenstam):</a> &gt; It is fairer to listen to the string that broke than to never strain a bow.</p>
<p>Thanks for reading! /[Peter Strömberg (aka PEZ)] (<a href="https://github.com/PEZ">https://github.com/PEZ</a>) <br></p>
<hr>
<h2 id="2023-annual-funding-peter-taoussanis">2023 Annual Funding: Peter Taoussanis</h2>
<p>Hi everyone, <a href="https://github.com/ptaoussanis">Peter Taoussanis</a> here :-)
A brief update on my <a href="https://www.taoensso.com/clojure">open-source work</a> from Jan and Feb 2023 below.</p>
<p>Have been taking the unusual opportunity to concentrate on some larger/thornier items. Major things I&rsquo;ve been working on (in ETA order):</p>
<ol>
<li>
<p><a href="https://github.com/ptaoussanis/sente"><strong>Sente</strong></a> v1.18,<br>
Beta expected: <strong>~early March</strong>.<br>
Current status: in closed testing.
This&rsquo;ll include a significant number of improvements and overdue fixes, focused especially on reliability.</p>
</li>
<li>
<p><a href="https://github.com/ptaoussanis/carmine"><strong>Carmine</strong></a> v3.3,<br>
Beta expected: <strong>~mid March</strong>.<br>
Current status: in closed testing.
This&rsquo;ll include a significant rewrite of the Carmine <strong>message queue</strong> - and provide greatly improved performance and inspection/monitoring capabilities.</p>
</li>
<li>
<p>A new <strong>Clojure data encryption library</strong>,<br>
Alpha expected: <strong>~late March</strong>.<br>
Current status: working-prototype ready.
Will share more details when published, but the gist is that this&rsquo;ll offer a set of tools heavily optimized for ease-of-use in some particularly common cases.
Will support a future upgrade to <a href="https://github.com/ptaoussanis/nippy">Nippy</a>&rsquo;s encryption facilities.
As part of this work, am planning to document some patterns that I&rsquo;ve used in several Clojure web apps to secure user data.</p>
</li>
</ol>
<p>With all upcoming releases, I&rsquo;m also planning to start exploring some new ideas re: <strong>documentation</strong>. The intention will be to help better ease migration during major updates, and to help better accomodate beginners. Will have more to share on this later.</p>
<h2 id="what-then">What then?</h2>
<ul>
<li><strong>http-kit v2.7</strong>, expected <strong>~April</strong>.</li>
<li>TBD (have several options I want to weigh then, depending on feedback).</li>
</ul>
<p>A big thanks again to <a href="https://www.clojuriststogether.org/">Clojurists Together</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.lambdaschmiede.com/">lambdaschmiede</a>, and <a href="https://github.com/sponsors/ptaoussanis#sponsors">other sponsors</a> of my open-source work.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>February 2023 Report: Updates for 2022 Projects</title>
      <link>https://www.clojuriststogether.org/news/february-2023-report-updates-for-2022-projects/</link>
      <pubDate>Sat, 18 Mar 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/february-2023-report-updates-for-2022-projects/</guid>
      <description>Updates from 2022 projects Clj-kondo, ClojureDart, Kaocha, and Practicalli</description>
      <content:encoded><![CDATA[<p>Greetings Clojurists Together community! Read the latest updates for the following 2022 projects:
Clj-kondo, ClojureDart, Kaocha, and Practicalli.</p>
<h3 id="2022-q1-project">2022 Q1 Project</h3>
<h2 id="project-practicalli-john-stevenson">Project Practicalli: John Stevenson</h2>
<p>A range of updates, new content and tool reviews and testing. <a href="https://twitter.com/practical_li/status/1327671242388893697">Reviewed 75 solutions for 44 students on Exercism.io</a> over the last two week, adding that advice and code walk-throughs to the Practicalli Clojure book. \</p>
<h3 id="general-tasks">General tasks</h3>
<ul>
<li>Upgraded to <a href="https://www.mkdocs.org/">MkDocs</a> for book generation, using <a href="https://squidfunk.github.io/mkdocs-material/">Material for MkDocs theme</a> for enhanced content engagement</li>
<li><a href="https://github.com/search?q=is%3Aissue+commenter%3Apracticalli-john">GitHub Issue activity</a></li>
<li><a href="https://github.com/search?q=commenter%3Apracticalli-john">All GitHub activity<br>
</a></li>
</ul>
<h3 id="practicalli-clojure-web-services">Practicalli Clojure Web Services</h3>
<p>Contributions to other projects</p>
<ul>
<li><a href="https://github.com/BrunoBonacci/mulog/pull/96">mulog documentation - add Reitit ring handler middleware example for logging requests and responses</a></li>
</ul>
<h3 id="practicalli-neovim">Practicalli Neovim</h3>
<p>Created a fennel based configuration for Cloure development with Neovim, with a focus on REPL driven dvelopment, using LSP and as distraction free as possible.<br>
All configuration written in fennel, except for a smal lua file to boostrap aniseed fennel to lua compiler.<br>
Started a book to help use Neovim and the Practicall/neovim-config for those new to Neovim (and vim)</p>
<ul>
<li><a href="https://github.com/practicalli-john/neovim-luasnip-snippets">practicalli/neovim-luasnip-snippets</a> custom snippets for Neovim to support development of Practicalli content and code</li>
</ul>
<h3 id="practicalli-clojure">Practicalli Clojure</h3>
<ul>
<li>Updates to practicall/clojure-deps-edn</li>
<li>In process: using Make for a consistent command line experience across projects</li>
<li>In process: GitHub template clojure project - <a href="https://github.com/practicalli/clojure-app-template">https://github.com/practicalli/clojure-app-template</a></li>
</ul>
<h3 id="practicalli-clojure-web-services-1">Practicalli Clojure Web Services</h3>
<ul>
<li>In process: Integrant REPL guide</li>
<li>In process: Gameboard project as example production service with Reitit API, mulog events, http-kit, integrant, postgrest, next.jdbc, hikari connection pool</li>
</ul>
<h3 id="practicall-spacemacs">Practicall Spacemacs</h3>
<p>LSP completion testing shows inconsistent completion on aliases for required libraries</p>
<ul>
<li><a href="https://github.com/practicalli-john/completion-testing">practicalli-john/completion-testing</a></li>
<li><a href="https://clojurians.slack.com/archives/CPABC1H61/p1671197029520839">slack discussion</a></li>
</ul>
<h3 id="blog-posts">Blog posts</h3>
<ul>
<li><a href="https://practical.li/blog/posts/build-and-run-clojure-with-multistage-dockerfile/">Build and run Clojure with Multi-stage Dockerfile</a>
<ul>
<li><a href="https://github.com/practicalli/clojure-app-template/blob/main/Dockerfile">practicalli/clojure-app-template Dockerfile</a> comprehensive multistage Dockerfile example</li>
</ul>
</li>
<li><a href="https://practical.li/blog/posts/make-clojure-tasks-simple-and-consistent/">Make Clojure development tasks simple and consistent</a>
<ul>
<li><a href="https://github.com/practicalli/clojure-app-template/blob/main/Makefile">practicalli/clojure-app-template Makefile</a></li>
</ul>
</li>
<li><a href="https://practical.li/blog/posts/clojurescript-workflow-with-clojure-cli-tools-and-figwheel-main/">ClojureScript workflow with Clojure CLI tools and Figwheel-main</a></li>
<li><a href="https://practical.li/blog/posts/adopt-FreeDesktop.org-XDG-standard-for-configuration-files/">Adopting FreeDesktop.org XDG standard for development tools</a></li>
<li><a href="https://practical.li/blog/posts/build-emacs-28-on-ubuntu/">Building Emacs 28 on Ubuntu Linux</a></li>
<li><a href="https://practical.li/blog/posts/java-17-lts-for-clojure-development/">Java 17 JDK for Clojure development</a></li>
</ul>
<h3 id="updates">Updates</h3>
<ul>
<li><a href="https://github.com/practicalli/blog/pull/152">update: rewrite Clojure CLI understanding aliases</a></li>
<li><a href="https://github.com/practicalli/blog/pull/150">clarify: extra-deps description updated</a></li>
<li><a href="https://github.com/practicalli/blog/pull/149">update: Article build run clojure with multistage dockerfile</a></li>
</ul>
<h3 id="miscellaneous">Miscellaneous</h3>
<ul>
<li>in process: <a href="https://github.com/oxsecurity/megalinter/pull/2115">Add cljstyle linter to MegaLinter project</a></li>
<li>in process: Update clj-kondo version in MegaLinter project</li>
<li>Using cljstyle for checking and formating clojure code - <a href="https://github.com/practicalli/clojure-app-template/blob/main/.cljstyle">Practicalli cljstyle configuration</a> to match clojure style guide
<a href="https://3.basecamp.com/4323235/buckets/26214909/boosts/new?boost%5Bboostable_gid%5D=Z2lkOi8vYmMzL1JlY29yZGluZy81ODc5NTA0NzA4">New boost</a></li>
</ul>
<h3 id="2022-q3-projects">2022 Q3 Projects</h3>
<h2 id="project-clj-kondo-michiel-borkent-jan-2023-update">Project Clj-kondo: Michiel Borkent (Jan. 2023 Update)</h2>
<p>In this post, I&rsquo;ll give updates about open source I worked on during January 2023.</p>
<p><strong>Sponsors</strong>
But first off, I&rsquo;d like to thank all the sponsors and contributors that make this work possible! Top sponsors:</p>
<ul>
<li><a href="https://clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://roamresearch.com/">Roam Research</a></li>
<li><a href="https://nextjournal.com/">Nextjournal</a></li>
<li><a href="https://toyokumo.co.jp/">Toyokumo</a></li>
<li><a href="https://www.cognitect.com/">Cognitect</a></li>
<li><a href="https://kepler16.com/">Kepler16</a></li>
<li><a href="https://www.adgoji.com/">Adgoji</a></li>
</ul>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work in the following ways. Thank you!</p>
<ul>
<li><a href="https://github.com/sponsors/borkdude">Github Sponsors</a></li>
<li>The <a href="https://opencollective.com/babashka">Babaska</a> or <a href="https://opencollective.com/clj-kondo">Clj-kondo</a> OpenCollective</li>
<li><a href="https://ko-fi.com/borkdude">Ko-fi</a></li>
<li><a href="https://www.clojuriststogether.org/">Clojurists Together</a></li>
<li><a href="https://www.patreon.com/borkdude">Patreon</a></li>
</ul>
<p>If you&rsquo;re used to sponsoring through some other means which isn&rsquo;t listed above, please get in touch.</p>
<p><strong>Attention</strong></p>
<p>If you are using Github Sponsors and are making payments via Paypal, please update to a creditcard since Github Sponsors won&rsquo;t support Paypal after February 23rd 2023. Read their statement <a href="https://github.blog/changelog/2023-01-23-github-sponsors-will-stop-supporting-paypal/">here</a>. If you are not able to pay via a creditcard, you can still sponsor me via one of the ways mentioned above.</p>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast-starting Clojure interpreter for scripting. New releases in the past month: 1.0.170 - 1.1.173 Highlights:</p>
<ul>
<li>Support for data_readers.clj(c)</li>
<li>Include <a href="https://github.com/babashka/http-client">http-client</a> as built-in library</li>
<li>Compatibility with <a href="https://github.com/clojure/tools.namespace">clojure.tools.namespace.repl/refresh</a></li>
<li>Compatibility with <a href="https://github.com/clojure/java.classpath">clojure.java.classpath</a> (and other libraries which rely on java.class.path and RT/baseLoader)</li>
<li>Compatibility with <a href="https://github.com/weavejester/eftest">eftest</a> test runner (see demo)</li>
<li>Compatibility with <a href="https://github.com/weavejester/cljfmt">cljfmt</a></li>
<li>Support for <em>loaded-libs</em> and (loaded-libs)</li>
<li>Support add-watch on vars (which adds compatibility with potemkin.namespaces)</li>
<li>BREAKING: make printing of script results explicit with &ndash;prn</li>
<li></li>
</ul>
<h3 id="babashka-compatibility-in-external-libs">Babashka compatibility in external libs</h3>
<p>I contributed changes to the following libraries to make them compatible with babashka:</p>
<ul>
<li><a href="https://github.com/weavejester/cljfmt">cljfmt</a> - A tool for formatting Clojure code</li>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/philoskim/debux">debux</a> - A trace-based debugging library for Clojure and ClojureScript
Check the <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">changelog</a> for all the changes!</li>
</ul>
<h3 id="http-clienthttpsgithubcombabashkahttp-client"><a href="https://github.com/babashka/http-client">Http-client</a></h3>
<p>The new babashka http-client project mostly replaces <a href="https://github.com/babashka/babashka.curl">babashka.curl</a>.
This month the default client was improved to accept gzip and deflate as encodings by default, reflecting what babashka.curl did. Also babashka.http-client is now available as a built-in namespace in babashka v1.1.171 and higher.</p>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>Static analyzer and linter for Clojure code that sparks joy. Three new releases with many fixes and improvements in the last month. <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelog</a> for details. Some highlights:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1742">#1742</a>: new linter :aliased-namespace-var-usage: warn on var usage from namespaces that were used with :as-alias. See <a href="https://twitter.com/borkdude/status/1613524896625340417/photo/1">demo</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1926">#1926</a>: Add keyword analysis for EDN files. This means you can find references for keywords throughout your project with clojure-lsp, now including in EDN files.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1902">#1902</a>: provide :symbols analysis for navigation to symbols in quoted forms or EDN files. See <a href="https://twitter.com/borkdude/status/1612773780589355008">demo</a>.</li>
<li>The symbol analysis is used from clojure-lsp for which I provided a patch <a href="https://github.com/borkdude/clojure-lsp/commit/f662adab1b17d5dbc3648d6d8208334dc920aa0e">here</a>.A new project around clj-kondo is <a href="https://github.com/clj-kondo/clj-kondo-bb">clj-kondo-bb</a> which enables you to use clj-kondo from babashka scripts. Also <a href="https://github.com/clj-kondo/lein-clj-kondo">lein-clj-kondo</a> got an update.</li>
</ul>
<h3 id="instaparse-bbhttpsgithubcombabashkainstaparse-bb"><a href="https://github.com/babashka/instaparse-bb">Instaparse-bb</a></h3>
<p>This is a new project and gives you access to a subset of <a href="https://github.com/Engelberg/instaparse">instaparse</a> via a <a href="https://github.com/babashka/pod-babashka-instaparse">pod</a>. Instaparse was request a few times to have as a library in babashka and instaparse-bb is a good first step, without making a decision on that yet. See the relevant discussion <a href="https://github.com/babashka/babashka/discussions/1335">here</a>.</p>
<h3 id="carvehttpsgithubcomborkdudecarve"><a href="https://github.com/borkdude/carve">Carve</a></h3>
<p>Remove unused Clojure vars. In the <a href="https://github.com/borkdude/carve/blob/master/CHANGELOG.md#035">0.3.5</a> version, Carve got the following updates:</p>
<ul>
<li>Upgrade clj-kondo version</li>
<li>Make babashka compatible by using the <a href="https://github.com/clj-kondo/clj-kondo-bb">clj-kondo-bb</a> library</li>
<li>Discontinue the carve binary in favor of invocation with babashka. Instead you can now install carve with <a href="https://github.com/babashka/bbin">bbin</a>: bbin install io.github.borkdude/carve</li>
<li>Implement <a href="https://github.com/babashka/cli">babashka.cli</a> integration</li>
<li>Implement &ndash;help</li>
</ul>
<h3 id="jethttpsgithubcomborkdudejet"><a href="https://github.com/borkdude/jet">Jet</a></h3>
<p>CLI to transform between JSON, EDN, YAML and Transit using Clojure Version 0.4.23:</p>
<ul>
<li><a href="https://github.com/borkdude/jet/issues/123">#123</a>: Add base64/encode and base64/decode</li>
<li>Add jet/paths and jet/when-pred</li>
<li>Deprecate interactive mode</li>
<li>Deprecate &ndash;query in favor of &ndash;thread-last, &ndash;thread-first or &ndash;func</li>
</ul>
<h3 id="fshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure. Fs has gotten a few new functions:</p>
<ul>
<li>unifixy, to turn a Windows path into a path with Unix-style pathseparators. Note that that style is supported by the JVM and this offers a morereliable way to e.g. match filenames via regexes.</li>
<li>several xdg-*-home helper functions, contributed by <a href="https://github.com/eval">@eval</a></li>
</ul>
<p>See <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md#changelog">changelog</a> for more details.</p>
<h3 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h3>
<p>A CLI to add common aliases and features to deps.edn-based projects.
This month there were several small fixes, one of them being to always pick stable versions when adding or upgrading libraries. See full <a href="https://github.com/babashka/neil/blob/main/CHANGELOG.md">changelog</a> for details.</p>
<h3 id="quickbloghttpsgithubcomborkdudequickblog"><a href="https://github.com/borkdude/quickblog">Quickblog</a></h3>
<p>Light-weight static blog engine for Clojure and babashka. The blog you&rsquo;re currently reading is made with quickblog. Version <a href="https://github.com/borkdude/quickblog/blob/main/CHANGELOG.md#023-2023-01-30">0.2.3</a> was released with contributions from several people, mostly enabling you to tweak your own blog even more, while having good defaults. Instances of quickblog can be seen here:</p>
<ul>
<li><a href="https://blog.michielborkent.nl/">Michiel Borkent&rsquo;s blog</a></li>
<li><a href="https://jmglov.net/blog">Josh Glover&rsquo;s blog</a></li>
<li><a href="https://jdt.me/strange-reflections.html">Jeremy Taylor&rsquo;s blog</a></li>
<li><a href="https://blog.cofx.nl/">Luc Engelen&rsquo;s blog</a> (<a href="https://github.com/cofx22/blog">source</a>)</li>
<li><a href="https://rattlin.blog/">Rattlin.blog</a></li>
</ul>
<p>If you are also using quickblog, please let me know! A collection of ready to be used SCI configs for e.g. Reagent, Promesa, Re-frame and other projects that are used in nbb, joyride, scittle, etc. See recent <a href="https://github.com/babashka/sci.configs/commits/main">commits</a> for what&rsquo;s been improved.</p>
<h3 id="edamamehttpsgithubcomborkdudeedamame"><a href="https://github.com/borkdude/edamame">Edamame</a></h3>
<p>Edamame got a new function: parse-next+string which returns the original string along with the parsed s-expression.</p>
<h3 id="lein2depshttpsgithubcomborkdudelein2deps"><a href="https://github.com/borkdude/lein2deps">lein2deps</a></h3>
<ul>
<li>Lein to deps.edn converter. This tool can convert a project.edn file to a deps.edn file. It even supports Java compilation and evaluation of code within project.clj. There is now a lein plugin which enables you to sync your project.clj with your deps.edn every time you start lein. Several other minor enhancements were made. See <a href="https://github.com/borkdude/lein2deps/blob/main/CHANGELOG.md">changelog</a>.</li>
</ul>
<h3 id="4ever-clojurehttpsgithubcomoxalorg4ever-clojure"><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a></h3>
<p>I added the ability to build and deploy 4ever-clojure to Github Actions. Every time a commit is merged, the site is automatically updated.</p>
<h3 id="brief-mentions">Brief mentions</h3>
<p>The following projects also got updates, mostly in the form of maintenance and performance improvements. This post would get too long if I had to go into detail about them, so I&rsquo;ll briefly mention them in random order:</p>
<ul>
<li><a href="https://github.com/borkdude/jna-native-image-sci">jna-native-image-sci</a>: Compile a program that uses JNA to native-image and allow dynamic evaluation using <a href="https://github.com/babashka/sci">SCI</a>!</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>: VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS syntax to JS compiler</li>
<li><a href="https://github.com/babashka/tools-deps-native">tools-deps-native</a>: Run tools.deps as a native binary</li>
<li><a href="https://github.com/babashka/tools.bbuild">tools.bbuild</a>: Library of functions for building Clojure projects</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
<li><a href="https://github.com/babashka/nbb">nbb</a>: Scripting in Clojure on Node.js using SCI</li>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/babashka/sci">SCI</a>: Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs</li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.
Published: 2023-02-05
Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></p>
</br>
<h2 id="project-clj-kondo-michiel-borkent-feb-2023-update">Project Clj-kondo: Michiel Borkent (Feb. 2023 Update)</h2>
<p>In this post, I&rsquo;ll give updates about open source I worked on during February 2023.</p>
<h3 id="babashkahttpsgithubcombabashkababashka-1"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast-starting Clojure interpreter for scripting. New release: 1.2.174. Highlights:</p>
<ul>
<li>Use GraalVM 22.3.1 on JDK 19.0.2. This adds virtual thread support. See <a href="https://twitter.com/borkdude/status/1572222344684531717">demo</a>.</li>
<li>Add more java.time and related classes with the goal of supporting <a href="https://github.com/juxt/tick">juxt.tick</a> (<a href="https://github.com/juxt/tick/issues/86">issue</a>)</li>
<li>See the complete <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">CHANGELOG</a>.</li>
</ul>
<p>Babashka compatibility in external libs
I worked together with the maintainers of the following libraries to make them compatible with babashka:</p>
<ul>
<li><a href="https://github.com/lambdaisland/kaocha">kaocha</a>: test runner</li>
<li><a href="https://github.com/greglook/clj-multiformats">multiformats</a>: Clojure(Script) implementations of the self-describing multiformat specs</li>
</ul>
<h3 id="http-clienthttpsgithubcombabashkahttp-client-babashkas-http-client"><a href="https://github.com/babashka/http-client">Http-client</a>: Babashka&rsquo;s http-client</h3>
<ul>
<li>The babashka.http-client namespace mostly replaces <a href="https://github.com/babashka/babashka.curl">babashka.curl</a>.</li>
<li>This month support for :multipart uploads was added, mostly based on and inspired by <a href="https://github.com/gnarroway/hato">hato</a>&rsquo;s implementation.</li>
</ul>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo-1"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>Static analyzer and linter for Clojure code that sparks joy. New release: 2023.02.17. Some highlights:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1976">#1976</a>: warn about using multiple bindings after varargs (&amp;) symbol in fn syntax</li>
<li>Add arity checks for core def</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1954">#1954</a>: new :uninitialized-var linter. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#uninitialized-var">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1996">#1996</a>: expose hooks-api/resolve. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/hooks.md#api">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelog</a> for details.</li>
</ul>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p>Configurable Clojure/Script interpreter suitable for scripting and Clojure DSLs. This month:</p>
<ul>
<li>Adding JS libraries to a SCI context. See <a href="https://github.com/babashka/sci#javascript-libraries">docs</a></li>
<li>Keyword arguments as map support for CLJS</li>
<li>Making loading of libraries thread-safe in JVM</li>
<li>Several fixes with respect to deftype and toString + equals</li>
</ul>
<h3 id="fshttpsgithubcombabashkafs-1"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure. Highlights:</p>
<ul>
<li>several xdg-*-home helper functions, contributed by <a href="https://github.com/eval">@eval</a></li>
<li>babashka.fs/zip now takes a :root option to elide a parent folder or folders.E.g. (fs/zip &ldquo;src&rdquo; {:root &ldquo;src&rdquo;}) will zip src/foo.clj into the zip file under foo.clj.</li>
<li>See <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md#changelog">changelog</a> for more details.</li>
</ul>
<h3 id="processhttpsgithubcombabashkaprocess"><a href="https://github.com/babashka/process">Process</a></h3>
<p>Clojure library for shelling out / spawning sub-processes
This month I looked into wrapping output of processes with a prefix so when ran in parallel, you can easily distuingish them. A preliminary solution is in <a href="https://github.com/babashka/process/discussions/102#discussioncomment-4903758">this thread</a>.</p>
<h3 id="pod-babashka-lanternahttpsgithubcombabashkapod-babashka-lanterna"><a href="https://github.com/babashka/pod-babashka-lanterna">Pod-babashka-lanterna</a></h3>
<p>Interact with clojure-lanterna from babashka. A very experimental 0.0.1 release was published. You can try it out by playing tetris in the console with babashka:</p>
<p>bb -Sdeps &lsquo;{:deps {io.github.borkdude/console-tetris {:git/sha &ldquo;2d3bee34ea93c84608c7cc5994ae70480b2df54c&rdquo;}}}&rsquo; -m tetris.core</p>
<h3 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h3>
<p>Scripting in Clojure on Node.js using SCI
Finally nbb has gotten support for passing maps to keyword argument functions:</p>
<ul>
<li>(defn foo [&amp; {:keys [a b c]}])</li>
<li>(foo :a 1 :b 2 :c 3)</li>
<li>(foo {:a 1 :b 2 :c 3})</li>
</ul>
<p>Several other improvements have been made in the area of macros and resolving JS library references and resolving dependencies in an nbb.edn file, relative to an invoked script which is not in the current directory.
See changelogs <a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">here</a>.</p>
<h3 id="joyridehttpsgithubcombetterthantomorrowjoyride"><a href="https://github.com/BetterThanTomorrow/joyride">Joyride</a></h3>
<p>VSCode CLJS scripting and REPL (via <a href="https://github.com/babashka/sci">SCI</a>)
This month I contributed a built-in version of <a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a> to joyride, so joyriders can rewrite their code from within VSCode.</p>
<h3 id="cljs-showcasehttpsgithubcomborkdudecljs-showcase"><a href="https://github.com/borkdude/cljs-showcase">Cljs-showcase</a></h3>
<p>Showcase CLJS libs using SCI
A little project to show how you can use SCI to showcare your CLJS library in an interactive way.</p>
<h3 id="brief-mentions-1">Brief mentions</h3>
<p>The following projects also got updates, mostly in the form of maintenance and performance improvements. This post would get too long if I had to go into detail about them, so I&rsquo;ll briefly mention them in random order:</p>
<ul>
<li><a href="https://github.com/babashka/cli">CLI</a>: Turn Clojure functions into CLIs!</li>
<li><a href="https://github.com/borkdude/quickdoc">quickdoc</a>: Quick and minimal API doc generation for Clojure</li>
<li><a href="https://github.com/babashka/process">process</a>: Clojure library for shelling out / spawning sub-processes</li>
<li><a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>: Rewrite Clojure code and edn</li>
<li><a href="https://github.com/babashka/babashka-sql-pods">sql pods</a>: babashka pods for SQL databases</li>
<li><a href="https://github.com/squint-cljs/squint">squint</a>: CLJS syntax to JS compiler</li>
</ul>
<h3 id="other-projects">Other Projects</h3>
<p>These are some of the other projects I&rsquo;m involved with but little to no activity happened in the past month.</p>
<ul>
<li><a href="https://github.com/borkdude/carve">carve</a> - Remove unused Clojure vars</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a>: A faithful port of the clojure CLI bash script to Clojure</li>
<li><a href="https://github.com/borkdude/edamame">edamame</a>: Configurable EDN/Clojure parser with location metadata</li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a>: Experimental ClojureScript to ES6 module compiler</li>
<li><a href="https://github.com/borkdude/grasp">grasp</a>: Grep Clojure code using clojure.spec regexes</li>
<li><a href="https://github.com/borkdude/jet">jet</a>: CLI to transform between JSON, EDN, YAML and Transit using Clojure</li>
<li><a href="https://github.com/babashka/scittle">scittle</a>: Execute Clojure(Script) directly from browser script tags via SCI</li>
<li><a href="https://github.com/babashka/neil">neil</a>: A CLI to add common aliases and features to deps.edn-based projects</li>
<li><a href="https://github.com/borkdude/quickblog">quickblog</a>: Light-weight static blog engine for Clojure and babashka</li>
<li><a href="https://github.com/babashka/sci.configs">sci.configs</a>: A collection of ready to be used SCI configs</li>
<li><a href="https://github.com/borkdude/lein2deps">lein2deps</a>: leiningen to deps.edn converter</li>
<li><a href="https://github.com/oxalorg/4ever-clojure">4ever-clojure</a> - Pure CLJS version of 4clojure, meant to run forever!</li>
<li><a href="https://github.com/babashka/instaparse-bb">instaparse-bb</a></li>
<li><a href="https://github.com/babashka/pod-babashka-buddy">pod-babashka-buddy</a>: A pod around buddy core (Cryptographic Api for Clojure).</li>
</ul>
<p>Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.
Published: 2023-03-01
Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></p>
 </br>
<h2 id="project-clojuredart-christophe-grand">Project ClojureDart: Christophe Grand</h2>
<p>This final update covers January 2023. This month we merged our changes for a better hot reload (see Update #2) and then went on bug fixing and doing small improvements for a while.</p>
<p>A problem kept bothering us: in our <code>cljd.flutter</code> (well in January it was still<code>cljd.flutter.alpha2</code>) we have <code>:watch</code> to react to updates to all kind of stateful objects and <code>sub</code> to narrow the scope of changes we are interested in for a given &ldquo;watchable&rdquo;. This is very useful as it allows to change the frequency at which a piece of UI is updated: one can have a big atom holding a lot of state (and this changing frequently) and watch a slower changing subset of it.</p>
<p>However <code>sub</code> only allowed to narrow <em>one</em> watchable. This led to awkward code were every other watchables (IO or framework related) updates had to be shoe-horned in a single canonical atom with the help of listeners (whose lifecycles have to be tied to specific parts of the widget tree) and hair-pulling naming decisions on paths inside this atom.</p>
<p>We first extended <code>sub</code> to allow to apply a function across several watchables latest values, somehow behaving like a join. It worked but felt quite stiff and not very pleasing to use. <code>sub</code> relied on the <code>f &amp; args</code> update convention (as used in <code>swap!</code>, <code>update-in</code> etc.) but there&rsquo;s no agreed upon convention for when one has several input and thus it doesn&rsquo;t mesh as well as the single-input version with the core lib.</p>
<p>This dissatisfaction led us to develop &ldquo;cells&rdquo;. Cells as in spreadsheets. So cells are expressions which recompute their value when their dependencies values change. Obviously we made cells watchable. A cell is defined by using the <code>$</code> macro (because it caches its latest value) and inside (dynamically, not lexically) a cell one can take (<code>&lt;!</code>) from other cell <em>or any other watchable</em>.</p>
<p>Example: assuming <code>now</code> is an atom (a plain old one) updated at 60fps, then <code>($ (.-day (&lt;! now)))</code> is a cell recomputed at 60fps but yielding a new value once a day. So any widget (or other cell) depending on this cell will only be updated once a day.</p>
<p>This generalizes nicely to multiple dependencies and even to dynamic dependency graphs. Another interesting fact to know about cells is that a cell is recomputed only when it&rsquo;s watched (and this cascades transitively: an unwatched cell doesn&rsquo;t watch its dependencies&hellip;). Another consequence of cells is that the push for a single big canonical atom goes away.</p>
<p>This changed positively the way we write apps. So much that in our February workshop we talked only about cells, not subs.</p>
</br>
<h2 id="project-kaocha-arne-brasseur-dec-2022-update">Project Kaocha: Arne Brasseur (Dec. 2022 Update)</h2>
<p>Dec. 2022 Update:</p>
<h3 id="facaihttpsgithubcomlambdaislandfacai-0868-alpha-2022-12-16--1f31590"><a href="https://github.com/lambdaisland/facai">Facai</a> 0.8.68-alpha (2022-12-16 / 1f31590)</h3>
<ul>
<li>Fix two-arity version of build-all</li>
<li>When unifying, don&rsquo;t recurse down the stored lvar value when reusing it</li>
<li>Remove three-arity version of build-all</li>
</ul>
<h3 id="glogihttpsgithubcomlambdaislandglogi-12164-2022-11-25--9a89583"><a href="https://github.com/lambdaisland/glogi">Glogi</a> 1.2.164 (2022-11-25 / 9a89583)</h3>
<ul>
<li>Add support for logging multiple forms with <code>spy</code>.</li>
<li>Release under <code>com.lambdaisland</code> as well as <code>lambdaisland</code>, see <a href="https://github.com/lambdaisland/open-source/issues/9">https://github.com/lambdaisland/open-source/issues/9</a></li>
<li>Version bumps</li>
</ul>
<h3 id="deep-diff2httpsgithubcomlambdaislanddeep-diff2-26166-2022-11-25--06fec7e"><a href="https://github.com/lambdaisland/deep-diff2">Deep-diff2</a> 2.6.166 (2022-11-25 / 06fec7e)</h3>
<ul>
<li>Babashka compatibility</li>
<li>Fix printing of mismatch/deletion/insertion on Babashka</li>
<li>[breaking] Fall back to the system printer when no deep-diff2 specific print handler is available for a given type. See the README for details.</li>
</ul>
<h3 id="clj-diffhttpsgithubcomlambdaislandclj-diff-1478-2022-11-25--2c3cae0"><a href="https://github.com/lambdaisland/clj-diff">Clj-diff</a> 1.4.78 (2022-11-25 / 2c3cae0)</h3>
<ul>
<li>Test runner</li>
<li>CI configuration</li>
<li>Babashka compatibility</li>
</ul>
<h3 id="kaocha-cljs2httpsgithubcomlambdaislandkaocha-cljs2-0158-2022-11-11--98fdc42"><a href="https://github.com/lambdaisland/kaocha-cljs2">Kaocha-cljs2</a> 0.1.58 (2022-11-11 / 98fdc42)</h3>
<ul>
<li>Upgrade Chui, fixes a glogi dependency incompatibility with current version of Clojurescript</li>
<li>Upgrade Kaocha to 1.70.1086</li>
</ul>
<h3 id="kaocha-junit-xmlhttpsgithubcomlambdaislandkaocha-junit-xml-117101-2022-11-09--95067b2"><a href="https://github.com/lambdaisland/kaocha-junit-xml">Kaocha-junit-xml</a> 1.17.101 (2022-11-09 / 95067b2)</h3>
<ul>
<li>Fix Cljdoc build.</li>
</ul>
<h3 id="kaocha-cloveragehttpsgithubcomlambdaislandkaocha-cloverage-1189-2022-11-09--c2b2dbf"><a href="https://github.com/lambdaisland/kaocha-cloverage">Kaocha-cloverage</a> 1.1.89 (2022-11-09 / c2b2dbf)</h3>
<ul>
<li>Bumped Cloverage dependency to <code>1.2.4</code>.</li>
</ul>
<h3 id="kaochahttpsgithubcomlambdaislandkaocha-1711119-2022-10-24--4317878"><a href="https://github.com/lambdaisland/kaocha">Kaocha</a> 1.71.1119 (2022-10-24 / 4317878)</h3>
<ul>
<li>Configure a timeout for notifications with <code>--notification-timeout</code> or<code>:kaocha.plugin.notifier/timeout</code>. Note that this feature doesn&rsquo;t work for terminal-notifier on macOS, with Java&rsquo;s built-in TrayIcon, or with notify-send on certain Linux desktop environments and distributions.</li>
<li>Fix configuration parsing when using <code>--watch</code>. Previously, profiles would be respected on the initial load, but not after watch reloaded the configuration.</li>
<li>Notifier now reports errors in your notification command instead of silently failing.</li>
<li>Fixed <code>java.lang.IllegalArgumentException: No matching clause: []</code> exception when <code>:kaocha.spec.test.check/syms</code> is a collection.</li>
</ul>
</br>  
<h2 id="project-kaocha-arne-brasseur-jan-and-feb-2023-update">Project Kaocha: Arne Brasseur (Jan. and Feb. 2023 Update)</h2>
<p>Jan. and Feb. 2023 Update: After a refreshing break, we&rsquo;ve hit the ground running in 2023, merging approximately 20 PRs from both Gaiwan and community contributors, fixing many bugs and some CI/cljdocs issues. Several new libraries support Babashka, including Kaocha. We hope this and <a href="https://blog.michielborkent.nl/babashka-test-runner.html">other efforts</a> will expand the pool of Clojure libraries and tools available for use in Babashka.
Most of the focus has been on Kaocha, which saw eight separate releases over the past two months. We&rsquo;ve also released minor updates for Launchpad, embedkit, and Deja-fu.</p>
<h3 id="kaochahttpsgithubcomlambdaislandkaocha-1791270-2023-02-28--47a7b61"><a href="https://github.com/lambdaisland/kaocha">Kaocha</a> 1.79.1270 (2023-02-28 / 47a7b61)</h3>
<ul>
<li>Kaocha is now compatible with Babashka. Running under Babashka is most useful for validating your Clojure code runs correctly on Babashka, but it may also be faster for some test suites because of reduced start-up time.</li>
<li>Fix issue with <code>--watch</code> and Neovim by bumping Beholder to <code>1.0.2</code></li>
<li>Fix bug causing namepaces to not be loaded if an alias was already created for them using <code>:as-alias</code></li>
<li><code>kaocha.repl/config</code> accepts a <code>:profile</code> key when specifying extra options.</li>
<li>Configuration errors and circular dependencies are reported as warnings, rather than causing the entire watcher to crash. (thanks<a href="https://github.com/frenchy64">@frenchy64</a>)</li>
<li>Fix bug added in <a href="https://github.com/lambdaisland/kaocha/issues/384">#384</a>: assertions in the tail position of an each fixture would return the result of the assertion instead of the testable object with the merged report data (thanks <a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li>Dependency version bumps</li>
<li><code>kaocha.plugin.capture-output/bypass</code> macro, for temporarily bypassing output capturing.</li>
<li>Circular dependencies in watch mode no longer kills the process. (thanks  <a href="https://github.com/frenchy64">@frenchy64</a>)</li>
<li>Ensure reloading errors are printed in watch mode when the first test suite is disabled.</li>
<li>Using a try-catch (without rethrowing) in an <code>:each</code> fixture could swallow thrown exceptions, resulting in a test being treated as passing when it should have been reported as an error. Fixed by changing how <code>:each</code> fixtures wrap the test function in execution. (thanks <a href="https://github.com/NoahTheDuke">@NoahTheDuke</a>)</li>
<li>Fix crash on Windows when using <code>--watch</code> with the default Beholder watcher.</li>
<li>Documentation fixes and improvements</li>
</ul>
<h3 id="launchpadhttpsgithubcomlambdaislandlaunchpad-01579-alpha-2023-01-20--2b06d8e"><a href="https://github.com/lambdaisland/launchpad">Launchpad</a> 0.15.79-alpha (2023-01-20 / 2b06d8e)</h3>
<ul>
<li>Allow setting nrepl port/bind from CLI</li>
<li>Provide a warning when connecting to emacs fails, rather than exiting</li>
<li>Dependency version bumps</li>
</ul>
<h3 id="embedkithttpsgithubcomlambdaislandembedkit-0050-2023-01-19--8e058ff"><a href="https://github.com/lambdaisland/embedkit">Embedkit</a> 0.0.50 (2023-01-19 / 8e058ff)</h3>
<ul>
<li>Let (setup/init-metabase! config) support first-name, last-name, site-name.</li>
</ul>
<h3 id="deja-fuhttpsgithubcomlambdaislanddeja-fu-1458-2023-01-16--1446eef"><a href="https://github.com/lambdaisland/deja-fu">Deja-fu</a> 1.4.58 (2023-01-16 / 1446eef)</h3>
<ul>
<li><code>distance-in-words</code> now renders approximate weeks; month ranges were adjusted</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>January 2023 Project Updates</title>
      <link>https://www.clojuriststogether.org/news/january-2023-project-updates/</link>
      <pubDate>Mon, 13 Feb 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/january-2023-project-updates/</guid>
      <description>January 2023 Project Updates</description>
      <content:encoded><![CDATA[<p>Our first project update for 2023 includes reports for Clj-Kondo, Clojure Data Cookbook, ClojureDart, Mathbox, and Tablecloth. Thanks to all. We&rsquo;re off to a great start!</p>
<h2 id="project-clj-kondo-michiel-borkent">Project Clj-Kondo: Michiel Borkent</h2>
<p>In this post, I&rsquo;ll give updates about my open source during November and December 2022. But first off, I&rsquo;d like to thank all the sponsors and contributors that make this work possible! Top sponsors:<br>
<a href="https://clojuriststogether.org/">Clojurists Together</a><br>
<a href="https://roamresearch.com/">Roam Research</a><br>
<a href="https://nextjournal.com/">Nextjournal</a><br>
<a href="https://toyokumo.co.jp/">Toyokumo</a><br>
<a href="https://www.cognitect.com/">Cognitect</a><br>
<a href="https://kepler16.com/">Kepler16</a><br>
<a href="https://www.adgoji.com/">Adgoji</a></p>
<p>If you want to ensure that the projects I work on are sustainably maintained, you can sponsor this work via the following organizations. Thank you!<br>
<a href="https://www.clojuriststogether.org/">Clojurists Together</a><br>
<a href="https://github.com/sponsors/borkdude">Github Sponsors</a><br>
<a href="https://opencollective.com/babashka">OpenCollective</a><br>
(also see the <a href="https://opencollective.com/clj-kondo">clj-kondo</a> one)</p>
<p>Here are my updates for the Clj-Kondo projects:</p>
<h3 id="http-clienthttpsgithubcombabashkahttp-client"><a href="https://github.com/babashka/http-client">http-client</a></h3>
<p>The new babashka http-client aims to become default HTTP client solution in babashka. Babashka has several built-in options for making HTTP requests, including:
<a href="https://github.com/babashka/babashka.curl">babashka.curl</a>;
<a href="https://github.com/http-kit/http-kit">http-kit</a>;
<a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.net.http/java/net/http/package-summary.html">java.net.http</a></p>
<p>In addition, it allows to use several libraries to be used as a dependency:
<a href="https://github.com/schmee/java-http-clj">java-http-clj</a>;
<a href="https://github.com/gnarroway/hato">hato</a>;
<a href="https://github.com/clj-commons/clj-http-lite">clj-http-lite</a>;</p>
<p>The built-in clients come with their own trade-offs. E.g. babashka.curl shells out to curl which on Windows requires your local curl to be updated. Http-kit buffers the entire response in memory. Using java.net.http directly can be a bit verbose. Babashka&rsquo;s http-client aims to be a good default for most scripting use cases and is built on top of java.net.http and can be used as a dependency-free JVM library as well. The API is mostly compatible with babashka.curl so it can be used as a drop-in replacement. The other built-in solutions will not be removed any time soon.</p>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<p>I had the honor to write a guest blog post for the GraalVM blog about babashka. You can read it <a href="https://medium.com/graalvm/babashka-how-graalvm-helped-create-a-fast-starting-scripting-environment-for-clojure-b0fcc38b0746">here</a>. Daniel Higginbotham from Brave Clojure wrote <a href="https://www.braveclojure.com/quests/babooka/">Babashka Babooka</a> which I helped reviewing. I also wrote a blog on how to <a href="https://blog.michielborkent.nl/babashka-test-runner.html">test babashka scripts</a>. Versions 1.0.165 - 1.0.169 were released. Visit the <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">changelog</a> for details. Highlights:</p>
<ul>
<li>Compatibility with Cognitest <a href="https://github.com/cognitect-labs/test-runner">test-runner</a> and <a href="https://github.com/clojure/tools.namespace">tools.namespace</a></li>
<li><a href="https://github.com/babashka/babashka/issues/1433">#1433</a>: spec source as built-in fallback. When not including the <a href="https://github.com/babashka/spec.alpha">clojure.spec.alpha</a> fork as a library, babashka loads a bundled version, when clojure.spec.alpha is required.</li>
<li>Many performance improvements (via SCI)</li>
<li>Several non-special forms are now regular macros rather than treated special (via SCI)</li>
<li>Update to babashka process to v0.4.13: support (process opts? &amp; args) syntax everywhere</li>
</ul>
<h3 id="squinthttpsgithubcomsquint-cljssquint-and-cherryhttpsgithubcomsquint-cljscherry"><a href="https://github.com/squint-cljs/squint">Squint</a> and <a href="https://github.com/squint-cljs/cherry">Cherry</a></h3>
<p>Squint and cherry are two flavors of the same CLJS compiler.  Squint is a CLJS <em>syntax</em> to JS compiler for use case where you want to write JS, but do it using CLJS syntax and tooling instead. Cherry comes with the CLJS standard library and is as such much closer to the normal ClojureScript, but the minimal amount of JS is a little bigger.</p>
<p>In the past two months, I&rsquo;ve been restructuring code between squint and cherry: a bit boring but necessary to keep going forward. Along with some minor bugfixes and features, one new JSX feature landed: you can pass a props map using a new notation inspired by <a href="https://github.com/lilactown/helix">helix</a>.  You can read details in the <a href="https://github.com/squint-cljs/squint/blob/main/CHANGELOG.md">changelog</a>.</p>
<p>The <a href="https://www.youtube.com/watch?v=oCd74TQ-gf4">video</a> of the talk I did on ClojureDays 2022 came online!</p>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p>Configurable Clojure interpreter suitable for scripting and Clojure DSLs.
This is the workhorse that powers babashka, nbb, Joyride, and many other projects. Many improvements have happened over the last two months, both in Clojure compatibility and performance. JS and JVM interop has become up to 5x faster. All of these changes benefit babashka, nbb, joyride, etc. See <a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md">changelog</a> for more details.</p>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>Static analyzer and linter for Clojure code that sparks joy&hellip; Two new releases with many fixes and improvements. <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelog</a> for details. Some highlights:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/609">#609</a>: typecheck var usage, e.g. (def x :foo) (inc x) will now give a warning</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1846">#1846</a>: new linters: :earmuffed-var-not-dymamic and :dynamic-var-not-earmuffed. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#dynamic-vars">docs</a>.</li>
<li><a href="https://github.com/clj-kondo/clj-kondo/issues/1875">#1875</a>: add :duplicate-field-name linter for deftype and defrecord definitions.</li>
</ul>
<h3 id="scittlehttpsgithubcombabashkascittle"><a href="https://github.com/babashka/scittle">Scittle</a></h3>
<p>Execute Clojure(Script) directly from browser script tags via SCI. See it in <a href="https://babashka.org/scittle/">action</a>. Version 0.4.11 introduced the <a href="https://github.com/day8/re-frame">re-frame</a> plugin. You can play around with it in the playground <a href="https://babashka.org/scittle/codemirror.html">here</a>. Several other releases were made. Details in the <a href="https://github.com/babashka/scittle/blob/main/CHANGELOG.md">changelog</a>.</p>
<h3 id="processhttpsgithubcombabashkaprocess"><a href="https://github.com/babashka/process">Process</a></h3>
<p>Clojure library for shelling out / spawning subprocesses. This library traditionally had the syntax: (process [ &amp; cmd-args ] ?opts) but in practice, it turned out that having the syntax (process ?opts &amp; cmd-args) is more convenient, since you can use it with apply and <em>command-line-args</em>. All functions in babashka.process have been rewritten to support this syntax. See <a href="https://github.com/babashka/process/blob/master/CHANGELOG.md">changelog</a> for details.</p>
<h3 id="quickdochttpsgithubcomborkdudequickdoc"><a href="https://github.com/borkdude/quickdoc">Quickdoc</a></h3>
<p>Quickdoc is a tool to generate documentation from namespace/var analysis done by clj-kondo. It&rsquo;s fast and spits out an API.md file in the root of your project, so you can immediately view it on Github. Minor fixes and improvements were made.</p>
<h3 id="fshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure. Fs has gotten one new function: update-file, that alters the contents of a (text) file using a function. The function is reminiscent of swap!. See <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md#changelog">changelog</a> for more details.</p>
<h3 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h3>
<p>A CLI to add common aliases and features to deps.edn-based projects. A NEIL_GITHUB_TOKEN can now be configured to avoid hitting the rate limit of the Github API, thanks to Russ Matney.</p>
<h3 id="quickbloghttpsgithubcomborkdudequickblog"><a href="https://github.com/borkdude/quickblog">Quickblog</a></h3>
<p>Light-weight static blog engine for Clojure and babashka. The blog you&rsquo;re currently reading is made with quickblog. Version <a href="https://github.com/borkdude/quickblog/blob/main/CHANGELOG.md#010-2022-12-11">0.1.0</a> was finally released with much thanks to Josh Glover. See <a href="https://github.com/borkdude/quickblog/blob/main/CHANGELOG.md#changelog">changelog</a> for more details.</p>
<h3 id="rewrite-ednhttpsgithubcomborkduderewrite-edn"><a href="https://github.com/borkdude/rewrite-edn">Rewrite-edn</a></h3>
<p>Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments. Minor fixes and enhancements. Several functions have been added like fnil and conj. See <a href="https://github.com/borkdude/rewrite-edn/blob/master/CHANGELOG.md">changelog</a>.</p>
<h3 id="sciconfigshttpsgithubcombabashkasciconfigs"><a href="https://github.com/babashka/sci.configs">Sci.configs</a></h3>
<p>A collection of ready to be used SCI configs for e.g. Reagent, Promesa, Re-frame and other projects that are used in nbb, joyride, scittle, etc. See recent <a href="https://github.com/babashka/sci.configs/commits/main">commits</a> for what&rsquo;s been improved.</p>
<h3 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h3>
<p>Scripting in Clojure on Node.js using SCI. Because it&rsquo;s so easy to deploy to npm, I usually publish a new version for each issue that is resolved. No big changes, but many small bugfixes and improvements in the last two months. See <a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">changelog</a>.</p>
<h3 id="edamamehttpsgithubcomborkdudeedamame"><a href="https://github.com/borkdude/edamame">Edamame</a></h3>
<p>Configurable EDN/Clojure parser with location metadata. It has been stable for a while and reached version 1.0.0. The API is exposed now in <a href="https://github.com/babashka/babashka">babashka</a> and <a href="https://github.com/babashka/nbb">nbb</a> as well. See <a href="https://github.com/borkdude/edamame/blob/master/CHANGELOG.md">Changelog</a></p>
<h3 id="lein2depshttpsgithubcomborkdudelein2deps"><a href="https://github.com/borkdude/lein2deps">lein2deps</a></h3>
<p>Lein to deps.edn converter. This tool can convert a project.edn file to a deps.edn file. It even supports Java compilation and evaluation of code within project.clj. Several minor enhancements were made. See <a href="https://github.com/borkdude/lein2deps/blob/main/CHANGELOG.md">changelog</a>.</p>
<h3 id="joyridehttpsgithubcombetterthantomorrowjoyride"><a href="https://github.com/BetterThanTomorrow/joyride">Joyride</a></h3>
<p>Modify VSCode by executing ClojureScript (SCI) code in your REPL and/or run scripts via keyboard shortcuts. I&rsquo;m working on this project together with Peter Strömberg (known for his work on Calva) and I&rsquo;m mostly reviewing Peter&rsquo;s PR instead of writing code. Read the changelog <a href="https://github.com/BetterThanTomorrow/joyride/blob/master/CHANGELOG.md">here</a>.</p>
<h3 id="depscljhttpsgithubcomborkdudedepsclj"><a href="https://github.com/borkdude/deps.clj">Deps.clj</a></h3>
<p>Regular maintainance, keeping up with the official Clojure CLI and tools jar!</p>
<h3 id="clj-kondo-configshttpsgithubcomclj-kondoconfigs"><a href="https://github.com/clj-kondo/configs">Clj-kondo configs</a></h3>
<p>Library configurations as dependencies for clj-kondo. The claypoole configuration was improved.</p>
<h3 id="babashka-clihttpsgithubcombabashkacli"><a href="https://github.com/babashka/cli">Babashka CLI</a></h3>
<p>Turn Clojure functions into CLIs! Minor fixes. See <a href="https://github.com/babashka/cli/blob/main/CHANGELOG.md">changelog</a>.</p>
<h3 id="babashka-pods">Babashka pods</h3>
<p>The <a href="https://github.com/babashka/pods">pods</a> library contains the code that supports using pods in babashka and the JVM. A critical error was fixed that would hang babashka and a new JVM release was pushed to Clojars (v0.1.0).</p>
<h3 id="babashka-compatibility-in-external-libs">Babashka compatibility in external libs</h3>
<p>I contributed to <a href="https://github.com/hyperfiddle/rcf">RCF</a>, <a href="https://github.com/lambdaisland/deep-diff2">deep-diff2</a> and <a href="https://github.com/lambdaisland/clj-diff">clj-diff</a> to make these libraries babashka compatible. Discuss this post <a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.</p>
<p><em>Published: 2023-01-06. Tagged: <a href="https://blog.michielborkent.nl/tags/clojure.html">clojure</a> <a href="https://blog.michielborkent.nl/tags/oss-updates.html">oss updates</a></em></p>
<h2 id="project-clojure-data-cookbook-kira-mcclean">Project Clojure Data Cookbook: Kira McCLean</h2>
<p>Last updated December 30, 2022</p>
<p>The work that&rsquo;s been done in this period for the Clojure Data Cookbook includes:</p>
<ul>
<li>Set up programming environment for the project. I experimented with a few different options and in the end decided to use a Clerk notebook. I set up the repo to include instructions on how to run the notebook locally for now, but the long term plan is to publish a static HTML artifact somewhere online that can be viewed in a browser.</li>
<li>Completed code examples for sub-chapters 2.1 and 2.2, as well as some prose for the introductory chapter. Commits including this output are here: <a href="https://github.com/scicloj/clojure-data-cookbook/commits/main">https://github.com/scicloj/clojure-data-cookbook/commits/main</a></li>
<li>Discovered and resolved issues in the underlying libraries, e.g. problems loading excel files with tablecloth, problems loading headers for different data input types, as a result of writing the examples.</li>
<li>Researched the Clojure data science landscape and explored available solutions to different problems. Decisions about which libraries to use are mostly not finalized yet, but the survey of the ecosystem has given me a much better understanding of the existing tools that are available. This work was summed up in the talk I gave at this year’s re:Clojure conference: <a href="https://www.youtube.com/watch?v=BxVtQM6FPHU">https://www.youtube.com/watch?v=BxVtQM6FPHU</a></li>
</ul>
<p>The next phase will be spent filling out the code examples for the rest of chapters 2 &amp; 3, as well as finalizing the introductory text for the first chapter.</p>
<h2 id="project-clojuredart-christophe-grand">Project ClojureDart: Christophe Grand</h2>
<p>(Disclaimer: because of various holidays, our months have been longer than calendar months&hellip;)</p>
<p><strong>First reporting period:</strong> The biggest effort the during first period was the rework of our ill-named analyzer.</p>
<p>Dart doesn&rsquo;t provide the level of introspection the JVM provides — there are &ldquo;mirrors&rdquo; but they provide incomplete information and are only available to the Dart VM (not to natively compiled code or code compiled to javascript).  Being VM-only isn&rsquo;t a too big requirement since dev workflow is centered on the VM but not having precise enough information is a deal-breaker.  All the information we need is available through generated dart docs or through LSP. Both leverages <a href="https://pub.dev/packages/analyzer">a lib of the Dart SDK which is called the analyzer</a>.</p>
<p>Based on the same lib we had our own &ldquo;analyzer&rdquo; which was dumping in a single EDN file every piece of information about classes, fields and functions found in all libs of all deps (pubspec.yaml). Effective but slow as the dump may take minutes with large dependencies.</p>
<p>So this period we reworked our analyzer to be a subprocess of the compiler and not a batch. This leads to faster startups without adverse consequence on compilation time (the compiler caches analyzer answers). Overall making the developer experience more pleasing.</p>
<p><strong>Second reporting Period:</strong> During the second period we focused on making hot-reload less brittle.  This is significant for two reasons:</p>
<ul>
<li>It makes the dev experience more pleasing (the application needs to be restarted less often)</li>
<li>It will serve as the foundation for the REPL (as hot-reload is the only way to get new code loaded).</li>
</ul>
<p>The Dart VM can hot reload code. In practical terms it means functions and methods bodies can be updated while preserving existing state (at some point you&rsquo;ll end up with a mismatch with the new code and the old state and you&rsquo;ll have to &ldquo;hot restart&rdquo; which is a plain restart of the application &ndash; but not of the VM). The goal of this game is to minimize how often the application has to be restarted.</p>
<p>One crucial point are Dart top-levels (to which Clojure vars are mapped) which are initialized on demand. Once initialized you can&rsquo;t update the initialization code — or rather you can but it won&rsquo;t be run again. Which proves to be a problem for all vars which don&rsquo;t compile to a simple Dart function.  That&rsquo;s why it was frequently required to hot restart (and thus lose state) to see the effect of redefs.</p>
<p>With the changes we made, when a var is redefined it&rsquo;s compiled to a new top-level whose name contains a reload count. And all dependents are updated to point to the new name. Thus we get a fresh init and everything points to the new version (closing over a stale instance is still possible though but just like in Clojure). This hasn&rsquo;t been merged yet into <code>main</code>.</p>
<p>While we are on unmerged branches: we have also sorted collections in the works, maps are done, sets are almost done, some helper functions are missing.  Sorted collections are not a hot topic and are rarely used, however we put a lot of work in them: they use a novel implementation influenced by B+trees, treaps and zip-trees.  An important feature of all ClojureDart maps (sorted or not) is that they are history-independent: their layout is determined by their content only, not by the insertion order nor the removal of some keys etc.</p>
<p>This is going to allow us to offer accelerated operations on maps: merge, merge-with, join, diff, merge3. Hopefully this will enable some interesting in-memory databases.</p>
<h2 id="project-mathbox-cljs-sam-ritchie">Project Mathbox-cljs: Sam Ritchie</h2>
<p>Final Update (January 25, 2023)</p>
<h3 id="overview">Overview</h3>
<p>First of all, apologies that this last phase stretched out over an extra month. I&rsquo;m really happy with the amount of code I was able to ship; I&rsquo;m especially pleased that I was able to keep my standards for writing and documentation high, though I did have to relax a touch to get these last two very complex libraries out the door.</p>
<h3 id="libraries-shipped">Libraries Shipped</h3>
<p>I&rsquo;ve shipped final versions of the following libraries, along with interactive docs notebooks for each:</p>
<ul>
<li><a href="https://github.com/mentat-collective/mafs.cljs">https://github.com/mentat-collective/mafs.cljs</a> (<a href="https://mafs.mentat.org">https://mafs.mentat.org</a>)</li>
<li><a href="https://github.com/mentat-collective/mathbox.cljs">https://github.com/mentat-collective/mathbox.cljs</a> (<a href="https://mathbox.mentat.org">https://mathbox.mentat.org</a>)</li>
<li><a href="https://github.com/mentat-collective/leva.cljs">https://github.com/mentat-collective/leva.cljs</a> (<a href="https://leva.mentat.org">https://leva.mentat.org</a>)</li>
</ul>
<p>and was able to get started with a set of Clerk templates that will make it easy for folks to use all of these libraries:
<a href="https://github.com/nextjournal/clerk-cljs-demo/pull/2">https://github.com/nextjournal/clerk-cljs-demo/pull/2</a>
Notice that MathBox.cljs, the original goal of all of this work, is out!</p>
<h3 id="mafs">Mafs</h3>
<p>I noticed <a href="https://mafs.dev/">https://mafs.dev/</a> while trawling around for good 2d interactive visualization systems. JSXGraph is more complete, but Mafs is simple and beautiful; when I found it it wasn&rsquo;t in active development, but the maintainer has since done a ton of work and the project is moving quickly. I&rsquo;ve been working on the API with Steven Petryk in his Discord, and submitted a <a href="https://github.com/stevenpetryk/mafs/pull/92">PR to speed up all linear algebra</a> in the library. The API, specifically the &ldquo;movable points&rdquo;, relied on React hooks; the biggest change required by this wrapper involved making these points work well with Reagent&rsquo;s atoms with the ease that ClojureScript developers should expect.</p>
<h3 id="mathbox">MathBox</h3>
<p>I updated the MathBox README with instructions on how to use all of our new work from JS land: <a href="https://github.com/unconed/mathbox">https://github.com/unconed/mathbox</a></p>
<p>The interactive docs page contains a full port of the &ldquo;getting started&rdquo; intro from MathBox: <a href="https://mathbox.mentat.org/">https://mathbox.mentat.org/</a></p>
<p>There are a bunch of things that this wrapper can do much better than the original library, thanks to React. I&rsquo;ve continued to work with Chris Chudzicki to push improvements back to his mathbox-react library.
I was able to port a bunch of the examples over to MathBox.cljs, but my index page is currently broken due to a Clerk bug&hellip; I&rsquo;m working on a <a href="https://github.com/mentat-collective/MathBox.cljs/pull/13">fix here</a> that should be out and announced soon.</p>
<h3 id="levacljs">Leva.cljs</h3>
<p>This worked out REALLY WELL&hellip; I spent a lot of time making every input element in Leva compatible with my &ldquo;sync via atom&rdquo; approach, and I think it feels even better than the original. The docs at <a href="https://leva.mentat.org/">https://leva.mentat.org/</a> are certainly better than anything in JS land.</p>
<h3 id="last-months-stretch-goals">Last Month&rsquo;s Stretch Goals</h3>
<p>I wasn&rsquo;t able to complete the Clerk project templates, but those are the next logical thing to do, so I&rsquo;ll move on to that next. I&rsquo;ve also changed the name of my SICMUtils project to &ldquo;Emmy&rdquo;, to prepare for integration with all of these libraries. I&rsquo;ve started work on my &ldquo;ultra-fast ODE solvers&rdquo; at <a href="https://github.com/sicmutils/sicmutils/pull/533">https://github.com/sicmutils/sicmutils/pull/533</a> (yet-to-be-migrated to Emmy).</p>
<p>Thanks to Clojurists Together, I now have a stable foundation of every 2d and 3d visualization that I need to represent all of Emmy&rsquo;s mathematical objects and algorithms&hellip; and the community has all of these tools as well, along with the guarantee that they all work with Clerk and Reagent, and coming-soon guides on how to integrate all of this easily. (Of course each docs notebook is sort of a guide on how to integrate all three.)</p>
<h2 id="project-tablecloth-ethan-miller">Project Tablecloth: Ethan Miller</h2>
<p>Final Update (December 31, 2022)</p>
<ul>
<li>
<p>During this last quarter, I dug into the problem of lifting the incredible set of array operations present in dtype-next&rsquo;s `tech.v3.datatype.functional` namespace into tablecloth.</p>
</li>
<li>
<p>Currently, the practice is to import these operations externally and use them with tablecloth. But as part of the tablecloth columns project, there was a feeling that a big part of this project is to &ldquo;lift&rdquo; these operations into tablecloth and make them work with the columns and then eventually with the dataset.</p>
</li>
<li>
<p>The decision to do this was a result of conversations <a href="https://clojurians.zulipchat.com/#narrow/stream/151924-data-science/topic/use.20cases.20for.20a.20tablecloth.20column.3F%3E">here</a> that I summarized in the <a href="https://humanscode.com/columns-for-tablecloth-ii">last project update</a> Ultimately, the goal is that these functions will take a columns and return either a scalar or a column where appropriate: `(column) =&gt; column. In the future, the same operations can be used on the dataset.</p>
</li>
<li>
<p>I started this effort with some discussion of the right strategy for lifting these functions - see <a href="https://clojurians.zulipchat.com/#narrow/stream/236259-tech.2Eml.2Edataset.2Edev/topic/.E2.9C.94.20.22lifting.22.20dtype-next.20functions.20into.20Tablecloth.20column">here</a>. We decided not to use macros but take a code generation strategy where we write the functions namespace ahead of time. There&rsquo;s an existing &ldquo;lifting&rdquo; operation in tablecloth that adapts tablecloth functions so they will work with the pipeline&rsquo;s of scicloj.ml. This code uses macros which generate the functions at compile time, but this approach didn&rsquo;t work well with the dev tooling. By writing the namespace ahead of time, we can get slightly better integration with tooling.</p>
</li>
<li>
<p>The work on this lifting operation is ongoing, but has gone through one round of review. The pull request is <a href="https://github.com/scicloj/tablecloth/pull/90">here</a>. It will be merged soon once the set of lifted functions is more complete.</p>
</li>
<li>
<p>Looking forward to the next quarter, my plan is to wrap this PR up, covering most of the functions in the`tech.v3.datatype.functional` namespace. After that, given that ther&rsquo;s only one more quarter in this project, I am hoping to spend sometime thinking with Tomasz Sulez (author of Tablecloth) about the minimum viable version of this column project that could be merged into the main branch. Hopefully, by the end of the following quarter we can merge that MVP.</p>
</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2023 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q1-2023-funding-announcement/</link>
      <pubDate>Sat, 28 Jan 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2023-funding-announcement/</guid>
      <description>Clojurists Together is pleased to announce that we are funding 7 projects for a total of $42K USD in Q1 2023.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is pleased to announce that we are funding 7 projects for a total of $42K USD in Q1 2023. The projects and descriptions are listed below. Congratulations to all and we look forward to updates as the work progresses.</p>
<p><strong>$9,000 USD</strong></p>
<ul>
<li><strong>Aleph/Manifold:</strong> Matthew Davidson</li>
<li><a href="https://github.com/nextjournal/clerk"><strong>Clerk:</strong></a> Martin Kavalar</li>
<li><strong>Donut:</strong> Daniel Higginbotham</li>
<li><a href="https://github.com/uncomplicate/neanderthal"><strong>Uncomplicate Neanderthal:</strong></a> Dragan Duric</li>
</ul>
<p><strong>$2,000 USD</strong></p>
<ul>
<li><a href="https://github.com/clojure-emacs/clojure-ts-mode"><strong>Clojure-ts-mode:</strong></a> Danny Freeman</li>
<li><a href="https://github.com/exercism/clojure"><strong>Clojure track on exercism.org:</strong></a> Bobbi Towers</li>
<li><a href="https://github.com/ribelo/doxa"><strong>Doxa:</strong></a> Rafał Krzyważnia</li>
</ul>
<h3 id="q1-2023-projects">Q1 2023 Projects:</h3>
<h2 id="alephmanifold">Aleph/Manifold</h2>
<p><strong>Grantee:</strong> Matthew Davidson</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>There&rsquo;s a base level of maintenance involved in just keeping deps up-to-date and squashing bugs that takes up time. For new features and improvements, I&rsquo;d like to add HTTP 2 and 3 support, refactor our error handling and websocket code, and explore/support Loom virtual threads.</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Aleph is one of the most popular HTTP libraries in the Clojure community, especially for streaming applications, and has been downloaded over 1.6 million times, according to Clojars.</p>
<h2 id="clerk">Clerk</h2>
<p><strong>Grantee:</strong> Martin Kavalar</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<ul>
<li>Improve documentation <a href="https://book.clerk.vision">https://book.clerk.vision</a></li>
<li>Fix performance bottlenecks to make the Tap inspector useable when tapping large values</li>
<li>Improve error handling</li>
<li>Extend Clerk to serve reactive dashboards, including a getting started project</li>
</ul>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It&rsquo;s becoming one of the more popular options for data science and moldable development.</p>
<h2 id="donut">Donut</h2>
<p><strong>Grantee:</strong> Daniel Higginbotham</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Donut is a single-page app framework that builds on existing well-regarded libraries like reitit and re-frame.</p>
<p>With Donut, I&rsquo;m trying to create a beginner-friendly Clojure product: a collection of libraries, tutorials, and community resources that place the beginner experience front-and-center. This purpose of this product is to help developers of all levels be able to get their business ideas into production quickly, and to be able to grow and maintain their projects with minimum frustration.</p>
<p>I want the libraries and instructional materials to be the most comprehensive, easy-to-follow materials for launching an SPA that can make money with Clojure, but beyond that I also want to cultivate a community that values both beginner-friendliness and technical excellence. I want to rally Clojurists around the idea that together we can create an awesome foundation for apps that will help real people improve their lives, without sacrificing technical quality.</p>
<p>I think that the code is good enough to start publicizing, but the code is only one part of what needs to get done. Clojurists Together funding will help me pay for other aspects of building a product:</p>
<ul>
<li>Paying for branding and design</li>
<li>Building a web site that serves as both marketing vehicle and excellent technical instruction and documentation</li>
<li>Community building, e.g. spending time doing presentations, managing a slack channel, reaching out to other devs, etc</li>
</ul>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>This project is important to the Clojure community because we still lack a clear, comprehensive beginners' story.</p>
<p>We&rsquo;re also lacking a higher foundation for SPA development. For example, we don&rsquo;t have off-the-shelf drop-in solutions for common problems like Stripe integration or Google/Facebook/Apple authentication, and I want Donut to become that foundation.</p>
<h2 id="uncomplicate-neanderthal">Uncomplicate Neanderthal</h2>
<p><strong>Grantee:</strong> Dragan Duric</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>My goal with this round is to implement Sparse Matrix support in Neanderthal. Neanderthal is a Clojure library for fast matrix computations based on the highly optimized native libraries and computation routines for both CPU and GPU.</p>
<p>It is a lean, high performance, infrastructure for working with vectors and matrices in Clojure, which is the foundation for implementing high performance computing related tasks, including, but not limited to, machine learning and artificial intelligence. It currently supports operations on vectors, general matrices, and structured sparse matrices.</p>
<p>A major missing part is support for arbitrary, unstructured, sparse matrices, and functions operating on them. Sparse matrices are matrices with mostly <em>zero</em> values. Although in theory the same data can be represented by general matrices, sparse matrices enable efficient support for gigantic matrices, since we do not need space for storing all these zeroes, and we can optimize operations to only compute the affected values (which are small percentage of the total).</p>
<p>Sparse matrices are useful wherever general matrices are useful (which is in most places where we work with many numbers) and the ratio of non-zero to zero values is relatively small (which is often the case). Besides machine learning, this includes common problems where we represent sparse conectedness between items (say, which out of many millions of items each of hopefully millions of users bought) and subsequent operations of such data. This could potentially be very useful for developers of graph-based software (lots of Clojure Code works with graphs, implicitly, or explicitly).</p>
<p>The state of the art implementation of optimized low-level operations will be provided by integrating Intel&rsquo;s oneDNN (CPU). Native API&rsquo;s in this domain are very heavy, convoluted, and rather unclojure-y; but I&rsquo;ve already learned how to solve that problem in Neanderthal. This is something that is currently poorly supported in Java, let alone Clojure, but this project can bring an elegant support to Clojure and the JVM.</p>
<p>I propose to implement:</p>
<ul>
<li>A developer-friendly implementation of common sparse matrix structures in Clojure</li>
<li>Support relevant operations as Clojure functions</li>
<li>An extension infrastructure for various future backend implementations.</li>
<li>A clean low-level integration with Intel&rsquo;s oneDNN RNN on the CPU</li>
<li>Assorted improvements to Deep Diamond to support this additions</li>
<li>Related bugfixes</li>
<li>TESTS (of course!)</li>
</ul>
<p>This would improve Neanderthal and make it more complete as:</p>
<ul>
<li>A fast and simple Clojure-first infrastructure library that people can build on top of for everything matrix-related (which includes lots of ML and lots of non-ML)</li>
<li>A fast and user-friendly sparse matrix implementation in Clojure</li>
</ul>
<p>I will follow up this work with continuous improvement of Neanderthal, and its ecosystem of books, docs, tutorials, etc. (I have already published two books covering this)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It is the infrastructure for high performance computing, deep learning, machine learning, and other high performance scientific software based on high-performance vector and matrix operations.</p>
<h2 id="clojure-ts-mode">Clojure-ts-mode</h2>
<p><strong>Grantee:</strong> Danny Freeman</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I would like to get as much of clojure-mode (font-locking, indentation, imenu, navigation, potentially refactoring tools) ported over to clojure-ts-mode as possible. I also help maintain tree-sitter-clojure (<a href="https://github.com/sogaiu/tree-sitter-clojure">https://github.com/sogaiu/tree-sitter-clojure</a>) the tree-sitter grammar that powers clojure-ts-mode. As I find issues with it, I will help fix them in the grammar repository. This will help benefit other editors and tools like neovim that also use the tree-sitter-clojure grammar.</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Tree-sitter support is being released with Emacs 29 early next year. Tree sitter provides more performant syntax highlighting and code introspection than what Emacs is traditionally capable of. Most of the heavy lifting is done by the tree-sitter grammar that is used by Emacs and other tools. Having clojure-ts-mode ready by the time Emacs 29 is out will allow Emacs Clojure user to take advantage of tree-sitter right out of the gate.</p>
<h2 id="clojure-track-on-exercismorg">Clojure track on exercism.org</h2>
<p><strong>Grantee:</strong> Bobbi Towers</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I am wanting to expand the track syllabus by creating more concept exercises to improve the learning path to provide a more complete educational experience.</p>
<p>Right now we are focusing on building analysis tooling to provide automated feedback on exercise submissions, since we receive hundreds each week many of which are extremely similar, which results in our mentors having to needlessly repeat themselves. The way we are solving this problem is through building <em>representers</em>, a system of analyzing code and grouping them into <em>approaches</em>, and integrating them into our UI which enables our trusted mentors to provide standardized feedback for the approaches. More info: <a href="https://exercism.org/blog/introducing-representers">https://exercism.org/blog/introducing-representers</a></p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Exercism has been one of the most popular Clojure learning communities and is one of the 2 sources of practice problems listed at <a href="https://clojure.org/guides/getting_started">https://clojure.org/guides/getting_started</a>\Over the years we have evolved from curating exercises from around the web, to creating a proper learning path that guides the student through the knowledge graph of key language concepts, and building an in-browser editor and test runner.What sets us apart from other &ldquo;learn to code&rdquo; websites is the aspect of human mentorship, and our continued mission is to maximize the value of human connection in learning a language.</p>
<h2 id="doxa">Doxa</h2>
<p><strong>Grantee:</strong> Rafał Krzyważnia</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Doxa was born as an experiment and an attempt to learn how to use a meander. An example of extreme programming. In fact, almost every function is based on it. Despite this approach, it has proven useful and community interest has exceeded expectations. I&rsquo;d like to rewrite all the code in a way that doesn&rsquo;t rely on mender, which is brilliant, but as such contains a lot of bugs and let&rsquo;s be honest, it makes the whole thing look like crap. Also, doxa documentation is basically non-existent and I would like to write it too.</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Over time, despite the initial enthusiasm, it became apparent that datascript was too big, complex and slow to use on the front end. True, complex and large databases only show their advantage over a simple map when we have a amount of data that exceeds what is usually found on the frontend. But pull syntax and datalog query have pretty much become the standard among the community, and there seems to be room for a small, clever, normalised database with support for both.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>December 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/december-2022-monthly-update/</link>
      <pubDate>Fri, 06 Jan 2023 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/december-2022-monthly-update/</guid>
      <description>As the new year begins, here are the latest updates on projects funded in Q3 2022.</description>
      <content:encoded><![CDATA[<h2 id="project-biff-jacob-obryant"><strong>Project Biff: Jacob O&rsquo;Bryant</strong></h2>
<p>I started and finished <a href="https://biffweb.com/docs/tutorial/build-a-chat-app/">the tutorial</a>. It has 8 main sections:</p>
<ul>
<li>Start a new project</li>
<li>Make a landing page</li>
<li>Deploy to production</li>
<li>Communities</li>
<li>Channels</li>
<li>Messages</li>
<li>Realtime updates</li>
<li>Inbound RSS</li>
</ul>
<p>I also wrote <a href="https://biffweb.com/p/tutorial/">an announcement</a> blog post with a few more details, for example: In building eelchat, you&rsquo;ll get a tour of all of Biff&rsquo;s main parts, including:</p>
<ul>
<li>Creating and deploying a new project (I like to get new apps in production right away)</li>
<li>Rendering pages with Rum and Tailwind</li>
<li>Modeling your app&rsquo;s domain with Malli schemas</li>
<li>Doing CRUD with XTDB and htmx</li>
<li>Pushing updates to the client with transaction listeners, htmx, and hyperscript</li>
<li>Handling background jobs with scheduled tasks and in-memory queues</li>
</ul>
<h2 id="project-cljfx-vladislav-protsenko"><strong>Project Cljfx: Vladislav Protsenko</strong></h2>
<p><strong><a href="https://github.com/cljfx/dev">Cljfx dev tools</a> got a new release â€” <code>1.0.36</code>.</strong>  The new version adds 2 major enhancements:</p>
<ul>
<li>interactive props&amp;types reference UI that also shows javadoc of defined cljfx types;</li>
<li>live cljfx component tree explorer shown on &lt;kbd&gt;F12&lt;/kbd&gt; that is automatically enabled if you use cljfx dev-time configuration.</li>
</ul>
<p>Both features are showcased with this gif:<img src="https://raw.githubusercontent.com/cljfx/dev/main/demo.gif" alt="Demo"></p>
<h2 id="project-clojupedia-adam-helinski"><strong>Project: Clojupedia, Adam Helinski</strong></h2>
<p>Here is a link to the presentation I gave at Dutch Clojure Days in October 2022 that explains the project and our work to date.  <a href="https://youtu.be/fuhaYvqJe-E">https://youtu.be/fuhaYvqJe-E</a></p>
<p align *center*>
<p>Here is the  <a href="https://github.com/clojupedia/clojupedia.org">Repository</a> <a href="https://github.com/logseq/logseq">Website</a>.</p>
<h2 id="project-exo-william-acton"><strong>Project Exo: William Acton</strong></h2>
<p>November and December have been extraordinarily busy for me, both professionally and personally. Clojurists Together graciously extended the deadline for me to work on Exo so that I could provide a more sizable update.</p>
<h3 id="overview"><strong>Overview</strong></h3>
<p>Exo is a ClojureScript library for fetching and cachind data using EQL. It builds upon the ideas behind Fulcro, apollo-client and Realy, while providing an easy to use interface for developers to adopt it a la carte into their existing ClojureScript applications. Previously, Exo added support for efficiently querying and caching requests to a Pathom backend. It uses a normalized cache to ensure that entities that are shared amongst queries are stored compactly, and all queries that need data in those entities are updated when a change occurs.</p>
<p>Alas, the progress hasn&rsquo;t been as big as the first update despite spending a considerable amount of time on it. The majority of the time was spent researching and experimenting with ways of handling <em>mutations</em> - i.e. things that update a remote data store - and how to handle updates to the cache that would not be an accretion of data.</p>
<h3 id="mutations"><strong>Mutations</strong></h3>
<p>&ldquo;Mutations&rdquo; are the name that pathom and GraphQL use to refer to requests that change the world, e.g. updating the name of my profile, sending a friend request, or blocking someone. Both pathom and GraphQL use a specific syntax for describing mutations that are distinct from queries that are meant to read data. For those that are familiar, it follows from the Command and Query Responsibility Segregation (CQRS) model of developing systems.</p>
<p>In general, Exo expects that the update to the actual world will be handled for us by some backend service. Exo&rsquo;s responsibility is to ensure that the cache which our application uses to show the state of the world to the user accurately reflects the changes that are made as they occur.</p>
<p>There are 3 broad categories of updates, which may occur together or separately in one mutation, that each present a challenge to front-end applications. I&rsquo;ll walk through each category and how Exo intends to handle them today, and how that might change in the future after further development.</p>
<h3 id="accretion"><strong>Accretion</strong></h3>
<p>A mutation may add new information to an entity, which means that a new or existing attribute may appear with new data. This is easily handled by either adding new data to the store, or by re-querying the remote endpoint to get the latest data.</p>
<p>You can imagine this as pseudo-code</p>
<pre><code>
(def mutation ,,,)

(-&gt; (send-mutation! mutation)

    (.then (fn [result]

             (add-data! cache result))))

</code></pre><p>Since the cache is a normalized data structure, any new information about entities in the result will be added and any queries that use that information will automatically be updated. This is easily supported with no additional changes to Exo&rsquo;s caching mechanisms today.</p>
<h3 id="deletion-of-attributes"><strong>Deletion of attributes</strong></h3>
<p>A mutation may also delete an entities attribute. There can be ways to model our domain to avoid this, but it is common enough that Exo ought to support it. Exo&rsquo;s default model of adding new data is to merge the latest data with what was previously there, which doesn&rsquo;t account for attributes that may not be present in the latest data but were previously present.</p>
<p>Mutations that may do this can use the new <code>update-entity!</code> function, which is takes a lookup ref like <code>[:id 1]</code> and a function of the current entity and the new entity map.</p>
<h3 id="deletion-of-entities"><strong>Deletion of entities</strong></h3>
<p>Some mutations may delete an entire entity from the system. In Exo, when an entity appears in the data of another entity, it is replaced with a reference that tells the query engine to look up the current state of it when reading.</p>
<p>If we naively remove an entity from the cache, these references may be left dangling, taking up space and leading to strange behavior. To help with this, Exo now provides a <code>delete-entity!</code> which correctly cleans up all references to the entities in the cache, which can be done after a successful mutation on the backend.</p>
<h3 id="evicting-queries"><strong>Evicting queries</strong></h3>
<p>The above sections defines 3 categories of mutations and tools to handle each of them. These tools work well individually. However, there are some operations that don&rsquo;t quite fit the entity model of thinking, or are too complex to be described as strictly a deletion or accretion.</p>
<p>As a catch all for the things that don&rsquo;t fit nicely into the above categories, there&rsquo;s also the <code>evict-queries!</code> function which removes all data in the cache specific to the queries and triggers an update to any watches. With a bit more work on the network side of things, this can be used to refetch a query and populate its data regardless of what kind of change was made on the backend.</p>
<h3 id="programmatic-vs-declarative"><strong>Programmatic vs declarative</strong></h3>
<p>So far, I&rsquo;ve described ways of programmatically acting on the cache after a mutation has been sent on the backend. I wanted to make sure I had the right mental model for tackling these problems before I tried to handle these operations in a more automatic way.</p>
<p>As stated in the beginning, Pathom has specific syntax for mutations. It uses EQL, similar to its queries, but uses symbols in a quoted list, similar to a Clojure function call</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">
[<span style="color:#f92672">`</span>(<span style="color:#a6e22e">pokemon/update-name</span> <span style="color:#ae81ff">25</span> <span style="color:#e6db74">&#34;Pikachu&#34;</span>)]

</code></pre></div><p>These mutations respond with a result map which can be added to the Exo cache. If the mutation responds with data that contains references to the updated entity, simply adding this result to the cache will cause all related queries to update.</p>
<p>The next thing you could do is add queries that you want to re-run after the mutation has occurred.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">
[<span style="color:#f92672">`</span>(<span style="color:#a6e22e">pokemon/update-name</span> <span style="color:#ae81ff">25</span> <span style="color:#e6db74">&#34;Pikachu&#34;</span>)

 pokemon-query

 evolution-query]

</code></pre></div><p>Again, adding the result of this query sent to pathom will update the cache such that all of the related queries will be updated. However, detecting attribute or entity deletion isn&rsquo;t possible using this syntax. An additional way of notifying Exo about this is needed. There are also considerations around optimistic updates and rollback which I am exploring.</p>
<p>The tools described in the section before this give us the fundamental tools to handle each case. The next step is to build the network machinery to refetch a query when it is evicted, and then build a wrapper around all of this to expose it as a React hook that can be used declaratively in applications.</p>
<h3 id="conclusion"><strong>Conclusion</strong></h3>
<p>I had high hopes coming out of the first half of my 3 months working on Exo, funded by Clojurists Together, that I would be able to finish mutations and begin documenting the library for humans to use. Ultimately, I was not satisfied with the solutions I was trying when doing this declaratively, so I sufficed to build a programmatic solution that could handle all the cases I could think of and continue to experiment with declarative wrappers.</p>
<p>If you&rsquo;re interested in trying out Exo, reach out to me at <a href="mailto:hello@willacton.com">hello@willacton.com</a> or DM me on Clojurians slack @lilactown. It has been a pleasure working with Clojurists Together, and I appreciate them funding this project. It has given me the boost I needed to make a ton of progress over the last few months, and I look forward to continuing to work on it and many of my other open source projects as time permits. Thanks!</p>
<h2 id="project-mariacloud-matthew-huebert"><strong>Project Maria.cloud: Matthew Huebert</strong></h2>
<p>This is my third and final update for the Fall/2022 funding of Maria.cloud by ClojuristsTogether. A huge thank-you to everyone involved for making this possible!</p>
<p>Work concluded this month includes:</p>
<ol>
<li>Popovers for adding &amp; editing <strong>links</strong> and <strong>images</strong> graphically.</li>
<li>Improved <strong>stacktrace view</strong> shows doc/metadata for vars, and highlights relevant code regions on hover.</li>
<li><strong>Autocomplete</strong> is now implemented on top of sci.</li>
<li>Keymaps are now consistent with Maria.cloud and the &ldquo;eval-region&rdquo; extension was simplified.</li>
<li><strong>Async module loading:</strong> we can now include additional dependencies in a release, to be loaded on-demand via <code>ns</code> or <code>require</code>. Suggestions/PRs for additional modules are welcome.</li>
</ol>
<p>My top goals for this 3-month effort were to :
✅ rewrite the document model using a single ProseMirror instance, with code cells handled by a &ldquo;Node View&rdquo; using CodeMirror 6,</p>
<p>✅ eliminate all custom &ldquo;paredit&rdquo; code in favour of the existing CodeMirror 6 clojure-mode,</p>
<p>✅ use sci instead of the self-hosted compiler. Along the way I also added some improvements over the existing code:</p>
<p>✅ Top-level &ldquo;await&rdquo; for asynchronous document evaluation (primarily so that evaluator waits for <code>require</code> and <code>ns</code> forms to finish before proceeding, but can now be used for other purposes as well).</p>
<p>✅ A stacktrace viewer that can highlight relevant code.</p>
<p>✅ Curriculum files are now &ldquo;proper&rdquo; cljs/sci files complete with namespace declarations, so they can be used from Clojure (when clj-compatibility is complete). This will let students use their own editor to work through the curriculum, should they choose.</p>
<p>Much of this work went very well and even faster than expected, but a large number of other features also need to be updated or re-implemented in order to work with the new code. A few of these remain incomplete, and are blockers for deploying this work to Maria.cloud:</p>
<pre><code>🔲 command-palette

🔲 curriculum browsing &amp; loading

🔲 integration with GitHub (gists) for persistence and sharing
</code></pre>
<p>Meanwhile, the latest (in-progress) code continues to be auto-deployed to 2.maria.cloud.</p>
<h2 id="project-mathbox-sam-ritchie"><strong>Project Mathbox: Sam Ritchie</strong></h2>
<p>This last month I shipped a number of completed libraries for Clerk and Reagent, and worked on a number of upgrades to Clerk, JSXGraph and Mathbox that appeared over the course of development. I&rsquo;ve come out of this month thinking that these tools could really be the basis of an open-source, Clojure-based Mathematica competitor. After porting a few of the JS examples from the Mathbox repository, I think we can write faster code than hand-tuned three.js in natural Clojure style. Here&rsquo;s my progress broken down into buckets:</p>
<h3 id="libraries-shipped"><strong>Libraries Shipped:</strong></h3>
<p><strong>I&rsquo;ve shipped final versions of the following libraries:</strong></p>
<ul>
<li>
<p><a href="https://github.com/mentat-collective/jsxgraph.cljs">https://github.com/mentat-collective/jsxgraph.cljs</a> (<a href="https://jsxgraph.mentat.org/">https://jsxgraph.mentat.org</a>)</p>
</li>
<li>
<p><a href="https://github.com/mentat-collective/mathlive.cljs">https://github.com/mentat-collective/mathlive.cljs</a> (<a href="https://mathlive.mentat.org/">https://mathlive.mentat.org</a>)</p>
</li>
<li>
<p><a href="https://github.com/mentat-collective/clerk-utils.cljs">https://github.com/mentat-collective/clerk-utils.cljs</a> (<a href="https://clerk-utils.mentat.org/">https://clerk-utils.mentat.org</a>)</p>
</li>
</ul>
<p>Each features my best effort at well-documented code, interactive docs notebooks (via Clerk), workflows for release to cljdocs and Clojars&hellip; these projects will be easy to upgrade and maintain going forward. The JSXGraph library was very well received by the JSXGraph community!</p>
<p><strong>I&rsquo;ve also shipped draft versions of:</strong></p>
<ul>
<li>
<p><a href="https://github.com/mentat-collective/leva.cljs">https://github.com/mentat-collective/leva.cljs</a> (<a href="https://leva.mentat.org/">https://leva.mentat.org</a>)</p>
</li>
<li>
<p><a href="https://github.com/mentat-collective/mathbox.cljs">https://github.com/mentat-collective/mathbox.cljs</a> (<a href="https://mathbox.mentat.org/">https://mathbox.mentat.org</a>)</p>
</li>
<li>
<p><a href="https://github.com/mentat-collective/emmy-viewers">https://github.com/mentat-collective/emmy-viewers</a> (<a href="https://emmy-viewers.mentat.org/">https://emmy-viewers.mentat.org</a>)</p>
</li>
</ul>
<h3 id="mentat-collective"><strong>Mentat Collective</strong></h3>
<p>I&rsquo;ve collected a directory of all of my work around Mathbox, Clerk and computer algebra into a directory of projects listed at <a href="https://github.com/mentat-collective">https://github.com/mentat-collective</a>.
I&rsquo;ll add a shout-out to Clojurists Together for support on this page. There is a ton here!</p>
<h3 id="jsxgraph-and-mathlive"><strong>JSXGraph and Mathlive</strong></h3>
<p>I submitted a [bunch of bugs and improvements to the Mathlive project (<a href="https://github.com/arnog/mathlive/issues?q=is%3Aopen+author%3Asritchie">https://github.com/arnog/mathlive/issues?q=is%3Aopen+author%3Asritchie</a>+),</p>
<p>most of which are now resolved and folded into <code>mathlive.cljs</code>. JSXGraph is far more mature, but the way that I&rsquo;m passing state around in the library is unusual, so I found a few bugs with the way events are propagated
that are now fixed.</p>
<p>I am quite proud of the interactive documentation notebooks that live at:
<a href="https://mathlive.mentat.org/">https://mathlive.mentat.org/</a> and <a href="https://jsxgraph.mentat.org/">https://jsxgraph.mentat.org/</a>. Writing these made the library much better, and some of the examples, like the <a href="%5Bhttps://jsxgraph.mentat.org/#vector_field%5D(https://jsxgraph.mentat.org/#vector_field)">Vector Field</a> page, are really exciting.</p>
<h3 id="mathbox"><strong>MathBox</strong></h3>
<ul>
<li>
<p>I shipped a static site to <a href="https://mathbox.org/">https://mathbox.org</a> with all of the demos in the mathbox repository.</p>
</li>
<li>
<p>I&rsquo;ve started porting these examples over to Clojure at <a href="https://mathbox.mentat.org/dev/mathbox/examples/index.html">https://mathbox.mentat.org/dev/mathbox/examples/index.html</a>.</p>
</li>
</ul>
<p>See that page for a progress report. (I decided to kill Storybook and go all-in on the Clerk style of documentation notebook.) I also figured out how to make my Clojure ODE solver VERY fast, probably faster than most Javascript you&rsquo;d write, since I have my own compiler.</p>
<h3 id="levacljs"><strong>leva.cljs</strong></h3>
<p>I found a beautiful JavaScript library called &ldquo;Leva&rdquo; that lets you add interactive controls to a web page, and wrote a CLJS wrapper that allows you to bidirectionally bind a control panel to a CLJS or Reagent atom.
I&rsquo;ve shipped a draft to <a href="https://leva.mentat.org/">https://leva.mentat.org/</a>.</p>
<p>For an example of where this is useful, see: <a href="https://emmy-viewers.mentat.org/src/phase_portrait.html">https://emmy-viewers.mentat.org/src/phase_portrait.html</a>, where I use the <code>dat.gui</code> library, a clunkier version of leva. This is useful for ANY Clerk or Reagent application where you want some way to play with state.</p>
<h3 id="sicmutils-viewers"><strong>sicmutils-viewers</strong></h3>
<p>I&rsquo;ve renamed this library to &ldquo;emmy-viewers&rdquo;, in anticipation of a rename of the SICMUtils computer algebra system to Emmy, after <a href="%5Bhttps://en.wikipedia.org/wiki/Emmy_Noether%5D(https://en.wikipedia.org/wiki/Emmy_Noether)">Emmy Noether</a>.</p>
<p>I&rsquo;ve shipped an example physics simulation to: <a href="https://emmy-viewers.mentat.org/src/phase_portrait.html">https://emmy-viewers.mentat.org/src/phase_portrait.html</a>. Each of the lines on the phase portrait to the right is an independent physics simulation; all 256 simulations, plus the pendulum, are running at 60fps.</p>
<h3 id="clerk"><strong>Clerk</strong></h3>
<p>I published a small library for Clerk users to make it easier to write documentation notebooks like the ones in these projects: <a href="https://github.com/mentat-collective/clerk-utils">https://github.com/mentat-collective/clerk-utils</a>. This has its own docs notebook, of course, at <a href="https://clerk-utils.mentat.org/">https://clerk-utils.mentat.org/</a>.</p>
<p>I also figured out how to publish libraries with custom cljs to Clerk&rsquo;s &ldquo;garden&rdquo; static publishing system. See, for example: <a href="https://github.clerk.garden/mentat-collective/leva.cljs">https://github.clerk.garden/mentat-collective/leva.cljs</a>.</p>
<h3 id="final-push-in-this-final-month"><strong>Final Push in this final month:</strong></h3>
<h3 id="clerk-project-templates"><strong>Clerk project templates</strong></h3>
<p>Each of these published libraries works brilliantly as a &ldquo;Clerk Plugin&rdquo;, as demonstrated by the docs notebooks. But this is a new thing for Clerk, and there are no good docs for how to include custom CLJS in a Clerk build.
I&rsquo;m working with the Clerk team to write the following <code>deps-new</code> templates for Clerk users:</p>
<ul>
<li>Standard Clerk notebook project (compatible with Github Pages)</li>
<li>Clerk notebook project with custom cljs (Github Pages-aware)</li>
<li>A template for libraries like mine, shipped to Clojars, with interactive docs created via Clerk
These will live at <a href="https://github.com/nextjournal/clerk-cljs-demo">https://github.com/nextjournal/clerk-cljs-demo</a></li>
</ul>
<h3 id="final-libraries"><strong>Final libraries</strong></h3>
<h3 id="mathboxcljs"><strong>mathbox.cljs</strong></h3>
<p>I&rsquo;ll ship a final version of mathbox.cljs, along with a number of the the examples at <a href="https://mathbox.mentat.org/dev/mathbox/examples/index.html">https://mathbox.mentat.org/dev/mathbox/examples/index.html</a>.
I am going to use these to show off best practices for how to write visualizations in a way that is very fast.</p>
<h3 id="levacljs-1"><strong>leva.cljs</strong></h3>
<p>This needs a final release to Clojars; there is a LOT that this library can do that I&rsquo;ll probably document and leave for future releases, like creating multiple control panels for a page.</p>
<h3 id="stretch-ultra-fast-ode-solvers"><strong>Stretch: ultra-fast ODE solvers</strong></h3>
<p>I realized during my Mathbox work that I can make function compilation with
<a href="%5Bhttps://github.com/sicmutils/sicmutils/pull/523%5D(https://github.com/sicmutils/sicmutils/pull/523)">sicmutils</a> much better. In fact, I HAVE to do this for the physics simulations I&rsquo;m imagining to work very fast.</p>
<p>It may not be obvious how amazing <a href="https://emmy-viewers.mentat.org/src/phase_portrait.html">https://emmy-viewers.mentat.org/src/phase_portrait.html</a> is, since I am not displaying the code that generates the system being simulated&hellip; but all of this is coming from function that&rsquo;s only a couple of lines long, describing the &ldquo;Lagrangian&rdquo; of a pendulum. On my machine, if I change the Lagrangian function, the whole animation live-updates and can display new crazy physics.</p>
<p>This is totally unheard of, and I think unique to this cljs stack. We are in Mathematica&rsquo;s territory here, but shareable, much faster, and using a modern JS stack. So I&rsquo;m going to try and get the interface for fast function compilation fixed up.</p>
<h2 id="project-portal-chris-bahdahdah"><strong>Project Portal: Chris Bahdahdah</strong></h2>
<p>Portal has seen [149 commits][commits] and 3 release ([0.33.0][0], [0.34.0][1],  [0.35.0][2]) since the last update on October 15th, 2022. Similar to previously,  these changes include many small bug fixes and UX improvements, however now with a much larger focus on documentation.</p>
<p>Portal now includes a <code>portal.api/docs</code> function which will open viewer docs. They include fully interactive examples, doc string and specs. This should help users better understand and leverage all viewers in Portal.
<img src="https://user-images.githubusercontent.com/1986211/204972402-ac9a25ec-b779-4cfd-ac10-80aed378d8f8.png" alt="portal viewer docs"></p>
<h3 id="new-guides"><strong>New Guides</strong></h3>
<p>In addition, Portal has many new guides to help with the specific following use cases:</p>
<ul>
<li>[<code>Custom viewer guide</code>][<code>custom-viewers</code>]</li>
<li>Describes how to leverage the new [<code>portal.api/repl</code>][<code>portal-repl</code>] to interactively build custom viewers for Portal.</li>
<li>Also, demonstrates how to [<code>automatically load viewers</code>][<code>auto-loading</code>] via the <code>:on-load</code> hook.</li>
<li>[<code>Calva notebook guide</code>][<code>calva-notebooks</code>]</li>
<li>Illustrates how Portal can be used embedded in Calva notebooks.</li>
<li>[<code>Clerk viewer guide</code>][<code>clerk</code>]</li>
<li>Demonstrates how to setup a custom Clerk viewer which will embed Portal viewers.</li>
<li>[<code>Portal console guide</code>][<code>portal-console</code>]</li>
<li>Shows how to leverage portal.console instead of <code>tap&gt;</code> to help with  traceability.</li>
<li>[<code>nREPL customization</code>][<code>nrepl-customization</code>]</li>
<li>Shows how to add a tap handler to customize how <code>portal.nrepl</code> eval results can be rendered.</li>
</ul>
<p><strong>[commits]: <a href="https://github.com/djblue/portal/compare/0.32.0...0.35.0">https://github.com/djblue/portal/compare/0.32.0...0.35.0</a></strong>
[0]: <a href="https://github.com/djblue/portal/releases/tag/0.33.0">https://github.com/djblue/portal/releases/tag/0.33.0</a>
[1]: <a href="https://github.com/djblue/portal/releases/tag/0.34.0">https://github.com/djblue/portal/releases/tag/0.34.0</a>
[2]: <a href="https://github.com/djblue/portal/releases/tag/0.35.0">https://github.com/djblue/portal/releases/tag/0.35.0</a></p>
<p><strong>[custom-viewers]: <a href="https://github.com/djblue/portal/tree/master/examples/portal-present">https://github.com/djblue/portal/tree/master/examples/portal-present</a></strong>
[portal-repl]: <a href="https://github.com/djblue/portal/tree/master/examples/portal-present#portal-nrepl">https://github.com/djblue/portal/tree/master/examples/portal-present#portal-nrepl</a>
[auto-loading]: <a href="https://github.com/djblue/portal/tree/master/examples/portal-present#auto-loading">https://github.com/djblue/portal/tree/master/examples/portal-present#auto-loading</a>
[calva-notebooks]: <a href="https://github.com/djblue/portal/blob/master/doc/editors/vs-code-notebook.md">https://github.com/djblue/portal/blob/master/doc/editors/vs-code-notebook.md</a>
[clerk]: <a href="https://github.com/djblue/portal/blob/master/doc/guides/clerk.md">https://github.com/djblue/portal/blob/master/doc/guides/clerk.md</a>
[portal-console]: <a href="https://github.com/djblue/portal/blob/master/doc/guides/portal-console.md">https://github.com/djblue/portal/blob/master/doc/guides/portal-console.md</a>
[nrepl-customization]: <a href="https://github.com/djblue/portal/blob/master/doc/guides/nrepl.md#customization">https://github.com/djblue/portal/blob/master/doc/guides/nrepl.md#customization</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together 2023 Long-Term Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-2023-long-term-funding-announcement/</link>
      <pubDate>Sun, 25 Dec 2022 14:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-2023-long-term-funding-announcement/</guid>
      <description>Clojurists Together is funding 10 developers $1.5k/month for 12 months</description>
      <content:encoded><![CDATA[<p>Clojurists Together members have voted to to fund 10 developers $1.5k/month for 12 months (180k USD total!). We&rsquo;re excited to announce the following developers/teams who will be funded:</p>
<ul>
<li>Bozhidar Batsov</li>
<li>Christophe Grand</li>
<li>Eric Dallo</li>
<li>Michiel Borkent</li>
<li>Nikita Prokopov</li>
<li>Peter Stromberg</li>
<li>Peter Taoussanis</li>
<li>Sean Corfield</li>
<li>Thomas Heller</li>
<li>Tommi Reiman</li>
</ul>
<p>We are very excited to see what these developers will do over the next year. They will post updates every two months of what they&rsquo;ve been working on, and we&rsquo;ll share them in our regular monthly updates. Here&rsquo;s what each of these developers plan to work on (although this is just a starting point and they&rsquo;re free to change their plans as they see fit):</p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>Provide continued support for <a href="https://cider.mx">CIDER</a>, <a href="https://nrepl.org/nrepl/index.html#">nREPL</a> and the related libraries and improve them in various directions. Some ideas that I have in my mind:</p>
<ul>
<li>Make CIDER play better with alternative Clojure(Script) runtimes</li>
<li>Simplify some of CIDER&rsquo;s internals (e.g. jack-in, session management)</li>
<li>Better CIDER documentation and a new tutorial video</li>
<li>Experiment with a tree-sitter based version of clojure-mode (for Emacs 29+)</li>
<li>Continue to move logic outside of cider-nrepl (as recently done with the stacktrace analysis functionality)</li>
<li>Improvement to the nREPL specification and documentation; potentially built some test suite for nREPL specification compatibility</li>
<li>Various improvements to the nREPL protocol</li>
</ul>
<h2 id="christophe-grand">Christophe Grand</h2>
<p>Continue working on <a href="https://github.com/Tensegritics/ClojureDart">ClojureDart</a>.</p>
<h2 id="eric-dallo">Eric Dallo</h2>
<p>I will work developing and maintaing mostly projects related to tooling for Clojure, mainly <a href="https://clojure-lsp.io">clojure-lsp</a> and related projects like lsp4clj, clj-kondo, emacs-lsp.</p>
<p>I will keep helping and supporting the community in the Clojurians slack channel #lsp along with creating tutorials and documentation to increase clojure-lsp reach.</p>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>Continue work on:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a></li>
<li><a href="https://github.com/babashka/babashka">babashka</a></li>
<li><a href="https://github.com/babashka/nbb">nbb</a></li>
<li><a href="https://github.com/babashka/sci">SCI</a></li>
<li><a href="https://github.com/squint-cljs/cherry">cherry</a></li>
<li><a href="https://github.com/squint-cljs/squint">squint</a></li>
</ul>
<p>and any other related projects.</p>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<ul>
<li>Continue developing <a href="https://github.com/HumbleUI">Humble UI</a>, getting it into state where real apps could be developed with it</li>
<li>Documenting, promoting and teaching Humble UI</li>
<li>Develop durability for <a href="https://github.com/tonsky/datascript">DataScript</a></li>
<li>Redo Clojure Sublimed parser &amp; smaller improvements</li>
<li>Contribute nREPL improvements needed for Clojure Sublimed</li>
<li>Some new Clojure library ideas? Who knows :)</li>
</ul>
<h2 id="peter-stromberg">Peter Stromberg</h2>
<p><a href="https://calva.io">Calva</a> will continue with its no-roadmap approach, where user feedback about painpoints and opportunities guide where Calva is improved. Expect Calva to be ”A year better” next year. That said, I do want to make Calva treat newcomers to Clojure better, so that will be the main theme.</p>
<p>I will put my 2023 Calva time towards these three main goals:</p>
<ol>
<li>A Getting Started with Clojure experience that only requires VS Code. (The current one requires VS Code + Java.)</li>
<li>A Start your First Clojure or ClojureScript Mini-project experience. (The current Getting Started experience leaves the user hanging about this.)</li>
<li>Leverage Joyride out of the box for Calva features/configuration.</li>
</ol>
<p>The main vehicle for creating the Java-free Getting Started with Clojure experience is Joyride, or should I say, SCI, on which Joyride is built.</p>
<p>As for leveraging Joyride more: A lot of Calva functionality could be moved over to Joyride. Porting things to Joyride would make more of this functioinally be implemented in ClojureScript and also make it easier for users to adapt things to their needs. This goal is mainly about putting the infra structure in place to facililtate porting. I think the Java-free Getting Started experience might be a good first candidate for porting.</p>
<p>To help users more fully leverage Joyride we also need to make it easier to use Joyride&rsquo;s REPL in parallell with your Clojure project&rsquo;s REPL, something which Calva does not handle all that well today. Let&rsquo;s name this a stretch goal for 2023.</p>
<h2 id="peter-taoussanis">Peter Taoussanis</h2>
<ul>
<li>Finish work on <a href="https://github.com/ptaoussanis/carmine">Carmine</a> v3 (a major modernized rewrite of the Clojure Redis client).</li>
<li>General ongoing maintenance + development of my <a href="https://github.com/ptaoussanis">existing open-source libraries</a>.</li>
<li>Further work TBD later (I have a number of options I&rsquo;d like to consider + get feedback on).</li>
</ul>
<h2 id="sean-corfield">Sean Corfield</h2>
<p>A while back I resurrected <a href="https://clojure-doc.org">clojure-doc.org</a> as a Cryogen-powered static site but the content needs a huge amount of work in terms of modernization and this funding would allow me to spend time working on that, with a focus on onboarding beginners, specifically around tooling as a supplement to what’s on clojure.org – providing more of a “cookbook” approach. Some of the work and material might go into clojure.org as part of improving both the deps and CLI guide/reference and the tools.build guide to make it much more beginner-friendly.</p>
<p>I would also like to work on improvements to Clojure CLI tooling that could offer some official solution to the “create a new project” conundrum that my community projects deps-new (and clj-new) currently offer, so that’s another area of tooling and beginner-focused documentation that I could carve out time to work on with this funding.</p>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Maintenance and Improvements for <a href="http://shadow-cljs.org">shadow-cljs</a>, and other more experimental libraries (eg. shadow-grove, shadow-css).</p>
<h2 id="tommi-reiman">Tommi Reiman</h2>
<p>I&rsquo;m planning on working mostly with <a href="https://github.com/metosin/malli">Malli</a>, to lead and deliver the most-wanted (and needed) missing core features, including simplified type tagging, improving map schemas, revisiting global configuration options and many more. I&rsquo;m also keen on exploring better development time tooling, built both with and for malli.</p>
<p>There is also a lot of interesting work to be done on other libs, including reitit, virhe, viesti and talvi, just haven&rsquo;t had any time to focus on those. Shipping reitit 1.0.0 would be awesome.</p>
<p>And who knows, maybe there will be a <a href="https://github.com/metosin/juustometsae">juustometsae</a> too.</p>
<h2 id="thanks">Thanks</h2>
<p>Thank you to all of our members for selecting these developers. If it wasn&rsquo;t for your generous support, this wouldn&rsquo;t be possible. I wanted to add a special thanks to Latacora, Roam Research, Whimsical, Stylitics, AppsFlyer, Pitch, Nubank, Cisco, Logseq, JUXT, Metosin, Solita, Adgoji, Nextjournal, ClojureStream, Shortcut, Flexiana, Toyokumo, doctronic, and 180° Seguros. They have all contributed significant amounts to Clojurists Together which lets us fund $180,000 in long-term funding to Clojure developers.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2023 Funding round and survey results</title>
      <link>https://www.clojuriststogether.org/news/q1-2023-funding-round-and-survey-results/</link>
      <pubDate>Tue, 06 Dec 2022 14:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2023-funding-round-and-survey-results/</guid>
      <description>Applications are now open for funding</description>
      <content:encoded><![CDATA[<p>Clojurists Together is starting our next funding round for Q3 2022. Applications are open until the 20th of December 2022. Apply today!</p>
<p>Developers can choose between two different funding tiers ($2,000 and $9,000) and can decide on the length of the funding, from 1 to 12 months (for the $9,000 tier). Funding would start from 1st of February but the start of funding can be delayed by up to two months. The $2k funding tiers are for experimental projects or smaller proposals, whereas the $9k tier is for more established projects.</p>
<p>We will be funding 4 $9k projects, and 4 $2k projects.</p>
<p>If you work on a Clojure open source project, especially one mentioned as a focus area for our members, please consider <a href="https://www.clojuriststogether.org/open-source/">applying</a>.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>As the year comes to a close, we surveyed our developer and company members to find out what they wanted us to focus on 2023. Here are some of the results:</p>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<p><img src="/images/2023/q1-survey/programs.jpg" alt=""></p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p><img src="/images/2023/q1-survey/1%20improvement.jpg" alt=""></p>
<h3 id="what-areas-of-clojurescript-would-you-like-to-see-improvement-in">What areas of ClojureScript would you like to see improvement in?</h3>
<p><img src="/images/2023/q1-survey/2%20improvement.jpg" alt=""></p>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<h4 id="developer-tooling">Developer Tooling</h4>
<ul>
<li>tooling, but not &ldquo;more feature&rdquo; but an easier way to use them</li>
<li>more tools, IDE improvements and better stacktraces</li>
<li>wide range of cross-area tools and libraries</li>
<li>tooling and their performance</li>
</ul>
<h4 id="documentation-tutorials-and-beginner-experience">Documentation, Tutorials and Beginner experience</h4>
<ul>
<li>documentation and examples</li>
<li>beginner support</li>
<li>discoverability of existing tools - beginner friendly documentation</li>
<li>more education and outreach to grow the userbase</li>
<li>outreach to developers outside the community</li>
<li>simple maintenance of &ldquo;abandoned&rdquo; libs, primarily semi-regular releases that bump dependencies</li>
</ul>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong?</h3>
<ul>
<li>The help from the Clojurist Community on Slack ❤️</li>
<li>Tooling features and performance</li>
<li>The language + tooling is super strong; we just need more people using them</li>
<li>Powerful yet simple libraries (if you can find them) and build tooling</li>
<li>Forward-thinking state management approaches</li>
<li>General stability</li>
<li>Editors</li>
</ul>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>antq</li>
<li>Calva</li>
<li>camel-snake-kebab</li>
<li>cheshire</li>
<li>clerk</li>
<li>clj-http</li>
<li>clj-kondo</li>
<li>cljs-ajax</li>
<li>Clojure-lsp</li>
<li>ClojureDart</li>
<li>component</li>
<li>Cursive</li>
<li>datahike</li>
<li>datalevin</li>
<li>datascript</li>
<li>djblue portal</li>
<li>ESM clojurescript</li>
<li>Fulcro</li>
<li>hiccup</li>
<li>Integrant</li>
<li>kaocha</li>
<li>Malli</li>
<li>manifold</li>
<li>meander</li>
<li>next-jdbc</li>
<li>Nrepl</li>
<li>pathom3</li>
<li>Portal</li>
<li>re-frame</li>
<li>re-frame-10x</li>
<li>re-frame-http-fx</li>
<li>re-frame-http-fx-alpha</li>
<li>reagent</li>
<li>reitit</li>
<li>riddley</li>
<li>ring</li>
<li>schema</li>
<li>SciCloj</li>
<li>Sente</li>
<li>Shadow Cljs</li>
<li>slingshot</li>
<li>spec</li>
<li>sqlg-clj</li>
<li>SublimeText</li>
<li>tigris</li>
<li>Undertow adapter</li>
<li>VS Code</li>
</ul>
<h3 id="what-would-you-like-to-be-different-in-the-clojure-community-in-the-next-12-months">What would you like to be different in the Clojure community in the next 12 months?</h3>
<ul>
<li>Stacktraces and more IDE tools</li>
<li>More outreach to spread info about Clojure to communities outside of the Clojure community.</li>
<li>A body like Clojurists Together could be a trusted entity for taking over management of abandoned Clojure libraries. [Note: We think that <a href="https://clj-commons.org">clj-commons</a> is already doing a great job at this]</li>
<li>More unified documentation experience</li>
<li>I&rsquo;d like to see the community grow more / faster</li>
<li>Supporting experimental uses of clojure in new domains</li>
<li>Improve leiningen and deps (and off course other libraries) to be natively GraalVM compatible. Deploying jars and combo packages is a headache for production companies.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together 2022 board election results</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-2022-board-election-results/</link>
      <pubDate>Fri, 25 Nov 2022 19:00:00 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-2022-board-election-results/</guid>
      <description>lvh and Maria Geller were automatically reelected</description>
      <content:encoded><![CDATA[<p>Clojurists Together recently <a href="https://www.clojuriststogether.org/news/clojurists-together-long-term-funding-for-2022-2023/">announced</a> our upcoming board elections and called for nominations. We only received two nominations by the deadline, from existing board members lvh and Maria Geller. As a result, lvh and Maria were automatically reelected to the board.</p>
<p>I&rsquo;m very excited to have lvh and Maria on the board for another two years. They have been instrumental in the success of Clojurists Together so far, and I&rsquo;m looking forward to working with them to continue to grow Clojurists Together.</p>
<p>I also want to thank our outgoing board members Nola Stowe and Fumiko Hanreich for their service on the board over the last two years.</p>
<p>Thanks again for your support of Clojurists Together. We&rsquo;re looking forward to another great year of funding Clojure open source projects.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>October 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/october-2022-monthly-update/</link>
      <pubDate>Mon, 31 Oct 2022 09:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2022-monthly-update/</guid>
      <description>Here are the updates from our Q3 2022 Projects. Read more about Cljfx, Portal, Exo, Clojupedia, Biff, Maria.cloud, Mathbox-cljs, and Clj-kondo and related.</description>
      <content:encoded><![CDATA[<h2 id="project-cljfx-vlad-protsenko">Project: Cljfx, Vlad Protsenko</h2>
<p>I implemented and released <a href="https://github.com/cljfx/dev">cljfx/dev</a> library — a set of tools that help with developing cljfx applications but should not be included in the production distribution of cljfx app.</p>
<h3 id="features">Features</h3>
<p>The cljfx/dev library has following features that help with developing cljfx applications:</p>
<h4 id="types-and-props-reference">Types and props reference</h4>
<p>Now it&rsquo;s not necessary to browse cljfx source code to see the available cljfx types and their props, instead, you can look it all up in the REPL:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clj" data-lang="clj">(<span style="color:#a6e22e">require</span> <span style="color:#e6db74">&#39;cljfx.dev</span>)
<span style="color:#75715e">;; look up available types:</span>
(<span style="color:#a6e22e">cljfx.dev/help</span>)
<span style="color:#75715e">;; Available cljfx types:</span>
<span style="color:#75715e">;; Cljfx type                             Instance class</span>
<span style="color:#75715e">;; :accordion                             javafx.scene.control.Accordion</span>
<span style="color:#75715e">;; :affine                                javafx.scene.transform.Affine</span>
<span style="color:#75715e">;; ...etc</span>

<span style="color:#75715e">;; look up information about fx type:</span>
(<span style="color:#a6e22e">cljfx.dev/help</span> <span style="color:#e6db74">:label</span>)
<span style="color:#75715e">;; Cljfx type:</span>
<span style="color:#75715e">;; :label</span>
<span style="color:#75715e">;; </span>
<span style="color:#75715e">;; Instance class:</span>
<span style="color:#75715e">;; javafx.scene.control.Label</span>
<span style="color:#75715e">;; </span>
<span style="color:#75715e">;; Props                            Value type     </span>
<span style="color:#75715e">;; :accessible-help                 string</span>
<span style="color:#75715e">;; :accessible-role                 either of: :button, :check-box, :check-menu-item, ...</span>
<span style="color:#75715e">;; ...etc</span>

<span style="color:#75715e">;; look up information about a prop:</span>
(<span style="color:#a6e22e">cljfx.dev/help</span> <span style="color:#e6db74">:label</span> <span style="color:#e6db74">:graphic</span>)
<span style="color:#75715e">;; Prop of :label - :graphic</span>
<span style="color:#75715e">;; </span>
<span style="color:#75715e">;; Cljfx desc, a map with :fx/type key</span>
<span style="color:#75715e">;; </span>
<span style="color:#75715e">;; Required instance class:</span>
<span style="color:#75715e">;; javafx.scene.Node¹</span>
<span style="color:#75715e">;; </span>
<span style="color:#75715e">;; ---</span>
<span style="color:#75715e">;; ¹javafx.scene.Node - Fitting cljfx types:</span>
<span style="color:#75715e">;;  Cljfx type               Class</span>
<span style="color:#75715e">;;  :accordion               javafx.scene.control.Accordion</span>
<span style="color:#75715e">;;  :ambient-light           javafx.scene.AmbientLight</span>
<span style="color:#75715e">;;  ...etc</span>
</code></pre></div><h3 id="improved-error-messages-with-spec">Improved error messages with spec</h3>
<p>Exceptions that happen inside cljfx lifecycle are usually not informative, since they contain mostly cljfx internals and not user code. But with cljfx/dev, the exceptions now report more useful information:</p>
<ul>
<li>cljfx descriptions are validated with spec and generate more informative error messages when they are invalid;</li>
<li>a stack of cljfx components is attached to the exception to help with debugging;</li>
</ul>
<p>For example, this is how label reports an error when its text is set to invalid type:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clj" data-lang="clj"><span style="color:#75715e">;; clojure.lang.ExceptionInfo: Invalid cljfx description of :label type:</span>
<span style="color:#75715e">;; :not-a-string - failed: string? in [:text]</span>
<span style="color:#75715e">;; </span>
<span style="color:#75715e">;; Cljfx component stack:</span>
<span style="color:#75715e">;;   :label</span>
<span style="color:#75715e">;;   user/message-view</span>
<span style="color:#75715e">;;   :scene</span>
<span style="color:#75715e">;;   :stage</span>
<span style="color:#75715e">;;   user/root-view</span>
<span style="color:#75715e">;;   </span>
<span style="color:#75715e">;;     at cljfx.dev$ensure_valid_desc.invokeStatic(validation.clj:62)</span>
<span style="color:#75715e">;;     at cljfx.dev$ensure_valid_desc.invoke(validation.clj:58)</span>
<span style="color:#75715e">;;     at cljfx.dev$wrap_lifecycle$reify__22150.advance(validation.clj:80)</span>
<span style="color:#75715e">;;     at ...</span>
</code></pre></div><h3 id="future-plans">Future plans</h3>
<p>I plan to extend cljfx/dev library with more useful features:</p>
<ul>
<li>UI for types and props reference that is easier to search than <code>cljfx.dev/help</code>;</li>
<li>add javadoc information about corresponding JavaFX classes in cljfx type help;</li>
<li>add ability to inspect the dynamic component tree of a live cljfx app.</li>
</ul>
<h2 id="project-portal-chris-badahdah">Project: Portal, Chris Badahdah</h2>
<p>Portal has seen <a href="https://github.com/djblue/portal/compare/0.29.1...master">127 commits</a> and 3 releases (<a href="https://github.com/djblue/portal/releases/tag/0.30.0">0.30.0</a>, <a href="https://github.com/djblue/portal/releases/tag/0.31.0">0.31.0</a>, <a href="https://github.com/djblue/portal/releases/tag/0.32.0">0.32.0</a>) since Clojurists Together funding started on September 1st, 2022. These changes include many small bug fixes, UX improvements, performance enhancements and documentation updates.</p>
<p>Aside from improvements, two new (experimental) features have also landed. The addition of <a href="https://github.com/djblue/portal/commit/e32f38a6951c0c28c23b54e7efe83c8ddea9195e">nREPL middleware</a> and a <a href="https://github.com/djblue/portal/commit/de8a6d76a337101ca227769bf34687d265824819">documentation viewer</a>.</p>
<p>The nREPL middleware allows users direct REPL access to the ClojureScript Portal UI runtime. This eases Portal UI extension development and advances the first goal of the funding proposal.</p>
<p>The documentation viewer is the start of producing interactive documentation for Portal viewers within Portal. It will allow Portal to enhance it&rsquo;s existing documentation, mostly static markdown files, and add new sections of live / interactive demos and usage docs.</p>
<p><img src="https://user-images.githubusercontent.com/1986211/196014235-86cc1723-f48e-4f98-bb91-ca7e637108eb.png" alt="doc viewer"></p>
<p>The remainder of the funding period will heavily focus on these live docs and other general docs improvements.</p>
<h2 id="project-exo-william-acton">Project: Exo, William Acton</h2>
<p>September 2022 saw more progress on Exo than originally anticipated. However,
there were also some unanticipated work required outside of exo itself that I&rsquo;ll
talk about here as well.</p>
<h3 id="overview">Overview</h3>
<p>Exo (working name, may change) is a ClojureScript library for fetching and
caching data using EQL. It builds on top of the fundamental ideas behind Fulcro,
Apollo-client, and Relay, while providing an easy to use interface for
developers to adopt it a la carte into their existing front end applications.</p>
<p>Since receiving Clojurists Together support, I have open sourced the code at
<a href="https://github.com/lilactown/exo">https://github.com/lilactown/exo</a>. Docs
are sparse and the API is currently considered unstable, but it is functional
for read-only usage.</p>
<h3 id="pokéapi-example">PokéAPI example</h3>
<p>A necessary part of any project is having a test bed to verify the correctness
and ergonomics of features as they&rsquo;re built.</p>
<p>Prior to Clojurists Together support, I had already built the fundamental
ability to send EQL queries to pathom, cache the results and subscribe to the
cache using React Hooks. Therefore my first task during this first month was to
build an example app that could exercise that basic functionality, and could be
extended to include more features as exo grows.</p>
<p>The example I chose is a single page app that would fetch and display data from
the <a href="https://pokeapi.co">PokéAPI</a>. The example uses pathom to resolve data from
the external API, and exo to orchestrate fetching and caching the data.</p>
<p>Initially, it showed some simple data about whatever pokemon was selected. I
then extended it to conditionally show data dependent on the initial data
loaded, i.e. the selected pokemon&rsquo;s evolution chain.</p>
<p>The code for this example can be found at <a href="https://github.com/lilactown/exo/tree/c40185ea415933f4c17c2dc187d7bb8fbaff026d/examples/pokemon-api">in the GitHub repo</a>,
and the live app can be seen at <a href="https://visionary-kitten-ba80c7.netlify.app">https://visionary-kitten-ba80c7.netlify.app</a>.</p>
<h3 id="deferred-queries">Deferred queries</h3>
<p>Exo&rsquo;s <code>use-query</code> hook precisely reflects the current state of whatever is in
the cache based on the query provided to it. However, in some cases (e.g. paging
results, where each page is a new query) we want to continue to show the results
from the previous query while we fetch the next query&rsquo;s results.</p>
<p>The PokéAPI example brought this use case to forefront, as fetching the data
from the API after changing which pokemon one is looking at can take a few
seconds, and in the meantime we can still show the previous pokemon with an
indication that we are loading the next one.</p>
<p>To support this use case, a new hook called <code>use-deferred-query</code> was added. This
way developers can easily choose whether they want to show the previous results
while loading, or always show the current value of the query in the cache even
if it&rsquo;s empty.</p>
<h3 id="data-masking--fragments">Data masking &amp; fragments</h3>
<p>A problem I wanted to explore with Clojurists Together&rsquo;s support is one that
shows up in many large applications I have worked in: impilicit data
dependencies between sibling components. The <a href="https://relay.dev/docs/principles-and-architecture/thinking-in-relay/">Relay docs</a> have a great explanation that I&rsquo;ll
quote below:</p>
<blockquote>
<p>With typical approaches to data-fetching we found that it was common for two components to have implicit dependencies. For example <Story /> might use some data without directly ensuring that the data was fetched. This data would often be fetched by some other part of the system, such as <AuthorDetails />. Then when we changed <AuthorDetails /> and removed that data-fetching logic, <Story /> would suddenly and inexplicably break. These types of bugs are not always immediately apparent, especially in larger applications developed by larger teams. Manual and automated testing can only help so much: this is exactly the type of systematic problem that is better solved by a framework.</p>
</blockquote>
<p>The solution I landed on is similar in concep to the one Relay uses: create
pieces of queries called &ldquo;fragments&rdquo; that can be composed together, and then
<em>hide the data</em> in the result unless a consumer also has a reference to the
fragment that was used to construct the query.</p>
<p>An example can be helpful to illustrate. Let&rsquo;s use a simplified version of the
PokéAPI example mentioned above:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defn </span>pokemon-query-by-id
  [id]
  [{[<span style="color:#e6db74">:pokemon/id</span> id] [<span style="color:#e6db74">:pokemon/id</span>
                      <span style="color:#e6db74">:pokemon/name</span>
                      <span style="color:#e6db74">:pokemon/height</span>
                      <span style="color:#e6db74">:pokemon/weight</span>
                      {<span style="color:#e6db74">:pokemon/sprites</span> [<span style="color:#e6db74">:pokemon.sprites/front-default</span>]}]}])


(<span style="color:#a6e22e">defnc</span> pokemon
  [{<span style="color:#e6db74">:keys</span> [data]}]
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:pokemon/keys</span> [id name height weight sprites]} data]
    ,,,))


(<span style="color:#a6e22e">defnc</span> evolutions
  [{<span style="color:#e6db74">:keys</span> [data]}]
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:pokemon/keys</span> [id]} data]
    ,,,))


(<span style="color:#a6e22e">defnc</span> example
  []
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:keys</span> [data loading?]} (<span style="color:#a6e22e">exo.hooks/use-query</span> (<span style="color:#a6e22e">pokemon-query-by-id</span> <span style="color:#ae81ff">1</span>))]
    (<span style="color:#66d9ef">if </span>loading?
      (<span style="color:#a6e22e">d/div</span> <span style="color:#e6db74">&#34;Loading...&#34;</span>)
      (<span style="color:#a6e22e">d/div</span>
       (<span style="color:#a6e22e">$</span> pokemon {<span style="color:#e6db74">:data</span> (get data [<span style="color:#e6db74">:pokemon/id</span> <span style="color:#ae81ff">1</span>])})
       (<span style="color:#a6e22e">$</span> evolutions {<span style="color:#e6db74">:data</span> (get data [<span style="color:#e6db74">:pokemon/id</span> <span style="color:#ae81ff">1</span>])})))))
</code></pre></div><p>In the above code, we have three components: the parent <code>example</code> and two
children, <code>pokemon</code> which would show some simple information about the selected
pokemon and <code>evolutions</code>, which would use the <code>pokemon/id</code> value to fetch
additional info.</p>
<p>The <code>pokemon-query-by-id</code> function returns an EQL query that is sent to pathom
by exo, on resolution of which the result will be stored in exo&rsquo;s cache and
re-render the <code>app</code> component.</p>
<p>Later, we refactor the <code>pokemon</code> component to no longer need the <code>pokemon/id</code>
key. Erroneously, we assume that no one else must be using it either - checking
to see if anything depends on <code>pokemon/id</code> might show a large number of results,
which would then need to be checked to see if they show up in the tree below the
<code>example</code> component.</p>
<p>In this small example, it&rsquo;s easy to fit everything on the screen; in a larger
app, these components might be spread across multiple files with many layers of
nesting.</p>
<p>The solution to making these breaking changes easier for a developer to discover
is to move the impilicit dependency into an explicit one. We&rsquo;ll move the data
requirements that <code>pokemon</code> and <code>evolutions</code> share into a fragment definition,
and then compose our query with it.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>pokemon-info-fragment
  (<span style="color:#a6e22e">exo/fragment</span>
   [<span style="color:#e6db74">:pokemon/id</span> <span style="color:#e6db74">:pokemon/name</span> <span style="color:#e6db74">:pokemon/height</span> <span style="color:#e6db74">:pokemon/weight</span>
    {<span style="color:#e6db74">:pokemon/sprites</span> [<span style="color:#e6db74">:pokemon.sprites/front-default</span>]}]))

(<span style="color:#66d9ef">defn </span>pokemon-query-by-id
  [id]
  [{[<span style="color:#e6db74">:pokemon/id</span> id] pokemon-info-fragment}])
</code></pre></div><p>When exo returns the result of this query now, it will now contain an opaque
<code>FragmentRef</code> instead of the data for <code>[:pokemon/id 1]</code>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">{[<span style="color:#e6db74">:pokemon/id</span> <span style="color:#ae81ff">1</span>] <span style="color:#f92672">#</span>&lt;exo.FragmentRef&gt;}
</code></pre></div><p>This fragment ref can be passed a new hook, <code>use-fragment</code> which will look up
the data in the cache and subscribe to it:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">defnc</span> pokemon
  [{<span style="color:#e6db74">:keys</span> [data]}]
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:pokemon/keys</span> [id name height weight sprites]} (<span style="color:#a6e22e">exo.hooks/use-fragment</span>
                                                         data
                                                         pokemon-info-fragment)]
    ,,,))


(<span style="color:#a6e22e">defnc</span> evolutions
  [{<span style="color:#e6db74">:keys</span> [data]}]
  (<span style="color:#66d9ef">let </span>[{<span style="color:#e6db74">:pokemon/keys</span> [id]} (<span style="color:#a6e22e">exo.hooks/use-fragment</span>
                              data
                              pokemon-info-fragment)]
    ,,,))
</code></pre></div><p>When we later go to modify the <code>pokemon-info-fragment</code>, we can easily discover
who depends on this data by searching for usages of it in our code base. This
isn&rsquo;t as automatic as Relay, which leverages the Flow static type system for
JavaScript to detect breaking changes, but is a vast improvement of the
situation before where past a certain size these dependencies are nigh
undetectable.</p>
<p>Another benefit of using fragments is that since the value of the <code>FragmentRef</code>s
are opaque, the parent component that runs the query doesn&rsquo;t need to re-render
when the cache updates with new data; instead, only components that are using
the fragment will be updated in that case. Not only does it improve the
maintainability of our applications, it also improves the performance!</p>
<h3 id="side-quest-updates-to-pyramid">Side quest: updates to pyramid</h3>
<p>The fragment support discussed above motivated some changes in the underlying
<a href="https://github.com/lilactown/pyramid">pyramid</a> library, which exo uses to
normalize data before adding to the cache, and querying the cache using EQL.
I&rsquo;ll briefly note them because they enabled me, as a single developer, to build
the functionality in a month. Frome the <a href="https://github.com/lilactown/pyramid/blob/356d8fbd0665a638a6dae0ecf011bfdd0bc3c12a/CHANGELOG.md">CHANGELOG</a>:</p>
<ul>
<li>New pyramid.core/identify function which takes a DB and entity map and returns the lookup ID of the map if it were added to the DB.</li>
<li>New visitor pattern support</li>
</ul>
<p><em>Visitor pattern</em>: you can now annotate parts of an EQL query with
<code>{:visitor (fn visit [db data] ,,,)}</code> metadata, which will replace the location
with the return value of the visit function in the final result of the pull or
pull-report call.</p>
<p>It is similar to doing a postwalk on the results of pull or pull-report, but is
done in the same pass as pulling data out of the DB - so less traversals - and
annotated directly on the query.</p>
<p>The pyramid README was also rewritten to reflect many of the updates that have
been made to it in the last few months. Check it out!</p>
<h2 id="project-clojupedia-adam-helinski">Project: Clojupedia, Adam Helinski</h2>
<p>The first phase of this grant achieved the following goals:</p>
<ul>
<li>Improve visuals and CSS theme</li>
<li>Purchase and configure the <a href="https://clojupedia.org">clojupedia.com</a> domain</li>
<li>Automate website building and deploymenht</li>
<li>Update to new <a href="https://github.com/logseq/logseq">Logseq</a> version
<ul>
<li>Fix issues related to page properties, page hierarchies, and queries</li>
</ul>
</li>
<li>Improve and finalize the structure of the project</li>
<li>Enforce project structure with re-usable page templates</li>
<li>Improve browsing by providing simple queries on relevant pages</li>
<li>Improve overall documentation</li>
</ul>
<p>Clojupedia is now ready for listing Clojure applications and libraries with rich
linking. In write-mode, users can quickly write custom simple queries for searching
projects jointly by platforms, themes, and type (e.g. find a Datalog library
supporting the browser).</p>
<p>The second phase will focus on:</p>
<ul>
<li>Add more content, libraries and applications, now that the structure is finalized</li>
<li>Add support for listing upcoming Clojure events</li>
<li>Add a sponsor page</li>
<li>Prepare a talk for announcing Clojupedia at the Dutch Clojure Days on October 29th</li>
<li>Best-effort for creating a logo</li>
</ul>
<p>&ndash;</p>
<p><a href="https://github.com/clojupedia/clojupedia.org">Repository</a>
<a href="https://github.com/logseq/logseq">Website</a></p>
<h2 id="project-biff-jacob-obryant">Project: Biff, Jacob O&rsquo;Bryant</h2>
<ul>
<li>
<p>Investigated existing frameworks for documentation websites. Decided to
write the docs website from scratch.</p>
</li>
<li>
<p>Created the new <a href="https://biffweb.com/docs/get-started/intro/">docs section</a>
of the Biff website and migrated all the existing documentation there.
Previously I used <a href="https://github.com/slatedocs/slate">Slate</a> for the
reference docs and <a href="https://github.com/weavejester/codox">Codox</a> for the API
docs. Now that I&rsquo;m using custom code, the documentation looks like it&rsquo;s
actually part of the Biff website, I&rsquo;m able to fine-tune it to Biff&rsquo;s needs,
and it&rsquo;ll be easy for me to add new sections (like a section for the
tutorial, which will come between the &ldquo;Get Started&rdquo; and &ldquo;Reference&rdquo;
sections on the sidebar).</p>
</li>
<li>
<p>Made a batch of updates to Biff&rsquo;s code
<a href="https://github.com/jacobobryant/biff/releases">releases v0.5.0 - v0.5.3</a>.
This isn&rsquo;t part of my Clojurists Together-funded work since it wasn&rsquo;t
documentation, but I mention it because it was a prerequisite to starting on
the build-your-own-forum tutorial. (Whenever I start a new project, I like to
get any pending code updates into Biff first.)</p>
</li>
<li>
<p>Wrote up some <a href="https://forum.tfos.co/t/forum-chat-app-plans/51">design notes</a>
for the forum tutorial.</p>
</li>
</ul>
<p>With all that out of the way, I&rsquo;m now ready to actually start writing the
tutorial. This will happen mostly in November since I&rsquo;ll be on paternity leave
starting next week.</p>
<p>As an aside, two people have asked me in the past week about tutorials for
Biff, and it&rsquo;s been nice to say that I have one coming soon!</p>
<p>A few people have also asked about video tutorials&ndash;it occurs to me that it
wouldn&rsquo;t be hard to record myself working through the tutorial once it&rsquo;s
complete, so maybe I&rsquo;ll manage to do that in November as well.</p>
<h2 id="project-mariacloud-matt-huebert">Project: Maria.cloud, Matt Huebert</h2>
<p>This is my second update for the Fall/2022 funding of Maria.cloud by ClojuristsTogether.</p>
<p>Work has progressed well overall, with most of Maria’s original curriculum now rendering nicely in the new editor. Highlights include:</p>
<ul>
<li>The <strong>Cells</strong> library has been re-implemented to work in sci.</li>
<li>A large portion of Maria’s <strong>value viewing</strong> behaviour has been implemented, including views for shapes and cells.
<ul>
<li>TODO: The plan is to bring in <a href="https://github.com/nextjournal/clerk">Clerk</a>’s viewer code into Maria so that we can use all of Clerk’s <a href="https://github.clerk.garden/nextjournal/book-of-clerk/commit/70d0459fbe941e689e0c2e7df0afc887eaf5900b/#%F0%9F%94%8D_viewers">built-in viewers</a>, and any custom viewers built for Clerk would also work in Maria.</li>
</ul>
</li>
<li>I’ve added support for top-level <code>await</code> so that evaluation can pause for blocks that must complete before the rest of the document can run. Vars are handled as a special case, so that one can <code>await</code> the value of a <code>def</code> form.
<ul>
<li>TODO: implement an <code>async-load-fn</code> for sci as described <a href="https://github.com/babashka/sci/blob/master/doc/async.md">here</a> so that users can import arbitrary js deps and lazy-load ClojureScript namespaces.</li>
</ul>
</li>
<li><strong>Namespace lookup</strong> When evaluating within a code block, we determine the current namespace by moving “up” from the node until we find an evaluated ns form (defaulting to <code>user</code>). The alternative (default) behaviour would be to use the namespace from the REPL’s internal state, which is more likely to confuse users who are looking at a document as a top-to-bottom flow.</li>
<li><strong>Namespaces in curriculum</strong>: all Maria docs will now include an <code>ns</code> form instead of the previous behaviour of having lots of built-in tools in scope automatically.</li>
<li><strong>doc/arglists coverage</strong> was improved, by <a href="https://github.com/babashka/sci/pull/827">fixing this in sci</a></li>
<li>Implemented the <strong>eldoc</strong> feature for seeing docs/arglists for the current operation</li>
<li>Implemented UI for editing links and images via a tooltip within prose blocks</li>
</ul>
<p>For more details see the <a href="https://github.com/mhuebert/maria/commits/main">commit log</a>.</p>
<p>Thanks again to <a href="https://www.clojuriststogether.org">ClojuristsTogether</a> for supporting this work!</p>
<p>Remaining high-priority tasks include:</p>
<ul>
<li>Command palette (needs to handle ProseMirror, CodeMirror, hybrid &amp; other commands)</li>
<li>Curriculum (integration into UI / sidebar)</li>
<li>Persistence (local storage and publishing to GitHub gists)</li>
<li>Error messages (a lot of the original code for this won’t work now that we’ve changed the evaluator)</li>
</ul>
<h2 id="project-clj-kondo-and-related-michiel-borkent">Project: Clj-kondo and related, Michiel Borkent</h2>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>The first <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#10164-2022-10-17">1.0 release</a> was released!</li>
<li>Optimizations for <code>let</code> (in SCI) which is now up to 8x faster.</li>
<li>Many small improvements. See the <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">changelogs</a>.</li>
</ul>
<h3 id="squinthttpsgithubcomsquint-cljssquint-and-cherryhttpsgithubcomsquint-cljscherry"><a href="https://github.com/squint-cljs/squint">Squint</a> and <a href="https://github.com/squint-cljs/cherry">Cherry</a></h3>
<p>Squint and cherry are two flavors of the same CLJS compiler.</p>
<p>Squint is a CLJS <em>syntax</em> to JS compiler for use case where you want to write JS, but do it using CLJS syntax and tooling instead. Squint comes with a standard library that resembles CLJS but is built on bare JS ingredients. As such, squint comes with the usual JS caveats, but we can still have our parens and enjoy a slim bundle size.</p>
<p>Cherry comes with the CLJS standard library and is as such much closer to the normal ClojureScript, but the minimal amount of JS is a little bigger.</p>
<p>I&rsquo;ve working on unifying the compiler code of cherry and squint into one code base, which is still in progress. I&rsquo;ve also worked on REPL code.</p>
<p>I&rsquo;ve also given a <a href="https://twitter.com/borkdude/status/1586662315805450240">presentation on squint and cherry</a> at the <a href="https://clojuredays.org/">Dutch Clojure Days</a>. The video will appear online in the future!</p>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>Static analyzer and linter for Clojure code that sparks joy</p>
<p>Two new releases with many fixes and improvements. <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Check the changelogs</a> for details.</p>
<p>Among several new linters, there is a new <code>:unused-value</code> linter which detects unused values, which is particularly helpful for detecting unused transient operation results which can lead to bugs.</p>
<h3 id="clj-kondo-configshttpsgithubcomclj-kondoconfigs"><a href="https://github.com/clj-kondo/configs">Clj-kondo configs</a></h3>
<p>Library configurations as dependencies for clj-kondo.</p>
<p>The idea of this repository is that you can add configuration for libraries as a dependency to your <code>deps.edn</code> or <code>project.clj</code>. If you invoke the right command or if you are using Clojure LSP, then the configuration is written into your <code>.clj-kondo</code> directory and clj-kondo will understand custom constructs in your library. Normally you can provide these configurations as part of your library, but this is not always an option, so the remaining configurations can live over here.</p>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p>Configurable Clojure interpreter suitable for scripting and Clojure DSLs.</p>
<p>This is the workhorse that powers babashka, nbb, Joyride, and many other projects.</p>
<p>Several bugfixes and enhancements were made in the last two months in two new releases. Performance of <code>let</code> bindings are now up to 8x faster, as already mentioned in the babashka entry of this post.</p>
<p>See <a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md">changelogs</a> for more details.</p>
<h3 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h3>
<p>Scripting in Clojure on Node.js using SCI</p>
<p>The first 1.0 version was released.</p>
<p>Many small bugfixes and improvements in the last two months. See <a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">changelogs</a>.</p>
<h3 id="clj-yamlhttpsgithubcomclj-commonsclj-yaml"><a href="https://github.com/clj-commons/clj-yaml">Clj-yaml</a></h3>
<p>In the past two month, I became one of the maintainers, together with <a href="https://github.com/lread">@lread</a>, of <a href="https://github.com/clj-commons/clj-yaml">clj-yaml</a>. Clj-yaml is a built-in library of babashka.</p>
<h3 id="depscljhttpsgithubcomborkdudedepsclj"><a href="https://github.com/borkdude/deps.clj">Deps.clj</a></h3>
<p>A faithful port of the clojure CLI bash script to Clojure</p>
<p>A lot of Windows improvements in the last two months. Deps.clj is now also available as part of an <a href="https://github.com/casselc/clj-msi/releases">MSI installer</a> that installs <code>deps.exe</code> as <code>clj.exe</code>. This installer might form the basis for an official Clojure MSI installer.</p>
<h3 id="gh-release-artifacthttpsgithubcomborkdudegh-release-artifact"><a href="https://github.com/borkdude/gh-release-artifact">Gh-release-artifact</a></h3>
<p>Upload artifacts to Github releases idempotently</p>
<p>This tool has been in use within babashka, clj-kondo and other projects to automate uploading release artifacts from various CI systems to Github releases, idempotently. It is now open source and ready to be used by others.</p>
<h3 id="jethttpsgithubcomborkdudejet"><a href="https://github.com/borkdude/jet">Jet</a></h3>
<p>CLI to transform between JSON, EDN, YAML and Transit, powered with a minimal query language.</p>
<p>The latest release adds support for YAML (by using clj-yaml), thanks to <a href="https://github.com/qdzo">@qdzo</a>.</p>
<h3 id="babashka-clihttpsgithubcombabashkacli"><a href="https://github.com/babashka/cli">Babashka CLI</a></h3>
<p>Turn Clojure functions into CLIs!</p>
<p>See <a href="https://github.com/babashka/cli/blob/main/CHANGELOG.md">changelogs</a>.</p>
<h3 id="processhttpsgithubcombabashkaprocess"><a href="https://github.com/babashka/process">Process</a></h3>
<p>Clojure library for shelling out / spawning subprocesses</p>
<p>Minor updates and fixes. See <a href="https://github.com/babashka/process/blob/master/CHANGELOG.md">changelogs</a>.</p>
<h3 id="quickdochttpsgithubcomborkdudequickdoc"><a href="https://github.com/borkdude/quickdoc">Quickdoc</a></h3>
<p>Quickdoc is a tool to generate documentation from namespace/var analysis done by clj-kondo. It&rsquo;s fast and spits out an <code>API.md</code> file in the root of your project, so you can immediately view it on Github. It has undergone significant improvements in the last two months. I&rsquo;m using quickdoc myself in several projects. In the last two months, there have been improvements in the table of contents linking and linking to source code.</p>
<h3 id="fshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure.</p>
<p>Minor updates and fixes. See <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md#changelog">changelogs</a>.</p>
<h3 id="carvehttpsgithubcomborkdudecarve"><a href="https://github.com/borkdude/carve">Carve</a></h3>
<p>Carve out the essentials of your Clojure app by removing unused vars</p>
<p>Version 0.2.0 was released, after a long hiatus, with an updated version of clj-kondo and some minor fixes.</p>
<h3 id="grasphttpsgithubcomborkdudegrasp"><a href="https://github.com/borkdude/grasp">Grasp</a></h3>
<p>Grep Clojure code using clojure.spec regexes.</p>
<p>I use this tool to analyze code patterns to make informed choices for e.g. SCI and clj-kondo. E.g. see <a href="https://github.com/borkdude/grasp/blob/master/examples/let_bindings.clj">this</a> example that shows how many let bindings are typically used. See the example in action <a href="https://twitter.com/borkdude/status/1582320503049826304">here</a>.</p>
<p>A new version was released with minor fixes.</p>
<h3 id="rewrite-ednhttpsgithubcomborkduderewrite-edn"><a href="https://github.com/borkdude/rewrite-edn">Rewrite-edn</a></h3>
<p>Utility lib on top of rewrite-clj with common operations to update EDN while preserving whitespace and comments.</p>
<p>Minor fixes and enhancements. Repeated usage of <code>assoc</code> is now a safe operation. Thanks to <a href="https://github.com/lread">@lread</a> for the improvements.</p>
<h3 id="lein2depshttpsgithubcomborkdudelein2deps"><a href="https://github.com/borkdude/lein2deps">lein2deps</a></h3>
<p>Lein to deps.edn converter</p>
<p>This new little tool can convert a <code>project.edn</code> file to a <code>deps.edn</code> file. It even supports Java compilation and evaluation of code within <code>project.clj</code>.</p>
<h3 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h3>
<p>A CLI to add common aliases and features to <code>deps.edn</code>-based projects.</p>
<p>Neil now comes with a <code>dep upgrade</code> command, thanks to <a href="https://github.com/teodorlu">@teodorlu</a> and <a href="https://github.com/russmatney">@russmatney</a>, together with other improvements.</p>
<h3 id="respecedhttpsgithubcomborkduderespeced"><a href="https://github.com/borkdude/respeced">Respeced</a></h3>
<p>Finally, after 4 years, a new release of respeced, a testing library for clojure.spec fdefs.</p>
<h3 id="quickbloghttpsgithubcomborkdudequickblog"><a href="https://github.com/borkdude/quickblog">Quickblog</a></h3>
<p>Light-weight static blog engine for Clojure and babashka</p>
<p>Small improvements. See <a href="https://github.com/borkdude/quickblog/blob/main/CHANGELOG.md#changelog">changelog</a>. The blog you&rsquo;re currently reading is made with quickblog.</p>
<h3 id="sciconfigshttpsgithubcombabashkasciconfigs"><a href="https://github.com/babashka/sci.configs">Sci.configs</a></h3>
<p>A collection of ready to be used SCI configs</p>
<p>Added a <code>doseq</code> macro in <a href="https://github.com/funcool/promesa">promesa</a> which also is available via this configuration. Sci.configs is used in <a href="https://github.com/nextjournal/clerk">Clerk</a>, <a href="https://github.com/babashka/nbb">nbb</a>, <a href="https://github.com/BetterThanTomorrow/joyride/">Joyride</a> and other SCI-based CLJS projects.</p>
<h2 id="project-mathbox-cljs-sam-ritchie">Project: Mathbox-cljs, Sam Ritchie</h2>
<h3 id="overview-1">Overview</h3>
<p>I realized at the beginning of October that Mathbox would be much more useful as
an embeddable notebook component if it were paired with</p>
<ul>
<li>Some UI-based, non-code way to tweak and explore a visualization</li>
<li>An equation editor, so users could write math in a WSIWYG style without
necessarily having to read S-expressions</li>
</ul>
<p>Sam Zhang&rsquo;s <a href="https://sam.zhang.fyi/2020/10/29/curve-shortening/">&ldquo;Curve
Shortening&rdquo;</a> essay is an
excellent example. This essay opens with a JSXGraph interactive component on the
left and a Mathbox view on the right. The shape of the essay is defined by code,
but the reader can explore in a number of author-defined dimensions without
digging into the code.</p>
<p>My goal for the project was to produce a number of libraries:</p>
<ul>
<li><code>mathbox.cljs</code></li>
<li><code>sicmutils-mathbox</code></li>
<li><code>sicmutils-clerk</code></li>
</ul>
<p>Into this mix I&rsquo;m adding as goals:</p>
<ul>
<li><code>jsxgraph.cljs</code> and <code>jsxgraph-clerk</code>, exposing the amazing
<a href="http://jsxgraph.org/wp/index.html">JSXGraph</a> library to Clojurescript with a
Reagent based interface</li>
<li><code>mathlive.cljs</code> and <code>mathlive-clerk</code>, which does the same thing for the
<a href="https://cortexjs.io/compute-engine/demo/">Mathlive equation editor</a>.</li>
</ul>
<p>As I&rsquo;ll detail below, I&rsquo;ve got the core pieces of these two new libraries
working, though not yet released as their own libraries.</p>
<h3 id="mathbox">Mathbox</h3>
<p>I&rsquo;ve built out a library called
<a href="https://github.com/sicmutils/sicmutils-clerk">sicmutils-clerk</a> with many
experiments and ports of Mathbox examples, all living inside
<a href="https://github.com/nextjournal/clerk">Clerk</a> (see the <a href="https://github.com/sicmutils/sicmutils-clerk/tree/main/src">namespaces
here</a>, and the
<a href="https://github.com/sicmutils/sicmutils-clerk">README.md</a> for instructions on
how to run this code). I&rsquo;m using these experiments to work with the Clerk team
on the problem of how to synchronize state between client and server, so that
the server can keep track of the state of some running animation, for example,
and send it across the wire to a collaborator.</p>
<h3 id="jsxgraph">JSXGraph</h3>
<ul>
<li>
<p>Converted the 65kloc <a href="https://github.com/jsxgraph/jsxgraph">JSXGraph project</a>
over to ES6 modules from its old Clojurescript-incompatible AMD build. (The
library author was receptive to the idea and has merged in a bunch of work
here, for which I am very grateful)</p>
<ul>
<li>Discussion: <a href="https://github.com/jsxgraph/jsxgraph/issues/464">https://github.com/jsxgraph/jsxgraph/issues/464</a></li>
<li>8 PRs: <a href="https://github.com/jsxgraph/jsxgraph/pulls?q=is%3Apr+author%3Asritchie+">https://github.com/jsxgraph/jsxgraph/pulls?q=is%3Apr+author%3Asritchie+</a></li>
</ul>
</li>
<li>
<p>Added Github Actions, code formatting via Prettier, lots of nice improvements
to the main project&rsquo;s dev experience.</p>
</li>
<li>
<p>Published my own temporary Clojurescript compatible build here:
<a href="https://www.npmjs.com/package/@mentatcollective/jsxgraph">https://www.npmjs.com/package/@mentatcollective/jsxgraph</a></p>
</li>
</ul>
<p>I&rsquo;ve been building out the bones of the Clojurescript wrapper in the
<a href="https://github.com/sicmutils/sicmutils-clerk">sicmutils-clerk</a> library. I have
a working Reagent wrapper for JSXGraph. The library is very mutable, but the
wrapper lets you build scenes declaratively.</p>
<ul>
<li>
<p>Demo of a scene pushing state to a Reagent atom inside of a <a href="https://github.com/nextjournal/clerk">Clerk
notebook</a>:
<a href="https://twitter.com/sritchie/status/1585765084554412032,">https://twitter.com/sritchie/status/1585765084554412032,</a> <a href="https://github.com/sicmutils/sicmutils-clerk/blob/0c130a5e792452e32e633c963348d6d517be85da/src/jsxgraph.clj">code
here</a></p>
</li>
<li>
<p>Port of a complex JSXGraph demo:
<a href="https://twitter.com/sritchie/status/1586057171111845888,">https://twitter.com/sritchie/status/1586057171111845888,</a> with <a href="https://github.com/sicmutils/sicmutils-clerk/blob/0c130a5e792452e32e633c963348d6d517be85da/src/circles.clj">code
here</a></p>
</li>
</ul>
<h3 id="mathlive">Mathlive</h3>
<p>Chris Chudzicki is my collaborator on mathbox-react, and the author of the
Mathbox-based math3d.org. He has adopted
<a href="https://github.com/arnog/mathlive">Mathlive</a> as his equation editor and I&rsquo;m
following his lead.</p>
<p>Mathlive lets the user type LaTeX into a UI element, and then parses the LaTeX
into a format called MathJSON. In October, I:</p>
<ul>
<li>
<p><a href="https://github.com/sicmutils/sicmutils-clerk/blob/0c130a5e792452e32e633c963348d6d517be85da/src/demo/mathlive.cljs">Built a Reagent wrapper around the stateful Mathfield component</a></p>
</li>
<li>
<p>Wrote a Mathlive-&gt;CLJ Parser (not complete yet), which of course exposed a
number of bugs in LaTeX parsing. I&rsquo;m working with the project creator to get
these fixed up.</p>
</li>
<li>
<p>Wrote a <a href="https://github.com/nextjournal/clerk">Clerk</a> viewer that updates
shared state with a Clojure representation of the equation that the user is
typing.</p>
</li>
</ul>
<p>What is great about this is that the output is compatible with SICMUtils, so I
can run simplification on the output and re-render it as TeX, live in the Clerk
notebook.</p>
<p>Here is a demo of that code:
<a href="https://twitter.com/sritchie/status/1582475087621390336">https://twitter.com/sritchie/status/1582475087621390336</a></p>
<h3 id="next">Next</h3>
<p>This month was about making sure that each these components could actually work
and communicate state via Reagent atoms.</p>
<p>Next, I&rsquo;ll extract these viewers and Reagent wrappers out from sicmutils-clerk
into separate libraries. I&rsquo;m going to use Clerk to document the libraries, like
Matt Huebert did with his <a href="https://inside-out.matt.is/">interactive documentation for the inside-out forms
library</a>.</p>
<p>Then I&rsquo;ll work on a layer that is aware of all three of these components. This
will allow users to write some notebook that, for example:</p>
<ul>
<li>lets you set parameters for a simulation by moving points around a JSXGraph scene</li>
<li>see the simulation in an explorable Mathbox window</li>
<li>change the model behind the simulation by editing the equations in the equation editor</li>
<li>PUBLISH the whole thing as an interactive blog post or research papge.</li>
</ul>
<p>and the rest of the notebook exploring the simulation will live-update on any of
these changes.</p>
<p>Onward!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together 2022 board nominations and annual members meeting</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-2022-board-nominations-and-annual-members-meeting/</link>
      <pubDate>Fri, 14 Oct 2022 21:00:00 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-2022-board-nominations-and-annual-members-meeting/</guid>
      <description>Stand for the upcoming Clojurists Together board elections</description>
      <content:encoded><![CDATA[<p>Clojurists Together is having our second board elections, and our second annual members meeting.</p>
<h3 id="key-dates">Key dates</h3>
<p>(All dates are EOD, in Pacific Time)</p>
<ul>
<li>Board nominations close: October 31st, 2022</li>
<li>Voting opens: a few days after submissions close and the board has nominated candidates</li>
<li>Voting closes: November 18th, 2022</li>
<li>Annual members meeting: <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+members+meeting&amp;iso=20221129T09&amp;p1=224&amp;ah=1">9am Pacific time, November 29th, 2022</a></li>
</ul>
<h3 id="board-elections">Board Elections</h3>
<p>As part of our commitment to <a href="/transparency/">transparency</a> and community governance, Clojurists Together holds elections for board members. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors.</p>
<p>Committee members are elected for a two-year term. Each election cycle, half of our board seats come up for re-election. This year there are three seats available.</p>
<p>If you are interested in standing for election, please fill out this <a href="https://docs.google.com/forms/d/e/1FAIpQLSd08O4XVHiDl2P2ZsZKvigFj4wwSKRRS7970h69ED9rSozKsQ/viewform">form</a> by <strong>October 31st, 2022 Pacific Time</strong>. If you can&rsquo;t access the form, <a href="/contact/">contact us</a>, and we can accept your nomination by email. Nominations are open to anyone, you don&rsquo;t have to be a Clojurists Together member to stand for election. Our bylaws do require you to be a member if elected to the board, though we provide a stipend which offsets the cost of your membership.</p>
<p>You don&rsquo;t have to have lots of experience with Clojure to apply. We want a committee made up of a cross-section of the Clojure community so that we have a wide range of perspectives when making decisions on which projects to fund.</p>
<p>As part of the nomination, if we get more than 12 candidates for board membership, the board will nominate no more than 12 candidates. Our bylaws state:</p>
<blockquote>
<p>The Board shall nominate no more than 12 candidates seeking board membership in any given election. In nominating candidates for Director positions and in choosing the number of candidates to nominate overall, the Board shall use reasonable efforts to maintain a Board composition consisting of at least: (1) 25% female Directors, (2) 25% non-Caucasian Directors, and (3) 35% from any category(ies) of persons (e.g., race, gender, ability) commonly considered to have suffered from discrimination at some time and then-currently under-represented in the technology industry, in each case as determined by the Board in its reasonable discretion.</p>
</blockquote>
<p>The main responsibilites of a committee member are:</p>
<ul>
<li>Participate in the general discussions of the month-to-month running of the program</li>
<li>Evaluate and vote on which open source projects to fund</li>
<li>Help in decision making for the future plans of Clojurists Together</li>
</ul>
<p>These responsibilities take roughly one hour/month, though there are peaks and troughs of activity as we go through our quarterly funding cycle. If you have more time to offer, there are lots more things that need developing, automating, designing, e.t.c. It would be great to have you help out with those things, but we don&rsquo;t want to exclude people from standing because they don&rsquo;t have a lot of spare time.</p>
<p>Our bylaws requires that we do not have more than two committee members from any one company. More than two people from a company can stand for election, but if more than two of these people were to be elected, only the top two ranked candidates would be elected and the other seats would go to the next most highly ranked candidates from other companies. If you have any questions about this, please get in touch.</p>
<p>Elections will be held once the candidates are announced, and all Clojurists Together members will be eligible to vote.</p>
<h3 id="annual-members-meeting">Annual Members Meeting</h3>
<p>We are also holding our second members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+members+meeting&amp;iso=20221129T09&amp;p1=224&amp;ah=1">9am Pacific time, November 29th, 2022</a>. This will be an opportunity for Clojurists Together to talk about how things have been going, share information on our future plans, present the new board members, and most importantly take questions from members.</p>
<p>More details on this will follow including a videoconferencing link.</p>
<p>Please share this with anyone you think would be able to represent the interests of the Clojure community and Clojurists Together members. Thanks for your support of Clojurists Together, we appreciate it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together Long-Term Funding for 2022-2023</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-long-term-funding-for-2022-2023/</link>
      <pubDate>Fri, 14 Oct 2022 11:50:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-long-term-funding-for-2022-2023/</guid>
      <description>Clojurists Together is going to fund 10 developers $1.5k/month for 12 months</description>
      <content:encoded><![CDATA[<p>Last year, Clojurists Together introduced a new funding type, <a href="/news/long-term-funding-selections/">long-term funding</a>. The goal of this funding was to:</p>
<ul>
<li>Give developers a predictable base of long-term funding to let them continue the excellent open-source work they&rsquo;ve already been doing.</li>
<li>Give developers money with fewer &ldquo;strings attached&rdquo;. The grant is not tied to a particular project; we think developers can do great things when they are <a href="https://mobile.twitter.com/patrickc/status/1428166730426191877">free to work on whatever seems most promising to them</a>, especially over a long period.</li>
<li>Give members direct influence over who gets funded.</li>
</ul>
<h2 id="last-year">Last year</h2>
<p>We gave seven developers $1,500 USD/month for 12 months, supported by our members.</p>
<ul>
<li>Bozhidar Batsov</li>
<li>Michiel Borkent</li>
<li>Dragan Djuric</li>
<li>Thomas Heller</li>
<li>David Nolen</li>
<li>Nikita Prokopov</li>
<li>Toby Crawley</li>
</ul>
<p>These developers all did incredible work over the last year, and we were happy to be able to fund them. You can view the work they did in their monthly updates over the previous year, <a href="/news/september-2022-monthly-update/">including their most recent updates</a>.</p>
<h2 id="nominations">Nominations</h2>
<p>We&rsquo;re now looking to do a second round of long-term funding. Thanks to Clojurists Together continued support from the Clojure community, we are going to be <strong>funding ten developers or teams USD 1,500/month for 12 months</strong>. Like last year, Clojurists Together members will be sent a voting form to select the developers they&rsquo;d like to fund. This year, we&rsquo;re also accepting nominations for teams of people who work on open source together. This could be as part of a company, or just a group of people who work on open source projects together.</p>
<p>All Clojurists Together members will receive an email to nominate Clojure developers/teams. We will be accepting nominations until <strong>23 October, 2022</strong>. We will then send out a voting form to all members to vote on the developers/teams they&rsquo;d like to fund.</p>
<h2 id="thanks">Thanks</h2>
<p>A special thanks to all of our members who have made this possible, in particular Latacora, Roam Research, Whimsical, Stylitics, AppsFlyer, Pitch, Nubank, Cisco, Logseq, JUXT, Metosin, Solita, Adgoji, Nextjournal, ClojureStream, Shortcut, Flexiana, Toyokumo, doctronic, and 180° Seguros. We couldn&rsquo;t do this without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>September 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/september-2022-monthly-update/</link>
      <pubDate>Mon, 10 Oct 2022 16:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/september-2022-monthly-update/</guid>
      <description>Read updates about Maria.cloud, Tablecloth and the final updates from our Q3 2021 long term projects with Bozhidar Batsov, Michiel Borkent, Dragan Djuric, Thomas Heller, and Nikita Prokopov.</description>
      <content:encoded><![CDATA[<h2 id="project-mariacloud-matt-huebert">Project: Maria.cloud, Matt Huebert</h2>
<p>We’re excited to announce that I (<a href="https://twitter.com/mhuebert">Matt</a>) have received a three-month grant from <a href="https://www.clojuriststogether.org">ClojuristsTogether</a> to work on <a href="https://www.maria.cloud">Maria.cloud</a>. This is the first of three monthly updates.</p>
<h3 id="what-is-maria">What is Maria?</h3>
<p>Maria combines carefully written curriculum with a clean, no-install editor. It is designed to introduce complete beginners to fundamental ideas of programming, with an editing environment that encourages REPL-driven development and structural editing from day one. It has been widely appreciated as a good tool for introducing Clojure to beginners and used at several workshops like ClojureBridge.</p>
<h3 id="what-did-we-propose">What did we propose?</h3>
<p><em>We built Maria 5 years ago and would like to bring it back into active development, starting with a refactor/simplification of the core of the editor so that we have a good base to build on top of.</em></p>
<p><em>Top priorities would be (1) replace the selfhost compiler with sci for a more lightweight runtime, (2) replace the code editor with CodeMirror 6 using the cm6 clojure mode I wrote last year for Nextjournal, (3) upgrade to latest version of ProseMirror, (4) add a &ldquo;publish&rdquo; feature so that people can share what they make with the world. This funding may not cover all of the work listed above, so we&rsquo;ll remain open to receiving funds from elsewhere. This would be the first funding we have ever taken for this project.</em></p>
<h3 id="what-are-some-benefits-of-these-changes">What are some benefits of these changes?</h3>
<ul>
<li>
<p>Using <a href="%5Burl%5D(https://github.com/babashka/sci)">sci</a> instead of ClojureScript’s self-hosted compiler should dramatically reduce the bundle size and speed up Maria on mobile/old/slow devices.</p>
</li>
<li>
<p>Using Nextjournal’s <a href="https://github.com/nextjournal/clojure-mode">clojure-mode</a> means we depend on a community-supported &amp; standard structural editor and I can delete my own old unmaintained implementation.</p>
</li>
<li>
<p>Using <a href="https://prosemirror.net">ProseMirror</a> to manage a single toplevel doc means we can leverage tools in the ProseMirror ecosystem for new features, eg. <a href="https://github.com/yjs/y-prosemirror">yjs-prosemirror</a> for real-time collaboration, and I can delete my own old unmaintained Clojure parser and block system.</p>
</li>
<li>
<p>Keybindings should be more reliable/stable.</p>
</li>
<li>
<p>The Maria codebase should be smaller and easier to work with.</p>
</li>
</ul>
<h3 id="what-has-been-achieved-so-far">What has been achieved so far?</h3>
<p>Progress is automatically deployed to <a href="https://2.maria.cloud">https://2.maria.cloud</a> on every push to <code>main</code>. So far I’ve implemented:</p>
<ul>
<li>A ProseMirror view which renders code blocks using CodeMirror 6 with clojure-mode.</li>
<li>Conversion of Clojure source files into Markdown which can be managed by ProseMirror, and a reverse step to convert Markdown back to Clojure. (This is an inversion of top-level forms - when in “markdown mode”, comments are treated as prose and code is wrapped in fenced code blocks.)</li>
<li>A sci context that includes Maria’s shapes library</li>
<li>The REPL tools <code>doc</code> and <code>dir</code></li>
<li>Evaluating selections, blocks, and entire docs via hotkeys</li>
<li>Showing results next to code, with rendering support for shapes</li>
</ul>
<p>The editor itself is a nuanced, fidgety thing which requires a lot of careful attention to get right.</p>
<h3 id="next-steps">Next steps</h3>
<ul>
<li>Bring in Maria’s value-viewer code</li>
<li>Support the cells library</li>
<li>Test &amp; support remaining curriculum</li>
<li>Figure out how to integrate ProseMirror/CodeMirror keymaps with Maria’s command bar and “which-key” features</li>
<li>Integrate or re-implement Maria’s auth &amp; persistence features</li>
</ul>
<h3 id="ancillary-tools-aka-the-scenic-route">Ancillary tools (aka the scenic route)</h3>
<p>In the course of this work I’ve also spent time on a couple of support tools.</p>
<p>In <a href="https://github.com/applied-science/js-interop">js-interop</a> I’m working on a <code>j/js</code> macro, which is like a “deep” version of <code>j/lit</code>, meaning that literals become JavaScript data structures ({} =&gt; object, [] =&gt; array, keywords =&gt; strings), and destructuring forms in let/fn/defn are treated as js by default. Literals identified as belonging to Clojure proper or tagged ^:clj are not touched. This was inspired by <a href="https://twitter.com/borkdude">@borkdude’s</a> experiments in <a href="https://github.com/squint-cljs">new cljs compilers</a>. <code>j/js</code> can make interop-heavy code easier to read and write but is not without tradeoffs; one needs to be extra-aware of whether one is looking at code in a “js” or “clj” context. It was particularly helpful in writing code related to ProseMirror/CodeMirror. I&rsquo;m quite sure I want something like this to exist but the API/behaviour remains in flux. See the <a href="https://github.com/applied-science/js-interop/pull/32">PR</a>.</p>
<p>I’ve resumed work on <a href="https://github.com/mhuebert/yawn">yawn</a>, a hiccup compiler/interpreter that targets React. I was planning to stick with Reagent but it lacks a protocol that would enable custom rendering of arbitrary types, which we need for our viewers (eg. to render shapes properly). Yawn is designed with performance in mind and processes hiccup forms at compile-time where possible. It is REPL-friendly via support for react-refresh, so re-evaluating a view will immediately update on-screen while preserving state &amp; without re-rendering from root.</p>
<h3 id="the-end">The end</h3>
<p>Thanks again to Clojurists Together &amp; all its supporters for making this work possible!</p>
<h2 id="project-tablecloth-ethan-miller">Project: Tablecloth, Ethan Miller</h2>
<p>This is the update for my &ldquo;Column for Tablecloth&rdquo;
project, which has been generously funded by <a href="https://clojuriststogether.com/">Clojurists
Together</a>. The goal of this project &ndash;
explained in more detail in my <a href="https://humanscode.com/columns-for-tablecloth-i">first
update</a> &ndash; is to give
the <code>column</code> a presence within the data processing library
<a href="https://github.com/scicloj/tablecloth">Tablecloth</a>. In other words, by
the end of the project, users of Tablecloth should be able to interact
exclusively with a <code>column</code> using functions that generally take a column
and return a column: <code>(column argx argy) =&gt; column</code>.</p>
<p>Over the past three months, I developed some conversation about the
project within the online Clojure and
<a href="https://twitter.com/scicloj">Scicloj</a> communities and on a piece of
unexpected work: the datatype API for Tablecloth columns. These two
efforts haven&rsquo;t necessarily overlapped, but they&rsquo;ve certainly been
mutually reinforcing. I&rsquo;ll start by discussing the work I&rsquo;ve done on
datatypes.</p>
<h3 id="checking-datatypes-on-the-api">Checking Datatypes on the API</h3>
<p>The work on datatypes came out of my <a href="https://github.com/scicloj/tablecloth/pull/71">first
PR</a> for this project,
which established the new <code>tablecloth.column.api</code> namespace and added a
few key functions to get things rolling. One of the functions I added
was <code>typeof</code> &ndash; inspired by R&rsquo;s function of the same name &ndash; that
returns the data type of the elements in the column. E.g.:</p>
<pre><code>(typeof (column [1 2 3]))
;; =&gt; :int64
</code></pre>
<p>It turned out that the story about types in Tablecloth, unbeknownst to
me, was a bit more complicated. Unlike tech.ml.dataset, Tablecloth has a
type hierarchy (<a href="https://github.com/scicloj/tablecloth/blob/master/src/tablecloth/api/utils.clj#L56-L67">defined in
tablecloth.api.utils</a>).
So how should <code>typeof</code> work with this hierarchy? Should <code>typeof</code> return
the child or &ldquo;concrete&rdquo; types? (e.g. <code>:int64</code>) or the &ldquo;general&rdquo; type
(e.g. <code>:integer</code>)?</p>
<p>After <a href="https://github.com/scicloj/tablecloth/discussions/73">some
discussion</a> and
experimentation we settled on the following:</p>
<ul>
<li><code>typeof</code> will return the concrete type; and</li>
<li><code>typeof?</code> can confirm the concrete or general type</li>
</ul>
<p>So:</p>
<pre><code>(def mycol (column [1 2 3]))

(typeof mycol)
;; =&gt; :int64

(typeof? mycol :int64)
;; =&gt; true

(typeof? mycol :boolean)
;; =&gt; false

(typeof? mycol :integer)
;; =&gt; true

(typeof? mycol :logical)
;; =&gt; false
</code></pre>
<p>That the focus is on the concrete type with an ability to check the
general type follows the tendency visible in both Python&rsquo;s Numpy and in
R. In both, checking the datatype will yield the concrete type. Both
also have type hierarchies. In Numpy, there&rsquo;s a somewhat clunky function
<code>issubdtype</code> that can be used to check the parent-child relationship; in
R, you can ask: <code>is.numerical</code> or <code>is.logical</code>, etc.</p>
<p>We accomplish something similar to R with just the <code>typeof</code> and
<code>typeof?</code> because we can ask about the concrete type with
<code>(typeof? col :int64)</code> and the general type with
<code>(typeof? col :numerical)</code>. So for now this is the type syntax we
settled on.</p>
<p>The most interesting design decision was whether or not to return the
concrete type or the general type when querying the type of the column.
It is true that this is the behavior of at least two of the main data
processing libraries. So we are in good company. In conversation, Jon
Antony (author of the visualization library
<a href="https://github.com/jsa-aerial/hanami">Hanami</a>, among other things) gave
this further reason for choosing the concrete type:</p>
<blockquote>
<p>FWIW, count me in for returning the concrete type as well. At root
this stuff is (or should be) about performance and when I&rsquo;m checking
types in this context I always want the concrete type. Some extra
&lsquo;higher level&rsquo; stuff might be nice, but likely won&rsquo;t be used
much.<a href="https://humanscode.com/columns-for-tablecloth-ii#fn1">^1^</a>{#fnref1
.footnote-ref}</p>
</blockquote>
<p>I like this reasoning because it is based in a sense of what is useful
in practice. Another reason that occurred to me is that, if we ask for
the type and get back the general type, we are actually throwing away
information. The column elements' types have a concrete type that
provides more information about what they are and how they are stored in
memory. Why throw that away by default?</p>
<p>If the user wants to know the general type of the elements columns, we
will let them ask about that like so:</p>
<pre><code>(-&gt;general-types (typeof (column [1 2 3])))
;; =&gt; #{:integer :numerical}
</code></pre>
<p>That is where we&rsquo;ve landed so far on the datatype API. Please if you
have any comments or questions, reach out and let me know what you
think.</p>
<h2 id="project-with-bozhidar-batsov">Project with Bozhidar Batsov</h2>
<p>Here are the highlights from my Clojure work for the past couple of months:</p>
<ul>
<li><a href="https://metaredux.com/posts/2022/07/10/cider-turns-10.html">CIDER&rsquo;s 10th year anniversary</a></li>
<li><a href="https://github.com/clojure-emacs/inf-clojure/releases/tag/v3.2.0">inf-clojure 3.2.0</a></li>
<li>compliment 0.3.14 (fixes broken Clojars deployment)</li>
<li><a href="https://github.com/clojure-emacs/clojure-mode/releases/tag/v5.15.0">clojure-mode 5.15</a></li>
<li><a href="https://metaredux.com/posts/2022/08/25/nrepl-1-0.html">nREPL 1.0</a></li>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.5.0">CIDER 1.5</a></li>
<li>Small documentation improvements to most projects</li>
<li>I also wrote a few Clojure blog posts for the first time in ages
<ul>
<li><a href="https://batsov.com/articles/2022/07/31/clojure-tricks-replace-in-string/">https://batsov.com/articles/2022/07/31/clojure-tricks-replace-in-string/</a></li>
<li><a href="https://batsov.com/articles/2022/07/31/clojure-tricks-zipping-things-together/">https://batsov.com/articles/2022/07/31/clojure-tricks-zipping-things-together/</a></li>
<li><a href="https://batsov.com/articles/2022/08/01/clojure-tricks-number-to-digits/">https://batsov.com/articles/2022/08/01/clojure-tricks-number-to-digits/</a></li>
</ul>
</li>
<li>I also wrote about <a href="https://metaredux.com/posts/2022/08/25/nrepl-1-0.html">Leiningen adding support for nREPL&rsquo;s Unix sockets</a></li>
</ul>
<p>As usual there are also many things that are in the works and are yet to be released.</p>
<h2 id="project-with-michiel-borkent">Project with Michiel Borkent</h2>
<h3 id="clavascripthttpsgithubcomclavascriptclavascript"><a href="https://github.com/clavascript/clavascript">ClavaScript</a></h3>
<p>This is a new project: a CLJS syntax to JS compiler for the niche use
case where you want to write JS, but do it using CLJS syntax and tooling
instead. ClavaScript comes with a standard library that resembles CLJS
but is built on bare JS ingredients. As such, Clava comes with the usual
JS caveats, but we can still have our parens and enjoy a slim bundle
size!</p>
<h3 id="cherryhttpsgithubcomclavascriptcherry"><a href="https://github.com/clavascript/cherry">Cherry</a></h3>
<p>Cherry is similar to ClavaScript, but it does emit CLJS-compatible code
(with the persistent data structures, etc). The compiler code is almost
identical to Clava's, but with a few tweaks here and there. E.g.
<code>{:a 1}</code> in Clava means: a JS object with a <code>&quot;a&quot;</code> key and <code>1</code> value, but
in cherry, <code>{:a 1}</code> means the same as in CLJS. The goal of both Clava
and Cherry are to reduce friction between CLJS and JS tooling. Both
projects should be considered experimental for now. Challenges in both
Clava and Cherry is the REPL, since both projects compile to ES6 modules
and ES6 module imports are immutable.</p>
<p>On <a href="https://clojuredays.org/">ClojureDays 2022</a> I will give a talk
titled &quot;ClojureScript reimagined&quot; which will shed more light on both
projects.</p>
<h3 id="scittlehttpsgithubcombabashkascittle"><a href="https://github.com/babashka/scittle">Scittle</a></h3>
<p>Execute Clojure(Script) directly from browser script tags via SCI. See
it in <a href="https://babashka.org/scittle/">action</a>.</p>
<p>Scittle received two new plugins: one for <code>promesa.core</code> and one for
<code>cljs.pprint</code>. Also error messages were improved.</p>
<h3 id="babashka-toolboxhttpsbabashkaorgtoolbox"><a href="https://babashka.org/toolbox/">Babashka toolbox</a></h3>
<p>Babashka toolbox is a port of <a href="https://www.clojure-toolbox.com/">Clojure
toolbox</a> and gives an overview of
bb-compatible libraries and projects.</p>
<h3 id="babashka-clihttpsgithubcombabashkacli"><a href="https://github.com/babashka/cli">Babashka CLI</a></h3>
<p>Turn Clojure functions into CLIs!</p>
<p>Several new options have been added: <code>:validate</code>, <code>:require</code>,
<code>:restrict</code>. Also error handling was made more flexible.</p>
<p>Babashka CLI proper is now part of babashka. Also see my blog posts
about it:</p>
<ul>
<li><a href="https://blog.michielborkent.nl/babashka-tasks-meets-babashka-cli.html">Babashka tasks meets babashka
CLI</a></li>
<li><a href="https://blog.michielborkent.nl/babashka-cli.html">Babashka CLI: turn Clojure functions into
CLIs</a></li>
</ul>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<ul>
<li>Compatibility with
<a href="https://github.com/metosin/malli#babashka">malli</a></li>
<li><code>-x</code>: a way to execute functions from the command line using
babashka CLI</li>
<li>Many bugfixes and enhancements</li>
</ul>
<h3 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h3>
<p>Scripting in Clojure on Node.js using SCI</p>
<ul>
<li>A new
<a href="https://github.com/babashka/nbb/tree/main/doc/bundle#bundle">bundle</a>
command to bundle nbb scripts to standalone scripts, which can then
be processed further with e.g. <code>esbuild</code> to minify and tree-shake
them.</li>
<li><code>nbb.edn</code>: you can now declare dependencies within this file, e.g.
from Clojars and nbb will add them automatically to the classpath,
so you can <code>require</code> them.</li>
<li><a href="https://github.com/metosin/malli">Malli</a> compatibilty</li>
<li>Many small bugfixes and improvements</li>
</ul>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>Static analyzer and linter for Clojure code that sparks joy</p>
<h3 id="bebohttpsgithubcomborkdudebebo"><a href="https://github.com/borkdude/bebo">Bebo</a></h3>
<p>Run Clojure scripts on <a href="https://deno.land/">Deno</a> via SCI. I'm not
exactly sure how useful this is to the wider Clojure community, but I
got curious about deno and decided to give this a go.</p>
<h3 id="quickbloghttpsgithubcomborkdudequickblog"><a href="https://github.com/borkdude/quickblog">Quickblog</a></h3>
<p>Light-weight static blog engine for Clojure and babashka</p>
<p>A lot has been happening in this project, with the help of Josh Glover.
Check out the
<a href="https://github.com/borkdude/quickblog/blob/main/CHANGELOG.md#changelog">changelog</a>.
The blog you're currently reading is made with quickblog.</p>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p>Configurable Clojure interpreter suitable for scripting and Clojure
DSLs.</p>
<p>This is the workhorse that powers babashka, nbb, bebo, and many other
projects.</p>
<p>Several bugfixes and enhancements were made in the last two months.</p>
<h3 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h3>
<p>A CLI to add common aliases and features to deps.edn-based projects.</p>
<p>Neil now has a <code>new</code> subcommand which defers to
<a href="https://github.com/seancorfield/deps-new">deps-new</a>. Also <code>neil test</code>
was added to run tests using the Cognitect-labs test runner. Much thanks
to <a href="https://github.com/rads">rads</a> who contributed a lot.</p>
<h3 id="processhttpsgithubcombabashkaprocess"><a href="https://github.com/babashka/process">Process</a></h3>
<p>Clojure library for shelling out / spawning subprocesses</p>
<p>Minor updates and fixes.</p>
<h3 id="fshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Fs</a></h3>
<p>File system utility library for Clojure.</p>
<p>Minor updates and fixes.</p>
<h3 id="pod-babashka-buddyhttpsgithubcombabashkapod-babashka-buddy"><a href="https://github.com/babashka/pod-babashka-buddy">Pod-babashka-buddy</a></h3>
<p>A babashka pod around buddy core (Cryptographic Api for Clojure).</p>
<p>The latest release adds wrappers for <code>buddy.sign.jwt</code> and provides an
<code>aarch64</code> binary.</p>
<p>See
<a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20220803">changelogs</a>.</p>
<h3 id="dynaloadhttpsgithubcomborkdudedynaload"><a href="https://github.com/borkdude/dynaload">Dynaload</a></h3>
<p>The dynaload logic from clojure.spec.alpha as a library</p>
<p>This library was made compatible with nbb.</p>
<h3 id="depscljhttpsgithubcomborkdudedepsclj"><a href="https://github.com/borkdude/deps.clj">Deps.clj</a></h3>
<p>Upgrades and minor fixes.</p>
<h3 id="sciconfigshttpsgithubcombabashkasciconfigs"><a href="https://github.com/babashka/sci.configs">Sci.configs</a></h3>
<p>A collection of ready to be used SCI configs</p>
<p>Moved <code>cljs.pprint</code> config from nbb into this project.</p>
<h2 id="project-with-dragan-djuric">Project with Dragan Djuric</h2>
<p>For this period, I have a pretty good stuff to show: I&rsquo;ve produced a fully working RNN implementation on CPU and GPU!
It was somewhat harder than I had hoped, but I&rsquo;ve put some extra work to it and I can finally say that Deep Diamond
supports recurrent neural networks. And even better, for the user, everything is automatic: the user only needs
to put something like (rnn [128]) at the desired place in the network description! I&rsquo;ve also written a tutorial
on RNN that showcases a Hello World example from start to finish.</p>
<p>I won&rsquo;t dwell too much on the details other than notice that this big milestone for Deep Diamond coincides
perfectly with the end of this CT funding round.</p>
<p>Besides that, I continued my long-term efforts to learn about music and sound and develop Clojure Sound.
In this period, I mainly used already released Clojure Sound to make a Clojure program for ear training.
I&rsquo;ve started a series of blog posts that explain every detail of its development, and showcases
Clojure Sound&rsquo;s features for dealing with MIDI hardware.</p>
<p>Software produced in this period:</p>
<ul>
<li>Deep Diamond, 2 releases (0.24.0 0.25.0)</li>
<li>Clojure Sound, 1 release (0.3.0)</li>
<li>Neanderthal, release (0.45.0)</li>
<li>ClojureCUDA, release (0.16.0)</li>
</ul>
<p>Blog posts published (and several other sound related in the pipeline):</p>
<ul>
<li>Clojure Sound 4 - Ctrl Left Pedal</li>
<li>Clojure Sound - 5 - Double Click with Foot Control</li>
<li>Recurrent Networks Hello World in Clojure with new Deep Diamond RNN support on CPU and GPU</li>
</ul>
<h2 id="project-with-thomas-heller">Project with Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.20.1 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Notable Updates</p>
<ul>
<li>Made Java 11 the minimum supported version. The Closure Compiler did this, so it kinda forces us to go along. The current LTS version is Java 17, so I think this was overdue anyways.</li>
<li>Some optimizations for <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#target-esm">:target :esm</a> and finally made it an officially supported (and documented) build target.</li>
<li>Added a protection against running shadow-cljs server twice in the same project. Running two competing instances will lead to very confusing and hard to debug problems and commonly happened when &ldquo;jacking in&rdquo; to projects, while also running <code>shadow-cljs watch</code> separately.</li>
</ul>
<h2 id="project-with-nikita-prokopov">Project with Nikita Prokopov</h2>
<p>Final two months of Clojurists Together long-term funding. What a year!</p>
<p>We started in September last year intending to build Clojure-native desktop UI framework, but nothing but ideas at our hands. After several Zoom interviews, discussions, blogging, and A LOT of coding, one year after, we have a working prototype.</p>
<p>It’s far from complete, unfortunately (which is expected, given how enormous the task is), but it’s real, you can touch it, you can play with it, you can build simple stuff in it, and it already feels like magic.</p>
<p>Early adopters report that overall developer experience is way superior to anything web or other frameworks can offer. And it’s in Clojure! With REPL!</p>
<p>So, what exactly happened in the last two months, and where are we now?</p>
<h3 id="humbleuihttpsgithubcomhumbleuihumbleui"><a href="https://github.com/HumbleUI/HumbleUI">HumbleUI</a>:</h3>
<ul>
<li>Huge improvements in how exceptions are handled. They don’t bring down your app anymore, instead, a nicely formatted stack trace is printed (with custom clojure-aware formatter, yes)</li>
<li>Lots of refactorings and fixes in event propagation</li>
<li>Built-in debug overlay that shows frame and event timings</li>
<li>Text Field work: undo/redo, compising regions (umlauts/acutes/Chinese/etc), emoji, placeholders, refactoring, cleanup</li>
<li>Focus system</li>
<li>Theme system</li>
<li>Toggle widget</li>
<li>Couple of cool macros: loopr (idea stolen from @aphyr), match (case on steroids)</li>
<li>Added Goal, Motivation, Differences, and Architecture to README</li>
</ul>
<h3 id="jwmhttpsgithubcomhumbleuijwm"><a href="https://github.com/HumbleUI/JWM">JWM</a>:</h3>
<ul>
<li>3 new versions released</li>
<li>X11: adds setTitleBarVisible by @mgxm</li>
<li>X11: Fixed mouse scroll amount</li>
<li>App::openSymbolsPalette</li>
<li>Window::requestFrame can be called from any thread and even on closed windows</li>
<li>Report mouse position in EventMouseButton/EventMouseScroll</li>
</ul>
<h3 id="skijahttpsgithubcomhumbleuiskija"><a href="https://github.com/HumbleUI/Skija">Skija</a>:</h3>
<ul>
<li>Skia version was bumped to m105</li>
<li>New sampling methods, new Bitmap, and Canvas operations</li>
<li>It is now possible to shape TextLine with your own iterators (useful for passing different locales and other options)</li>
<li>Maintenance</li>
</ul>
<h3 id="datascripthttpsgithubcomtonskydatascript"><a href="https://github.com/tonsky/datascript">DataScript</a>:</h3>
<ul>
<li>2 new versions released</li>
<li>Inspired by Christian Weilbach, work has started on durable/lazy-loading DataScript. We are not there yet, but it all seems very doable</li>
<li>Ben Sless has contributed a lot of small performance improvements to JVM version</li>
<li>Entity comparison now takes DB identity into account</li>
</ul>
<p>I also created a new Sublime plugin, which may or may not be useful for Clojure development (I use it every day now and enjoy it a lot): <a href="https://github.com/tonsky/Sublime-Executor">https://github.com/tonsky/Sublime-Executor</a></p>
<p>Overall, working with Clojurists Together has been a fantastic experience and I’m really excited about what we were able to do together.</p>
<p>Work on Humble UI is not stopping, though. It is now full steam ahead and aiming at its first debut at Dutch Clojure Days this Autumn. Wish me luck!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2022 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2022-funding-announcement/</link>
      <pubDate>Tue, 06 Sep 2022 09:30:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2022-funding-announcement/</guid>
      <description>Clojurists Together is funding 11 projects for Q3 2022. These projects are Maria.cloud, ClojureDart, mathbox-cljs, Clj-kondo and related, Clojure Data Cookbook, Kaocha and related, Biff, Clojupedia, Exo, portal and cljfx.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is very excited and happy to announce that for Q3 2022 we are funding a total of 11 projects:</p>
<p><strong>USD 9,000</strong></p>
<ul>
<li><a href="https://www.maria.cloud/">Maria.cloud</a></li>
<li><a href="https://github.com/mentat-collective/mathbox.cljs">mathbox-cljs</a></li>
<li><a href="https://github.com/scicloj/clojure-data-cookbook">Clojure Data Cookbook</a></li>
<li><a href="https://github.com/Tensegritics/ClojureDart">ClojureDart</a></li>
<li><a href="https://github.com/borkdude">clj-kondo, babashka, SCI, nbb, scittle and related</a></li>
<li><a href="https://github.com/lambdaisland/kaocha">Kaocha and related projects</a></li>
</ul>
<p><strong>USD 2,000</strong></p>
<ul>
<li><a href="https://github.com/djblue/portal">portal</a></li>
<li>Exo (unreleased)</li>
<li><a href="https://github.com/cljfx/cljfx">cljfx</a></li>
<li><a href="https://github.com/jacobobryant/biff">Biff</a></li>
<li><a href="https://github.com/clojupedia/main">Clojupedia</a></li>
</ul>
<h1 id="q3-2022-projects">Q3 2022 Projects</h1>
<p>Each project&rsquo;s plans are detailed below.</p>
<h2 id="mariacloudhttpswwwmariacloud"><a href="https://www.maria.cloud/">Maria.cloud</a></h2>
<p><strong>Grantee</strong>
Matthew Huebert</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Maria combines carefully written curriculum with a clean, no-install editor. It is designed to introduce complete beginners to fundamental ideas of programming, with an editing environment that encourages REPL-driven development and structural editing from day one. It has been widely appreciated as a good tool for introducing Clojure to beginners and used at several workshops like ClojureBridge.</p>
<p>We think it&rsquo;s important to keep Maria up-to-date/maintained to prevent users (especially beginners) from encountering bugs while using the tool, to support the latest versions of Clojure, and to enable additional feature development down the road.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>We built Maria 5 years ago and would like to bring it back into active development, starting with a refactor/simplification of the core of the editor so that we have a good base to build on top of.</p>
<p>Top priorities would be (1) replace the selfhost compiler with sci for a more lightweight runtime, (2) replace the code editor with CodeMirror 6 using the cm6 clojure mode I wrote last year for Nextjournal, (3) upgrade to latest version of ProseMirror, (4) add a &ldquo;publish&rdquo; feature so that people can share what they make with the world. This funding will not cover all of the work listed above, so we&rsquo;ll also be looking for funds from elsewhere. This would be the first funding we have ever taken for this project.</p>
<h2 id="mathbox-cljshttpsgithubcommentat-collectivemathboxcljs"><a href="https://github.com/mentat-collective/mathbox.cljs">mathbox-cljs</a></h2>
<p><strong>Grantee</strong>
Sam Ritchie</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Python could never have succeeded in the data science space without matplotlib and other tools that made Jupyter a lovely environment for data exploration. Mathematica&rsquo;s built-in 2d and 3d viewers are also essential for that platform&rsquo;s success in mathematical work.</p>
<p>For data analysis and 2d work, Clojure has Vega and Vega-Lite bindings&hellip; but there is nothing analogous in the community for 3d visualization and animation, certainly not at the level of abstraction (declarative scenes!) that Mathbox provides.</p>
<p>Mathbox is best-in-class, and only recently with mathbox-react is its power available without mastering a mutable API. Making this power available to the Clojurescript community will make the language a serious contender for top choice on anything requiring 3d visualization.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p><strong>Background</strong></p>
<p>This project aims to make the incredible Mathbox project to the community of artists, researchers, students and developers using Clojurescript.</p>
<p>Mathbox is a React-like system for declaratively building <a href="https://github.com/mrdoob/three.js/">three.js</a> scenes full of interactive, animating mathematical objects. Steven Wittens built Mathbox in 2015 (launch post: <a href="https://acko.net/blog/mathbox2/">https://acko.net/blog/mathbox2/</a>) and used the system to build interactive explorables like &ldquo;How to Build a <a href="https://acko.net/blog/how-to-fold-a-julia-fractal/">Julia Fractal</a>&rdquo;.</p>
<p>I believe that Mathbox is the most stunning option in the JS world for writing mathematical visualizations. Some examples of work done via Mathbox include:</p>
<ul>
<li>an interactive 3d graphing calculator: <a href="https://www.math3d.org/">https://www.math3d.org/</a></li>
<li>&ldquo;Introduction to Linear Algebra&rdquo; executable textbook: <a href="https://textbooks.math.gatech.edu/ila/">https://textbooks.math.gatech.edu/ila/</a></li>
<li>Kinetic Graphs declarative language: <a href="https://kineticgraphs.org/">https://kineticgraphs.org/</a></li>
</ul>
<p>Unfortunately Mathbox as built in 2015 isn&rsquo;t compatible with the package-based infrastructure that Clojurescript requires.</p>
<p>To address this, I adopted Mathbox last summer and spent the next six months converting the project from Coffeescript to Javascript, upgrading its 30kloc codebase to ES6-compatible packages, upgrading the dozens of existing examples, getting the project onto a proper Github Actions CI (and doing the same for two dependent projects, Shadergraph and Threestrap).</p>
<p>I then worked with Christopher Chudzicki to build React wrappers over the full zoo of Mathbox primitives: <a href="https://github.com/christopherChudzicki/mathbox-react">https://github.com/christopherChudzicki/mathbox-react</a></p>
<p>Finally, I was able to hook the new CLJS-compatible Mathbox into sicmutils (<a href="https://github.com/sicmutils/sicmutils),">https://github.com/sicmutils/sicmutils),</a> the Clojure(script) computer algebra system that I maintain, to demonstrate the ability to live-code mathematical visualizations, including realistic physics animations, from a REPL.</p>
<p><strong>Proposed Scope</strong></p>
<p>I&rsquo;m applying for funding to create the following stack of projects, designed to make Mathbox easy to use from any Clojurescript project, or within any of the various Clojurescript computational notebooks (Clerk, Clojupyter, the scicloj.ml) or rich REPLs (Gorilla REPL, Reveal).</p>
<p>Clojurescript&rsquo;s data visualization tooling is lovely to use and garnering more attention. The tools in that space deserve a rich, idiomatic library of primitives for mathematical and statistical visualizations, built in a lovely, component-based way.</p>
<p>These two projects are already complete and managed by me:</p>
<ul>
<li><code>mathbox</code>, which I resuscitated (already released)</li>
<li><code>mathbox-react</code>, by Chris (released)</li>
</ul>
<p>Next I&rsquo;ll be creating the following layers:</p>
<ul>
<li>
<p><code>mathbox.cljs</code>, which will expose all mathbox-react components via Reagent, fill in all documentation and smooth over JS-related warts in the component API. mathbox.cljs will also ports of the dozens of examples that live in the Mathbox repo. I&rsquo;ve built this out with React&rsquo;s Storybook, so that each example becomes a tutorial on its own: <a href="https://mentat-collective.github.io/mathbox.cljs">https://mentat-collective.github.io/mathbox.cljs</a>.</p>
</li>
<li>
<p><code>sicmutils-mathbox</code>, a library of higher-level components that allow you to add primitives from sicmutils like manifolds, polynomials, derivatives of polynomials, complex numbers etc directly to a Mathbox scene, plus patterns for writing algorithmic visualizations</p>
</li>
</ul>
<p><code>sicmutils-clerk</code>, a library of viewers for the Clerk (<a href="https://github.com/nextjournal/clerk">https://github.com/nextjournal/clerk</a>) project. Clerk allows you to drive visualizations from a JVM process, so hooking together Clerk and mathbox.cljs will provide tooling and patterns for users looking to do full-stack data visualization.</p>
<p>I will use the funding to create and ship these projects and provide best-in-class documentation and examples.</p>
<p><strong>Why?</strong></p>
<p>In addition to the community benefit, I need these tools for my Executable Textbooks project. I am currently building out executable versions of Sussman and Wisdom&rsquo;s &ldquo;Structure and Interpretation of Classical Mechanics&rdquo; (<a href="https://github.com/mentat-collective/sicm-book">https://github.com/mentat-collective/sicm-book</a>) and &ldquo;Functional Differential Geometry&rdquo; (<a href="https://github.com/mentat-collective/fdg-book)">https://github.com/mentat-collective/fdg-book)</a>. I want these books to use standardized components in the community, instead of feeling like hand-rolled boutique projects that no one can copy.</p>
<h2 id="portalhttpsgithubcomdjblueportal"><a href="https://github.com/djblue/portal">portal</a></h2>
<p><strong>Grantee</strong>
Chris Badahdah</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Portal already has some traction in the Clojure community because it provides an easy way to generically inspect Clojure/ClojureScript data structures. By making it easier to add custom viewers, users will be empowered to visualize their own data and solve their specific problems.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>A common question I get around Portal is how to add custom viewers. Currently, Portal supports extensibility via SCI. However, it&rsquo;s not very well documented or easy to use. I would like to provide users with documentation on extensibility and a proper REPL (tty, socket-repl and nREPL) to make it easier to extend.</p>
<h2 id="exo-unreleased">Exo (unreleased)</h2>
<p><strong>Grantee</strong>
Will Acton</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>In my experience building front end applications, the majority of time spent managing global state is fetching and caching data. It is a concern that 99% of all application developers have to deal with, and the current ecosystem in ClojureScript has a hole that I think this library would fill.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p><strong>What</strong></p>
<p>Exo (working name, may change) is a ClojureScript library for fetching and caching data using EQL. It builds on top of the fundamental ideas behind Fulcro, Apollo-client, and Relay, while providing an easy to use interface for developers to adopt it a la carte into their existing front end applications.</p>
<p>It exposes two React hooks that can be used in any ClojureScript application built on React:</p>
<ul>
<li>use-query: fetch the result of an EQL query from the server, tracking the state of the request, and update the component it&rsquo;s used in if any of the entities that are returned in the result change from any other fetches or mutations</li>
<li>use-mutation: send a mutation to the server, with the option of optimistically updating the cache, and update the component it&rsquo;s used in with the status and result of the mutation</li>
</ul>
<p>These two hooks, combined with the excellent pathom library, would allow developers to leverage the power of pathom in their any React applications in a similar way that Fulcro does if you go all-in.</p>
<p>On the other hand, it has a different philosophy from Fulcro. Components can subscribe to any query, even the same query or multiple queries, rather than coupling queries to components directly. This allows a flexible architecture for application developers and eases adoption. This is very similar to the way that Apollo-client and the latest version of Relay work with GraphQL.</p>
<p><strong>Why</strong></p>
<p>In my experience building front end applications, the majority of time spent managing global state is fetching and caching data. It is a concern that 99% of all application developers have to deal with, and the current ecosystem in ClojureScript has a hole that I think this library would fill.</p>
<p>Currently, if you are building a new React application in ClojureScript today, you have three options:</p>
<ol>
<li>Use re-frame and write a lot of events, subscriptions, and either build yourself or kludge on some library for data fetching effects</li>
<li>Use Fulcro, which provides a great (if scarily large) API if you go all in, or a second class experience if you try to use the &ldquo;raw&rdquo; API a la carte</li>
<li>Use a JS library like react-query or Apollo-react, which requires a good knowledge of JS interop and has some tricky corners</li>
</ol>
<p>This library would provide a 4th option, which would be a similar library that JS developers get with react-query and Apollo-react, but in native ClojureScript with EQL and Pathom at its heart.</p>
<p><strong>How</strong></p>
<p>The secret sauce of the library is the combination of a normalized cache that can be queried via EQL (and mirrors your pathom backend) with the learnings I have made with other experiments trying to build a caching layer that supports React Suspense. It builds on top of another of my libraries, Pyramid (<a href="https://github.com/lilactown/pyramid),">https://github.com/lilactown/pyramid),</a> which is a library for normalizing data into a map and querying it using EQL.</p>
<p>I have already started building Exo. Currently the caching layer is done, including notifying listeners when any entities that their query depends on changes, and the &ldquo;use-query&rdquo; hook. There are a few important things that I want to finish before v1.0 release</p>
<ol>
<li>use-mutation hook</li>
<li>Stable API for configuring the connection to a pathom backend</li>
<li>A solution for &ldquo;data masking.&rdquo; See <a href="https://relay.dev/docs/principles-and-architecture/thinking-in-relay/">https://relay.dev/docs/principles-and-architecture/thinking-in-relay/</a></li>
<li>A plugin API for things like refetching on focus and other more advanced behaviors</li>
<li>Documentation</li>
</ol>
<p><strong>Goals &amp; Expectations</strong></p>
<p>If I am awarded the 3 month funding, my goal would be to complete the use-mutation hook, have a stable API for configuring with a pathom backend, and a solution for data masking.
Sketches for the plugin API for refetching and garbage collection may be done, but I won&rsquo;t commit to them at this time.</p>
<p>Documentation and example projects will also be made available for the things considered &ldquo;done&rdquo; at the end of this 3 month period, and an alpha release will be made to collect feedback.</p>
<h2 id="clojure-data-cookbookhttpsgithubcomsciclojclojure-data-cookbook"><a href="https://github.com/scicloj/clojure-data-cookbook">Clojure Data Cookbook</a></h2>
<p><strong>Grantee</strong>
Kira McLean</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>The Clojure data science community is growing quickly and there is currently no “central” reference for how to do simple data science tasks with existing libraries and tools, only a proliferation of disconnected posts, articles, and documentation. I want to create a resource that demonstrates how to use the main tools that the community is coalescing around to accomplish basic data science tasks with Clojure.</p>
<p>The outline is already drafted (<a href="https://github.com/scicloj/clojure-data-cookbook/blob/outline/outline-draft.md">https://github.com/scicloj/clojure-data-cookbook/blob/outline/outline-draft.md</a>) and has been discussed with the community. The book will include a brief introduction to Clojure, basic data science operations like data input, output, and data manipulation, as well as more advanced topics like data visualization and statistics.</p>
<p>Several of the libraries mentioned in the most recent Clojurists together survey are becoming key components of the scicloj ecosystem, and although many do have excellent API docs, not all do and either way it’s important to also document them in the context of solving actual problems. Some libraries that were mentioned and would be used in the book include:</p>
<ul>
<li>tooling
<ul>
<li>oz</li>
<li>portal</li>
</ul>
</li>
<li>data visualisation
<ul>
<li>vega/vega-lite</li>
</ul>
</li>
<li>data processing
<ul>
<li>tablecloth</li>
<li>tech.ml.dataset</li>
<li>dtype-next</li>
<li>meander</li>
</ul>
</li>
<li>linear algebra
<ul>
<li>Neanderthal</li>
</ul>
</li>
<li>probability/statistics
<ul>
<li>fastmath
There are other libraries that would also be used, including hanami, kixi.stats, inferme, clerk, and scicloj.ml.</li>
</ul>
</li>
</ul>
<p>This project would build upon prior efforts in the community like the <a href="https://github.com/scicloj/scicloj-data-science-handbook">SciCloj Clojure Data Science Handbook</a> and complement current efforts to put together a <a href="https://scicloj.github.io/docs/community/groups/ds4clj/">data science course for Clojurians</a>. There is <a href="https://clojureverse.org/t/a-data-science-course-for-clojurians-are-you-interested/9074">great interest</a> in this content, and this book will be essential as a companion study guide to the course.</p>
<p>It will also complement my work co-organizing the visual tools study group in the scicloj community. One of the main topics we discuss is figuring out an approach to literate programming in Clojure. Many of the tools showcased there are relevant to the underlying technical implementation of how we’ll deliver the book. The goal is for it to be very much a living document that stays relevant beyond the first few months after release, with updatable, executable/copy-paste-able, and tested examples. This example-based approach to teaching builds upon my experience organizing and teaching workshops, such as the one I gave about <a href="https://www.youtube.com/watch?v=C3kwcAJWJmE">data visualization last November</a>.</p>
<p>The book, along with the course, will be an essential resource bridging the gap between data science practitioners who are new to Clojure and Clojure developers new to data science. The long term vision is to place Clojure and the scicloj ecosystem as a top choice for data scientists, alongside R and Python. For this to happen, clear and easy-to-follow guides need to exist and this book would be one step toward that end.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I would like to start writing the contents of the book, completing at least the core chapters (i.e. excluding data viz and statistics) this year and continuing with the project into next year. The outline is drafted and I have been discussing it and working on getting buy-in from other members of the Clojure data science community this year. If I get this funding I will start taking an afternoon or a day off per week from my full time job to work on the book.</p>
<h2 id="cljfxhttpsgithubcomcljfxcljfx"><a href="https://github.com/cljfx/cljfx">cljfx</a></h2>
<p><strong>Grantee</strong>
Vlad Protsenko</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>At ~800 stars, this is my most popular Clojure project on GitHub. Cljfx has 45K downloads on Clojars, where latest significant version (1.7.19) has 4.7K downloads. While desktop java apps are quite niche, they have their use and cljfx-powered desktop apps exist.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>The developer experience of cljfx has some issues:</p>
<ul>
<li>what are the allowed props for different javafx types is not clear and requires looking it up in the source code;</li>
<li>what are allowed javafx type keywords requires looking it up in the source code;</li>
<li>errors when using non-existent props are unhelpful.</li>
<li>generally, errors that happen during cljfx lifecycle are unhelpful because the stack traces have mostly cljfx internals instead of user code</li>
</ul>
<p>I want to improve that by creating:</p>
<ul>
<li>specs for cljfx descriptions so they can be validated with descriptive errors;</li>
<li>dev-time tooling for looking up available props and their expected values — at least in the REPL, maybe as a UI builder if that works out;</li>
<li>dev-time cljfx component tree inspector similar to browser&rsquo;s html element inspector that will contextualize ocurring errors in terms of user components.</li>
</ul>
<h2 id="clojuredarthttpsgithubcomtensegriticsclojuredart"><a href="https://github.com/Tensegritics/ClojureDart">ClojureDart</a></h2>
<p><strong>Grantee</strong>
Christophe Grand and Baptiste Dupuch</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<ul>
<li>targeting native desktop and mobile with Flutter</li>
</ul>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<ul>
<li>better dev experience: better hot reload, LSP, kondo, maybe REPL</li>
</ul>
<h2 id="biffhttpsgithubcomjacobobryantbiff"><a href="https://github.com/jacobobryant/biff">Biff</a></h2>
<p><strong>Grantee</strong>
Jacob O&rsquo;Bryant</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>The latest Clojurists Together survey mentioned that &ldquo;Documentation, Tutorials and Beginner experience&rdquo; and &ldquo;a popular web development framework&rdquo; are both areas in need of support. Biff addresses both of these directly.</p>
<p>The Biff community is still small, but we do have a few regulars, like Jeff Parker who is already a core contributor to Biff&rsquo;s flagship example project (<a href="https://github.com/jacobobryant/platypub/commits?author=jeffp42ker)">https://github.com/jacobobryant/platypub/commits?author=jeffp42ker)</a>.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I want to write a bunch more documentation. Currently we only have reference docs. I want to add:</p>
<ul>
<li>
<p>a series of tutorials that have you build a forum + real-time chat application (like Discourse and Slack in one)</p>
</li>
<li>
<p>a page that curates/recommends resources for learning Clojure and getting a dev environment set up. Aimed at those who are brand new to Clojure and want to use it for web dev.</p>
</li>
<li>
<p>a series of tutorials/explanatory posts that teach the libraries Biff uses. Each tutorial will have readers implement some web dev functionality without using Biff (like HTML rendering), after which they&rsquo;ll be shown how to do it with Biff. (Spoiler: the tutorials will secretly have readers implement all the helper functions that Biff provides&ndash;by the end, readers will have implemented all of Biff from scratch.) This is intended for those who prefer a bottom-up approach to learning.</p>
</li>
</ul>
<p>Along the way I&rsquo;ll also restructure the website (<a href="https://biffweb.com">https://biffweb.com</a>), while studying <a href="https://documentation.divio.com/">https://documentation.divio.com/</a>.</p>
<p>This is a long-term project and will not be finished within the next three months, especially since I&rsquo;ll be doing it in tandem with my other Biff work. But I&rsquo;ll publish the posts on a rolling basis. With the Clojurists Together funding, I&rsquo;d hope to at least complete the forum tutorials.</p>
<h2 id="clj-kondo-babashka-sci-nbb-scittle-and-relatedhttpsgithubcomborkdude"><a href="https://github.com/borkdude">clj-kondo, babashka, SCI, nbb, scittle and related</a></h2>
<p><strong>Grantee</strong>
Michiel Borkent</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Babashka, clj-kondo and related were mentioned in reply to &ldquo;Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?&rdquo;.</p>
<p>Clj-kondo is a Clojure linter that is used by a wide variety of individual users and companies (<a href="https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md)">https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md)</a>.</p>
<p>Babashka is a scripting environment that can execute a significant subset of JVM Clojure programs with instant startup. It is used by a individual users and companies (<a href="https://github.com/babashka/babashka/blob/master/doc/companies.md)">https://github.com/babashka/babashka/blob/master/doc/companies.md)</a>. It is currently my project with the most stars on Github.</p>
<p>SCI is the Clojure interpreter powering babashka and several other projects (see <a href="https://github.com/borkdude/sci#projects-using-sci)">https://github.com/borkdude/sci#projects-using-sci)</a>.</p>
<p>Nbb is gaining traction (currently 500 stars, being used as viable Clojure option on AWS Lambda).</p>
<p>I&rsquo;ll probably also work on more experimental libraries like cherry (tiny CLJS transpiler which directly outputs ES modules).</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p><strong>Clj-kondo</strong></p>
<ul>
<li>.cljc configuration/refinements: e.g. support for ClojureDart and :bb conditionals</li>
<li>numerous other issues, there&rsquo;s always plenty to do: See the project board:
<a href="https://github.com/clj-kondo/clj-kondo/projects/1">https://github.com/clj-kondo/clj-kondo/projects/1</a> and see here for a list of most upvoted issues: <a href="https://github.com/clj-kondo/clj-kondo/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc">https://github.com/clj-kondo/clj-kondo/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc</a></li>
<li>As clj-kondo is the foundation for the static analysis in clojure-lsp:
improvements on those</li>
</ul>
<p><strong>Babashka</strong></p>
<ul>
<li>Integrate the new babashka.cli library into babashka (including usage with tasks)</li>
<li>bb install: install script straight from a remote repository and make it available as a globally installed tool (bb install foo &amp;&amp; foo)</li>
<li>babashka.http-client library: a library to consolidate the existing http clients in babashka</li>
<li>improve documentation in book.babashka.org</li>
<li>addressing issues of several built-in libs in bb: babashka.cli, fs, process, etc.</li>
</ul>
<p><strong>SCI</strong></p>
<ul>
<li>Error messages improvements (<a href="https://github.com/babashka/babashka/issues/1322">https://github.com/babashka/babashka/issues/1322</a>)</li>
<li>Interop performance improvements</li>
<li>Improvements to sci.async (async evaluation in CLJS)</li>
<li>Make keyword argument functions accept maps in CLJS (catch up with clojure 1.11)</li>
</ul>
<p><strong>Scittle</strong></p>
<ul>
<li>Take advantage of async SCI evaluation (see above) to be able to load JS
libraries from CDNS using dynamic impport</li>
</ul>
<p><strong>Nbb</strong></p>
<ul>
<li>nbb.edn to declare dependencies from clojars</li>
<li>built-in string interpolation (a la JS)</li>
</ul>
<h2 id="kaocha-and-related-projectshttpsgithubcomlambdaislandkaocha"><a href="https://github.com/lambdaisland/kaocha">Kaocha and related projects</a></h2>
<p><strong>Grantee</strong>
Arne Brasseur / Gaiwan</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Kaocha has become the default way to run tests, and better test tooling means less friction when working on tests, which means more and better testing, and thus better software.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>We&rsquo;d like to use this budget to give some much needed attention to our testing-related tools and libraries, in particular:</p>
<ul>
<li>kaocha</li>
<li>kaocha-cljs</li>
<li>kaocha-cljs2</li>
<li>kaocha-cucumber</li>
<li>deep-diff2</li>
<li>kaocha-junit-xml</li>
<li>kaocha-cloverage</li>
<li>facai</li>
<li>faker</li>
<li>chui</li>
<li>funnel</li>
<li>funnel-client</li>
</ul>
<p>Most of these have been around for a while, and have found widespread adoption in the community. They are working and stable, but most of them have not seen much attention in the last few years. Issues and maintenance tasks have piled up, and many ideas have been brought up on how to improve these tools, which we haven&rsquo;t had a chance to explore. All of them are in need of better and more complete documentation.</p>
<p>We (Gaiwan) have funded Alys Brooks over the last 1~2 years to help with the maintenance of Lambda Island libraries, in particular Kaocha, but only for a few hours per week. Our plan with the $9k budget would be to match it, partly with funding from our Open Collective, and partly directly by Gaiwan, to get to a budget of $18k. With that money we&rsquo;d fund the equivalent of a full-time developer over the course of 4 months, spread across a few different people on the Gaiwan team.</p>
<p>It’s hard to say what exactly we’ll manage to accomplish in that time, but these are some of the areas we’d like to focus on:</p>
<ul>
<li>General upkeep
<ul>
<li>triage issues</li>
<li>close old/stale issues</li>
<li>close or revive stale PRs</li>
<li>prioritize remaining issues</li>
<li>fix CI and cljdoc builds</li>
</ul>
</li>
<li>Docs
<ul>
<li>revise / update / expand READMEs</li>
<li>expand and reorganize docs based on the 4 types of documentation <a href="https://documentation.divio.com/">https://documentation.divio.com/</a></li>
<li>document specific usage patterns (Recipes)
<ul>
<li>&ldquo;test system&rdquo;</li>
<li>rollback db for each test</li>
<li>effective use of factories</li>
<li>CI setup</li>
</ul>
</li>
</ul>
</li>
<li>bigger chunks
<ul>
<li>wrap up Kaocha parallelism</li>
<li>kaocha-cljs2 convenience layer
<ul>
<li>automate funnel install &amp; launch</li>
<li>make the 80% case (shadow+browser+chui+funnel) trivial to set up</li>
</ul>
</li>
<li>Get Facai to v1</li>
</ul>
</li>
</ul>
<h2 id="clojupediahttpsgithubcomclojupediamain"><a href="https://github.com/clojupedia/main">Clojupedia</a></h2>
<p><strong>Grantee</strong>
Adam Helins</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It aims to offer visibility and discoverability of the Clojure ecosystem, libraries and miscellaneous tools. A powerful way of having a glimpse at the state of the ecosystem, organized in a knowledge graph ; how projects and libraries are related, linked, all of this complemented by a powerful search engine.</p>
<p>This project is implemented in Logseq (itself written in Clojurescript). The current prototype demonstrates key features: <a href="https://clojupedia.github.io/#/page/contents">https://clojupedia.github.io/#/page/contents</a></p>
<p>Please, follow the &ldquo;About&rdquo; section and related links which explain what it is, how it works, and how it differs from previous attempts. Other sections, albeit poor in content at the moment, offer a glimpse at what this project will become if a bit of funding can be found to formalize it enough to bootstrap a community effort.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Strenghten the project and evolve it to a community-driven effort.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2022 Survey Results - Part 1</title>
      <link>https://www.clojuriststogether.org/news/q3-2022-survey-results-part-1/</link>
      <pubDate>Fri, 08 Jul 2022 17:30:58 +0200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2022-survey-results-part-1/</guid>
      <description>We recently surveyed our members for feedback and to find out which projects they would like to see funded. We are also opening applications for Q3 2022 until 25th of July.</description>
      <content:encoded><![CDATA[<p><strong>Clojurists Together is starting our next funding round for Q3 2022. Applications are open until the 25th of July. <a href="/open-source/">Apply</a> today!</strong></p>
<h2 id="survey-responses-part-1">Survey Responses Part 1</h2>
<p>We recently surveyed our developer and company members to find out what they wanted us to focus on. We sent the survey to 352 members and received 60 responses. Here are some of the results:</p>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<p><img src="/images/2022/q3-survey/platforms.png" alt=""></p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p><img src="/images/2022/q3-survey/clj-improvements.png" alt=""></p>
<h3 id="what-areas-of-clojurescript-would-you-like-to-see-improvement-in">What areas of ClojureScript would you like to see improvement in?</h3>
<p><img src="/images/2022/q3-survey/cljs-improvements.png" alt=""></p>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-need-support">What areas of the Clojure and ClojureScript ecosystem need support?</h3>
<h4 id="developer-tooling">Developer Tooling</h4>
<ul>
<li>improvements around developer tooling, especially improving ClojurScript REPL support</li>
<li>better test tooling</li>
</ul>
<h4 id="documentation-tutorials-and-beginner-experience">Documentation, Tutorials and Beginner experience</h4>
<ul>
<li>better documentation and tutorials</li>
<li>good on-boarding material for newcomers to the language</li>
<li>bringing in new developers</li>
</ul>
<h4 id="errors">Errors</h4>
<ul>
<li>error handling and reporting</li>
<li>making it easier to make sense of errors</li>
</ul>
<h4 id="other-areas-that-were-mentioned">Other areas that were mentioned</h4>
<ul>
<li>a good replacement for clojure.spec</li>
<li>a popular web development framework</li>
<li>more mainstream publicity of success</li>
<li>better integration with JavaScript libraries</li>
<li>better integration with the Java ecosystem</li>
</ul>
<h3 id="what-areas-of-the-clojure-and-clojurescript-ecosystem-are-strong">What areas of the Clojure and ClojureScript ecosystem are strong?</h3>
<ul>
<li>Community (this was mentioned a lot 💚)</li>
<li>REPL and development environment</li>
<li>data processing</li>
<li>language stability</li>
<li>some special shoutouts to: shadow-cljs, CIDER and clj-kondo</li>
<li>Clojure(Script) itself and the core library</li>
</ul>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>shadow-cljs</li>
<li>leiningen</li>
<li>malli</li>
<li>the borkdude ecosystem: clj-kondo, babashka</li>
<li>clojure</li>
<li>clojurescript</li>
<li>clojure-lsp</li>
<li>calva</li>
<li>Fulcro</li>
<li>Pathom</li>
<li>Duct framework</li>
<li>Rum</li>
<li>scicloj ecosystem</li>
<li>Datahike</li>
<li>DataScript</li>
<li>Aleph</li>
<li>oz</li>
<li>nrepl</li>
<li>next-jdbc</li>
<li>clojureverse</li>
<li>ClojureDart</li>
<li>cloverage (clojurescript support)</li>
<li>Reitit</li>
<li>vega/vega-lite</li>
<li>Neanderthal</li>
<li>tablecloth</li>
<li>tech.ml.dataset</li>
<li><a href="https://4clojure.oxal.org/">https://4clojure.oxal.org/</a></li>
<li>cljsjs packages</li>
<li>core.typed</li>
<li>test.check</li>
<li>Re-frame</li>
<li>Reagent</li>
<li>machine_head</li>
<li>meander</li>
<li>Orchard/LSP</li>
<li>Clojurians Slack</li>
<li>clojars</li>
<li>cljdoc</li>
<li>Hyperfiddle</li>
<li>Missionary</li>
<li>dtype-next</li>
<li>fastmath</li>
<li>scittle</li>
<li>portal</li>
</ul>
<blockquote>
<p>I would love to see a 100% ClojureScript SPA framework/library, i.e. without using React, or any other JS dependency. Thomas Heller is/was working on something along these lines at <a href="https://github.com/thheller/shadow-experiments,">https://github.com/thheller/shadow-experiments,</a> so I&rsquo;d like him to get some support to push things forward.</p>
</blockquote>
<blockquote>
<p>If any project comes up for CLJS code coverage, that would be awesome.</p>
</blockquote>
<blockquote>
<p>I would like some kind of merge between vim-fireplace and clover for vscode! clover is nice (but misses this nice feature from vim-fireplace where you can replace an expression by its outcome). I&rsquo;m not really interested in the full framework that Calva is.</p>
</blockquote>
<blockquote>
<p>I would love to see the core documentation getting some love: <a href="https://clojuredocs.org/clojure.core,">https://clojuredocs.org/clojure.core,</a> for example, <a href="https://clojuredocs.org/clojure.core/interleave">https://clojuredocs.org/clojure.core/interleave</a> to understand interleave I need to understand both &ldquo;apply&rdquo;, &ldquo;assoc&rdquo; to grasp the first example. For someone dipping their toes in Clojure for the first time this isn&rsquo;t as trivial as seasoned Clojure developers might think. Some of the examples (although correct) are really hard to understand and could potentially add to the confusion for someone new.</p>
</blockquote>
<p><strong>If you are a maintainer of any of these projects or would like to contribute to these projects, please consider applying.</strong></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>June 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/june-2022-monthly-update/</link>
      <pubDate>Thu, 30 Jun 2022 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/june-2022-monthly-update/</guid>
      <description>Read updates from Tablecloth, Deep Diamond, Overtone Playground, Datahike Server, Conjure and more updates from our long term projects with Bozhidar Batsov, Michiel Borkent, Dragan Djuric, Thomas Heller, David Nolen, and Nikita Prokopov</description>
      <content:encoded><![CDATA[<h2 id="tablecloth">Tablecloth</h2>
<p>During the first period of this project (April - June), I conducted some initial
research to plan and scope the project. I also opened an <a href="https://bit.ly/3yr3P8O">initial PR</a> into
tablecloth that establishes a new `tablecloth.column.api` and some core
functions setting up a `column` &ldquo;primitive.&rdquo; For a fuller account, of my thought
process and the work I&rsquo;ve been doing, I&rsquo;ve written a blog post <a href="https://bit.ly/3ua77L8">&ldquo;Columns for
Tablecloth&rdquo;</a>.</p>
<p>I&rsquo;ve included a copy of that text below:</p>
<h4 id="columns-for-tablecloth">Columns for Tablecloth</h4>
<p>For a few years now, I have been working with a unique, global group of people associated with the <a href="https://scicloj.github.io/">SciCloj</a> community, many of whom are interested in promoting the use of Clojure for data-centric computing. As part of this effort, I recently applied for and then received funding from <a href="https://www.clojuriststogether.org/open-source/">Clojurists Together</a> &ndash; an organization in the Clojure community that provides funding for open source work on Clojure tools &ndash; to contribute to an important new data-processing library called <a href="https://github.com/scicloj/tablecloth">tablecloth</a>.</p>
<h4 id="the-context-for-the-project">The context for the project</h4>
<p>Before delving into the nature of the project itself, I want to quickly explain my understanding of where this library tablecloth fits into the emerging Clojure data stack so it&rsquo;s clear why I think this project is worthwhile. Generally, speaking much of the work that I&rsquo;ve been doing within SciCloj has been focused on the question of usabilty. The problem of usability has emerged only because in the last years a number of very talented individuals have created a set of powerful new tools that provide the bedrock for highly performant data-processing in Clojure.</p>
<p>One of the tools that has become particularly prominent is the so-called &ldquo;tech&rdquo; stack developed by <a href="https://github.com/cnuernber">Chris Nurenberger</a>. This stack consists of a low-level library called <a href="https://github.com/cnuernber/dtype-next">dtype-next</a>, which provides a method for handling typed arrays or buffers (see a workshop I gave on this library <a href="https://www.youtube.com/watch?v=5u3_k_D5KSI&amp;t=565s&amp;ab_channel=LondonClojurians">here</a>), and <a href="https://github.com/techascent/tech.ml.dataset">tech.ml.dataset</a> that provides a column-based tabular <code>dataset</code> much like the &ldquo;dataframes&rdquo; one finds in R or Python&rsquo;s Pandas library.</p>
<p>Using just tech.ml.dataset, one can already perform the kind of data analyses over large amounts of data. Indeed, in many cases, thanks to Chris Nurenberger&rsquo;s amazing work, this stack can outperform equivalent tools in Python, R, and even Julia.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> However, although very usable in its own right, tech.ml.dataset is somewhat low level and its API is not always consistent. For this reason, many people start out with the library to which I will be contributing: <a href="https://github.com/scicloj/tablecloth">tablecloth</a>.</p>
<p>Tablecloth is essentially a wrapper on top of tech.ml.dataset. Authored by Tomasz Sulej (<a href="https://twitter.com/generateme_blog">@generateme_blog</a>), who has created many other useful libraries and has a knack for creating beautiful tools, it provides a consistent API for interacting with <code>datasets</code> that is inspired by the user-friendly syntax of R&rsquo;s tidyverse libraries among others.</p>
<h4 id="my-project-columns-for-tablecloth">My project: columns for tablecloth</h4>
<p>What I will work on during this project, then is adding a new dimension to tablecloth&rsquo;s API. Currently, the focus of tablecloth&rsquo;s API is the <code>dataset</code>. This, of course, makes perfect sense since in many cases when working with data, especially when manipulating data as a preparation for feature engineering, you are working primarily at the level of the whole <code>dataset</code>.</p>
<p>Sometimes, however, you may want to perform operations not across a whole dataset (or set of columns), but on a single column. And that&rsquo;s where my project comes in. It will add add a new API for the <code>column</code> to tablecloth. In other words, once we&rsquo;ve added this API we should, at the very least, be able to do something like:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>a (<span style="color:#a6e22e">column</span> [<span style="color:#ae81ff">20</span> <span style="color:#ae81ff">30</span> <span style="color:#ae81ff">40</span> <span style="color:#ae81ff">50</span>]))
(<span style="color:#66d9ef">def </span>b (<span style="color:#a6e22e">column</span> (range <span style="color:#ae81ff">4</span>)))
(- a b)
<span style="color:#75715e">;; =&gt; [20 29 38 47]</span>
</code></pre></div><p>The goal is to make the <code>column</code>, like the <code>dataset</code>, a first-class primitive within the tech stack. Like R&rsquo;s vectors and Numpy&rsquo;s <code>array</code>, the hope is that when people are working with tablecloth, users can reach for the <code>column</code> when they need to do some focused processing on a 1d (or perhaps 2d set of items).</p>
<h4 id="a-big-open-question-n-dimensionality">A big open question: n-dimensionality</h4>
<p>When I originally conceived of this project, I thought what we might be doing is bringing full-fledged support for n-dimensional arrays into tablecloth. Indeed, I orgiinally conceived of the project as an adjunct library called <code>tablecloth.array</code>. My thought was that this distinct library might eschew reliance on <code>tech.ml.dataset</code> &ndash; which has some startup costs &ndash; and simply rely on the lower-level library dtype-next, which has the key tools for efficient array processing and is in fact the basis for tech.ml.datset&rsquo;s columns.</p>
<p>However, for a number of reasons this is not practical. First, there is already a solid tool for array processing in the Clojure world: the <a href="https://github.com/uncomplicate/neanderthal">neanderathal</a> library by Dragan Djuric (<a href="https://twitter.com/draganrocks">@draganrocks</a>). Second, dtype-next is so low-level that some of the things that one might need, such as automatic scanning of the items in an array to determine their datatype, are not present by default. Right now, anyway, those features only exist within tech.ml.dataset&rsquo;s <code>Column</code> type. As such, what we decided to do is build directly on the tech.ml.dataset&rsquo;s <code>Column</code> as we get so much for free.</p>
<p>One consequence of this approach is that we cannot easily add n-dimensional support. The <code>column</code> in tech.ml.dataset, as the name might suggest, is not designed for multi-dimensionality. It is built on a single dtype-next buffer. There are possible approaches for layering on support for n-dimensionality, for example, as Chris Nurenberger put it:</p>
<blockquote>
<p>[A]s far as if a column could be N-D, you can take a linear random access
array and make it ND via an addressing operator&hellip;<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
</blockquote>
<p>This solution sounds like a promising approach, but involves sufficient complexity that I think it will remain out of scope for this project. Another idea that was batted around briefly was whether we could support just two dimensions if we just allowed tablecloth&rsquo;s column API to pass around a dataset internally as a kind of representation of a two dimensional matrix.</p>
<p>However, I think ghosting behind these technical implementation questions is a more general question of what people need. The impetus for this project was about usability. We already have powerful tools such as neanderthal and core.matrix that handle matrix operations. We wanted to build support for those kind of operations within the syntactical vernacular of tablecloth, which so many people have found pleasant to use. It&rsquo;s about making it so that users don&rsquo;t need to change tools, and with it their whole mental model for working with the tool they are using.</p>
<p>Yet I think it is fair to say we still don&rsquo;t know what people really need in this space. In that respect, I think of this project as an experiment. It is better that we do not go whole hog and try to get n-dimensions right away. What we&rsquo;ll do first is try to build a sensible column API for tablecloth and then see how (and if) it is used. Perhaps there will be a need for more dimensions; perhaps not.</p>
<h4 id="what-ive-done-so-far">What I&rsquo;ve done so far</h4>
<p>Now for what work has been done so far. Much of what I have been doing so far has been research. I have reviewed some key tutorials for Python Numpy (<a href="https://numpy.org/doc/stable/user/quickstart.html">here</a>) and R&rsquo;s vectors (<a href="https://adv-r.hadley.nz/vectors-chap.html">here</a>) in an attempt to study the other dominant APIs. I&rsquo;ve also had a planning session with the author of tablecloth, Tomasz Sulej, to think about dimensionailty issue detailed above as well as the kinds of functionality we want to target during this project.</p>
<p>Here roughly, are the main areas of work that we think now will emerge more or less in order:</p>
<ol>
<li>Establish the core &ldquo;primitive&rdquo; of the <code>column</code>, i.e. the entity that users will be able to create and manipulate;</li>
<li>Build out any necessary API for indexing, slicing and interating;</li>
<li>Lift various relevant operations and linear algebra functions that are in dtype-next into tablecloth, in particular dtype-next&rsquo;s &ldquo;functional&rdquo; namespace (i.e. <a href="https://github.com/cnuernber/dtype-next/blob/master/src/tech/v3/datatype/functional.clj"><code>tech.v3.datatype.functional</code></a>);</li>
<li>finally, consider importing ideas from R&rsquo;s &ldquo;factors&rdquo; and lapply iterators.</li>
</ol>
<p>So far the hard coding work that has been done relates to the first item above: establishing the <code>column</code> primitive. This <a href="https://github.com/scicloj/tablecloth/pull/71">PR</a> does two things:</p>
<ol>
<li>It establishes a new api domain: <code>tablecloth.column.api</code>. Rather than mixing column support into tablecloth&rsquo;s main api (<code>tablecloth.api</code>), Tomasz suggested we keep it distinct. This should help clarify when we are dealing with a column and when we are dealing with a dataset. It also means that we don&rsquo;t end up with naming collisions (e.g. for example there&rsquo;s already a <code>tablecloth.api/column</code> function).</li>
<li>It adds a basic set of core functions that establish the <code>column</code> primitive. These are:
<ul>
<li><code>column</code> - creates a column</li>
<li><code>column?</code> - identifies a column</li>
<li><code>typeof</code>/<code>typeof?</code> - identify the datatypes of the column&rsquo;s elements</li>
<li><code>ones</code> / <code>zeros</code> - create columns filled with ones or zeros</li>
</ul>
</li>
</ol>
<p>There&rsquo;s not a lot to say about these functions that is probably not rather obvious. One thing to note is that the inspiration is here being taken from both the R and Python worlds. R uses the name <code>typeof</code> for its typed &ldquo;atomic&rdquo; vectors, and Python&rsquo;s Numpy uses the functions <code>ones</code> and <code>zeros</code>. This practice of drawing on (hopefully the best) of the existing libraries in other languages is something that I intend to continue and do even more deeply, and which I believe is key to the Tomasz&rsquo;s strategy in building tablecloth to begin with.</p>
<h4 id="next-steps">Next steps</h4>
<p>Having established the <code>tablecloth.column.api</code> namespace, the next major step I think will be to build out from this simple core of functions making it possible to do more with columns. This means considering either basic operations or indexing, slicing, and iterating over columns. I have a sense that indexing, slicing, and iterating will take precedence.</p>
<p>I also want to try to quickly conduct a rough survey of the operations that we might include, a kind of working spec or planning document. This way I can look at the full set of operations in one place, and also understand what we may take from the various existing APIs from which we want to learn. In other words, what can concepts/functions may we want to darw on from Numpy, from R, from Julia, and so on.</p>
<h2 id="deep-diamond">Deep Diamond</h2>
<p>My goal with this round (Q1-2022) is to implement Recurrent Neural Networks (RNN) support in Deep Diamond.
The first month was dedicated to literature review (and other hammock-located work), exploration
of OneDNN implementation of RNN layers, and implementation of a RNN prototype in Clojure with Deep Diamond.
In the second month, I made the first iteration of fully functional vanilla RNN layer
based on the DNNL backend that fits into the existing high-level network building code.</p>
<p>Building on this, in the third month I finally managed to crack that tough nut called &ldquo;recurrent networks implementation libraries&rdquo;
and make:</p>
<ol>
<li>A nice RNN layer implementation that seamlessly fits into the existing low-level and high level Deep Diamond infrastructure.</li>
<li>The DNNL implementation of Vanilla RNN, LSTM, and GRU layers for the CPU (fully functional, but not ideal).</li>
<li>The low-level integration of Nvidia&rsquo;s CUDNN GPU library, including TESTS.</li>
<li>The high-level integration of CUDNN into Deep Diamond&rsquo;s layers (tests show that I need to improve this).</li>
<li>A functional test that demonstrates learning of the said layers with Adam and SGD learning algorithms.</li>
<li>I released a new version of Deep Diamond 0.23.0 with these improvements (RNN support should be considered a preview, as I still need to fix and polish some parts of CUDNN GPU implementation).</li>
</ol>
<p>Some notes about this milestone:</p>
<ul>
<li>Some things were smoother and easier than I expected. In general, I managed to find a way to fit RNNs into existing DD learning implementations, which was a pleasant surprise, as well as a sign of Clojure&rsquo;s qualities (and my ever increasing Clojure skills, if I am to stop being modest :)</li>
<li>Some other things were harder than I expected. Notably, RNN implementation in both DNNL and CUDNN has many moving parts and are notoriously cumbersome to configure.</li>
<li>There is total lack of simple examples of RNNs. Low level code examples of both of these libraries are practically non-existent in the wild. That slowed me a lot, since I had to discover everything by poking around.</li>
<li>The documentation for DNNL and CUDNN related to RNNs is helpful, but most details still had to be discovered through trial and error. That too made me go at a snail&rsquo;s pace compared to my earlier work on other parts of Deep Diamond.</li>
<li>Lacking simple examples, RNNs are very difficult to test. I am sure that this milestone, although usable, needs a lot more care to reach the level of usefulness of other parts of Deep Diamond.</li>
<li>On the bright side, I am very satisfied with the high level API. The user virtually has three simple functions: rnn, lstm, gru, and ending, which fit into the existing infrastructure, and don&rsquo;t require any work from the user other than putting them at the right place; everything gets configured automatically under the hood by Deep Diamond. This part, I like a lot.</li>
</ul>
<p>All in all, I am 80% satisfied with what I achieved in these 3 months. I hoped for a more complete implementation. On the other hand, I solved all tricky problems, and have clear idea how to fix and improve what is still not up to Uncomplicate standards, so I&rsquo;ll have something to work on in the following weeks/months. And it&rsquo;s finally time to update the book with these new goodies!</p>
<p>Thank you Clojurists for your continued trust in my work!</p>
<h2 id="overtone-playground">Overtone Playground</h2>
<p>Since the last project update I have been exploring overtone possibilities and finding ways to implement Sonic-Pi tutorial through my project. I have pushed the updates to the <a href="https://github.com/savorocks/overtone-playground">Overtone-Playground GitHub Page</a> where I have partially or fully covered the functionalities from the beginning chapters, such as playing notes, groups of notes, samples, playing melodies, looping what is played (similar to the powerful live_loop function in sonic-pi, but work still in progress), using function scheduler to play multiple sounds at the same time (which works well, but needs to be upgraded to allow more control to the user) and controlling loops with stop-loop function. The code is in the repository and the guides for using those functionalities are in the making and will be published soon. However, I do need an extension because I&rsquo;ve underestimated the complexity of the problem and overestimated the speed at which I can discover Overtone issues.
You can follow me on twitter <a href="https://twitter.com/savorocks">@savorocks</a> for future updates on the project, and there is also a category <a href="https://savo.rocks/categories/clojurists-together-2022-q1/">Clojurists Together 2022 Q1</a> on my website where you can see all the articles that are, and will be published regarding this funding.</p>
<h2 id="datahike-server">Datahike Server</h2>
<h3 id="second-update">Second Update</h3>
<p>The second iteration saw a lot of research and discussions on the JSON interface and the new target platform. Since a part of our team was on vacation we focused on fewer things this month.</p>
<h4 id="error-handling--testing">Error Handling &amp; Testing</h4>
<p>Better error handling and testing was added with the finalization of the historical database headers (<a href="https://github.com/replikativ/datahike-server/pull/40">https://github.com/replikativ/datahike-server/pull/40</a>). We separated dev mode and production configuration to better test both scenarios without re-using an existing database all the time.</p>
<h4 id="new-platform">New platform</h4>
<p>While finding a new target platform different languages were considered. While checking different surveys (<a href="https://insights.stackoverflow.com/survey/2021">https://insights.stackoverflow.com/survey/2021</a>, <a href="https://spectrum.ieee.org/top-programming-languages">https://spectrum.ieee.org/top-programming-languages</a>, <a href="https://redmonk.com/sogrady/2022/03/28/language-rankings-1-22">https://redmonk.com/sogrady/2022/03/28/language-rankings-1-22</a>, <a href="https://pypl.github.io/PYPL.html">https://pypl.github.io/PYPL.html</a>) of popular languages we were discussing which platform would be a good fit outside of JVM and JavaScript. The language should not be so esoteric that nobody would use it and not a specialised language where a database connection would not make sense. We agreed on a popular language that would support proper REST support, commonly used and maintained libraries, and that is also distinct to Lisp. In the end the decision was between Python, Ruby, PHP and Go. Python would be too much focused on Data Science and high performant databases, Ruby would be only work well with Ruby on Rails, and PHP is well PHP (part of us had to use it on their job a couple of years ago and were not a fan of it). So the new target platform will be Go with a simple REST client to the server.</p>
<h4 id="json-support">JSON support</h4>
<p>We are implementing support for JSON requests and responses, using the Muuntaja middleware stack for basic encoding and decoding, with route-specific parsing in handlers. Where feasible, we strive to include transparent conversion between strings and Clojure keywords and symbols. We investigated supporting fully transparent JSON-Datahike interoperability without requiring any usage of Clojure or Datalog syntax. However, that seems infeasible for <code>query</code> and <code>pull</code>, which can be too complex for reliably correct parsing of JSON. Still, for the next most complex Datahike API call, <code>transact</code>, it seems feasible at least in principle for common, simpler use cases. Thus, we take a two-tier approach: one with out-of-the-box JSON support for simple API calls, sufficient to cover most casual usage; and another, allowing or requiring JSON strings containing Clojure and Datalog syntax, for more advanced usage, including calls to <code>pull</code> and <code>query</code>. Please note that some uncertainty remains: for instance, we currently need to resolve a problem in implementing support in <code>transact</code> involving default decoding into <code>java.lang.Integer</code> where a <code>Long</code> is needed instead.</p>
<h4 id="outlook">Outlook</h4>
<p>The last month will see the implementation of the new JSON interface and subsequently the implementation of the new platform client. With the server API finished up, we will focus on adjusting the client API as well as the documentation while polishing the last open PRs from this iteration.</p>
<h4 id="beyond-clojurists-together-tasks">Beyond Clojurists Together Tasks</h4>
<p>We had a fix on the read handler and config tests. Additionally we adjusted extensively our benchmarks and backwards compatibility tests. Finally we started with better migration tooling that would support older versions and better intermediary export files.</p>
<h3 id="last-update">Last Update</h3>
<p>In the last iteration we focused heavily on the JSON interface and the Go client, as well as documentation and overall cleanup.</p>
<h4 id="cleanup-and-prs">Cleanup and PRs</h4>
<p>We finished up the open PRs like the <a href="https://github.com/replikativ/datahike-server/pull/40">historical-db-fix</a> and <a href="https://github.com/replikativ/datahike-server/pull/47">additional DB data</a>, so we have better database information for the clients to consume.</p>
<h4 id="go-client">Go Client</h4>
<p>Since we only worked with Clojure for some time, it took a little bit of effort getting back into the Go language. The <a href="https://github.com/replikativ/datahike-go-client">datahike-go-client</a> library was set up with very simple functionality without any caching for now and a basic rest client setup. First we started with basic GET handlers like fetching databases or fetching the current schema since the basic JSON responses were easily supported. Most time was spent on writing out the proper data types and coercing them from the JSON definitions. Yeah, we totally forgot how long it takes to write this boiler plate in all that typed languages out there and without a REPL the whole development cycle was event slower since everything needed to be covered with tests. Finally with the implementation of the JSON interface we could also implement the POST interfaces that would include transactions and queries. Now we have our first foreign platform client and are eager to test it.</p>
<h4 id="json-support-1">JSON support</h4>
<p>We added support for JSON requests and responses across Datahike Server API endpoints. This is done via a two-tier approach (mentioned in the last report): one tier with out-of-the-box JSON support for simple API calls, sufficient to cover most casual usage; and another, requiring JSON strings containing Clojure and Datalog syntax, for more advanced usage, including calls to <code>pull</code> and <code>query</code>. At the moment, most endpoints belong only to one or the other (or neither, if no arguments are required), with the only exception being <code>load-entities</code>, which requires Clojure syntax in JSON requests to databases with <code>:schema-flexibility</code> <code>:read</code>, and vanilla JSON otherwise.</p>
<p>Subject to syntax requirements (documentation in progress), both tiers encode and decode keywords (including namespaced keywords), symbols, and lists. Sets are also supported in server responses, but not requests, since they are to the best of our knowledge rarely or never used there.</p>
<p>In terms of database-specific expressions, our JSON support includes cardinality-many attributes, lookup refs, and attribute references.</p>
<p>The &ldquo;advanced&rdquo; tier is written to support arbitrarily complex expressions, with no loss of expressivity relative to EDN. As for the &ldquo;simple&rdquo; or rather out-of-the-box tier, its functionality should be largely identical to that available using EDN data, with limitations largely relevant to the <code>transact</code> endpoint, which does not support tuple-valued attributes, transacting datoms directly, and the operations <code>:db.fn/call</code>, <code>:db/cas</code> or <code>:db.fn/cas</code>, <code>:db.install/_attribute</code>, <code>:db.install/attribute</code>, and <code>:db.entity/preds</code>&ndash;which are rarely used anyway, as far as we know.</p>
<h4 id="limitations-and-future-work">Limitations and future work</h4>
<p>Types and tagged literals are not yet fully supported, though that is a high-priority to-do.</p>
<p>We plan to extend <code>transact</code>, <code>datoms</code>, <code>seek-datoms</code>, <code>entity</code>, <code>schema</code>, <code>reverse-schema</code>, and <code>index-range</code>, in the out-of-the-box tier, to allow &ldquo;advanced&rdquo; Clojure-inclusive syntax as well.</p>
<p>In addition, we would like to revisit the feasibility of minimizing handler-level parsing by maximizing usage of Muuntaja and Jsonista functionality in the middleware chain, for improved performance and cleaner code.</p>
<h4 id="database-and-server-metrics">Database and server metrics</h4>
<p>We are finalizing on-demand (as opposed to pre-computed) datom and index metrics for Datahike, as well as query and transaction time logging on the Server. Backend and library versions are in the works, pending updates to upstream libraries, primarily Konserve.</p>
<h4 id="outlook-1">Outlook</h4>
<p>With a JSON interface now integrated into the server we are able to experiment with other platforms where people can harness the power of Datalog. For that we started writing a blog post on how to do that in plain Go so other contributors can implement a simple REST wrapper in their favorite language.
Since the development in this context heavily focussed on moving the server forward, we now want to step back a little bit and work on more basic issues in Datahike, mainly performance improvements with the index, convenience functions for import/export through the <a href="https://github.com/lambdaforge/wanderung">wanderung</a> library, <a href="https://github.com/replikativ/datahike/pull/546">documentation with clerk</a> instead of plain markdown files, <a href="https://github.com/replikativ/datahike/pull/538">benchmarking</a> improvements so we can see regressions, and more <a href="https://github.com/replikativ/datahike/pull/537">compatibility checks</a>. Additionally, we&rsquo;re trying to introduce <a href="https://polylith.gitbook.io/polylith/">polylith</a> to our stack since there are too many namespaces that share the same code and a lot of dependencies that need to be updated collectively.</p>
<p>We&rsquo;re very grateful to Clojurists Together for allowing us to work on the things that we care for. Thanks guys! :)</p>
<h2 id="conjure">Conjure</h2>
<h3 id="first-update">First Update</h3>
<p><a href="https://github.com/Olical/conjure">Conjure</a> has been moving forward on many fronts over the last few months. Some of that work is related to non-Clojure language support (such as Julia and Common-Lisp), some is to do with the underlying Fennel system (<a href="https://github.com/Olical/aniseed">Aniseed</a>) but the majority of the commits were improving the Clojure client is various ways.</p>
<p>It&rsquo;s also worth noting that the release I put out today for this Clojurists Together checkpoint was the 100th release! That&rsquo;s 100 tags, each containing many commits, since 2018 or so when I started work on my perfect Clojure interactive evaluation environment. I&rsquo;m so happy with the state of Conjure today, I&rsquo;m proud of what I managed to build and I&rsquo;m so impressed with the community interaction and contributions. Seeing the (almost) 1000 stars on GitHub and hundreds of members in <a href="https://conjure.fun/discord">our Discord</a> is wonderful.</p>
<p>You can read all the juicy details of every recent release on the <a href="https://github.com/Olical/conjure/releases">GitHub releases page</a> but I&rsquo;ll highlight my favourite parts here.</p>
<ul>
<li>Automatic support for nREPL 0.8+ <code>lookup</code> and <code>completions</code> operations when you don&rsquo;t have the CIDER middleware up and running.</li>
<li>Improvements to <code>:ConjureClientState</code> so you can swap your active REPLs around a little easier.</li>
<li>Support for <code>cljs.test</code> when executing your tests (this requires configuration to switch over).</li>
<li>Further tree-sitter fixes and support when extracting code from your buffer for evaluation.</li>
<li>Safer Shadow CLJS interactions so you can execute the Shadow select commands as many times as you want without weird errors. Essentially idempotent now.</li>
<li>Prevent weird duplicate logs on connection to an nREPL that announced the type of the REPL you were connecting to. It used to print &ldquo;timeout&rdquo; then &ldquo;Clojure&rdquo;, that&rsquo;s fixed.</li>
<li>Handle <em>so many</em> Neovim breaking changes in backwards compatible ways to support the ecosystem of Neovim + Conjure users as they transition to the latest stable version.</li>
<li>Default to using tree-sitter if all the conditions are met, you probably won&rsquo;t notice this, but things will get faster in large buffers with lots of code as autocompletions pop up and you pick code for evaluation.</li>
<li>Better checking for nREPL / shadow-cljs port files at each directory level. The logic makes more sense now, you&rsquo;ll just notice connecting to the &ldquo;right&rdquo; nREPL port file in some cases now. Thank you so much to @stelcodes for this one!</li>
<li>Created a Conjure client compatibility matrix for contributors and users to rely on <a href="https://github.com/Olical/conjure/wiki/Client-features">https://github.com/Olical/conjure/wiki/Client-features</a></li>
</ul>
<p>There&rsquo;s also been so much work done to Aniseed, the underlying Fennel Lisp system Conjure is built with as well as the various clients alongside the core Clojure one. I&rsquo;ve managed to close of a bunch of bugs and clean up tickets that have been lingering for far too long.</p>
<p>The next batch of work under Clojurists Together will be the long awaited interactive debugger support. Hopefully everything goes well and it&rsquo;s possible, it&rsquo;s what I&rsquo;ve wanted to do as part of this funding all along. My second and final update here in a few months should hopefully involve interactive stepping debugging of Clojure from Neovim!</p>
<p>Thank you so very much to each and every one of you who uses, supports, funds or contributes to Conjure and it&rsquo;s associated projects. I cannot express my gratitude enough here, so I will instead carry on trying to build the best conversational software development platform out there for you.</p>
<h3 id="second-update-1">Second Update</h3>
<p>Since my last update on <a href="https://github.com/Olical/conjure">Conjure</a> I&rsquo;ve managed to get a few more key fixes and features in as well as learned enough to realise I need to take on yet another open source project (you&rsquo;ll be interested in this even if you don&rsquo;t use Neovim!). I&rsquo;ve completed the main feature I wanted to finish as part of this funding round (debugging) and started a longer journey to supersede it eventually (even better editor agnostic debugging).</p>
<p>Here&rsquo;s a quick overview of <a href="https://github.com/Olical/conjure/compare/v4.34.0...v4.36.0">the changes since the my last project update</a>:</p>
<ul>
<li>Added CIDER debugger support! You can now initialise the CIDER debugger then step through break points, inspecting and modifying values as you go. See the wiki page on the <a href="https://github.com/Olical/conjure/wiki/Clojure-nREPL-CIDER-debugger">Clojure nREPL CIDER debugger</a> for more information.</li>
<li>Guarded against various subtle type errors such as <code>nil</code> REPL ports and attempts to concatenate strings with <code>nil</code> values.</li>
<li>Refactored the non-tree-sitter based evaluation code into a lazy loaded module that isn&rsquo;t executed at all if you rely on tree-sitter for your Conjure evaluations.</li>
<li>Improved <code>:ConjureSchool</code> so it only appends the next lesson once, so you can perform a lesson many times without it filling the school file with repeated instructions.</li>
<li>Support evaluating Clojure sets, inline functions, reader conditionals and some quoted forms as long as you&rsquo;re using tree-sitter. No more evaluating <code>#{:foo :bar}</code> as <code>{:foo :bar}</code>! It now correctly includes the <code>#</code> prefix!</li>
<li>Fixed nREPL session operations, such as creating, cycling and listing, when you have a long running process blocking the current session&rsquo;s thread. So now you can start a long running process and then cycle to a new session to keep evaluating things in another, unblocked, thread. This was a subtle bug introduced quite a long time ago by another fix. My apologies!</li>
</ul>
<p>The debugger support is the star of the show, I hope you enjoy this new support and help me improve it into the future with issue reports and pull requests. It&rsquo;s fairly minimal but that&rsquo;s where the new open source project I mentioned comes into play.</p>
<p>Introducing the <a href="https://github.com/Olical/clojure-cider-dap-server">Clojure CIDER DAP server</a> (which is an empty repository at the time of writing)! This project fell out of all of my Clojure debugging research, it will bridge the gap between DAP compatible tools (such as <a href="https://github.com/mfussenegger/nvim-dap">nvim-dap</a>) in any editor and the CIDER debugger tooling.</p>
<p>This new, editor agnostic, standalone, CLI tool will allow you to plug your editor&rsquo;s debugger support into a running nREPL server. You will be able to perform interactive debugging with powerful tools, in or outside of Neovim, in a shared nREPL connection with Conjure.</p>
<p>The goal will be to make this the primary way of debugging your Clojure applications with Conjure&rsquo;s built in support being a simpler fallback for when you don&rsquo;t have a choice or when you don&rsquo;t need a rich GUI.</p>
<p>So, I hope you&rsquo;ve enjoyed the features, fixes, improvements and optimisations I&rsquo;ve brought to Conjure over my Clojurists Together funding period. And I really hope you enjoy my upcoming further work in the debugger tooling space, regardless of your editor or REPL tooling choices.</p>
<p>I&rsquo;d love to hear your thoughts, opinions, feelings and feedback on Twitter <a href="https://twitter.com/OliverCaldwell">@OliverCaldwell</a>. Bye for now!</p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<ul>
<li>CIDER 1.4 (&ldquo;Kyiv&rdquo;) and 1.4.1 were released
<ul>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.4.0">https://github.com/clojure-emacs/cider/releases/tag/v1.4.0</a></li>
<li><a href="https://github.com/clojure-emacs/cider/releases/tag/v1.4.1">https://github.com/clojure-emacs/cider/releases/tag/v1.4.1</a></li>
</ul>
</li>
<li>compliment 0.3.3
<ul>
<li><a href="https://metaredux.com/posts/2022/06/20/compliment-0-3-13.html">https://metaredux.com/posts/2022/06/20/compliment-0-3-13.html</a></li>
</ul>
</li>
<li>cider-nrepl 0.28.4 and 0.28.5</li>
<li>Discussions around nREPL improvements
<ul>
<li>Missing features discussion <a href="https://github.com/nrepl/nrepl/discussions/275">https://github.com/nrepl/nrepl/discussions/275</a></li>
<li>Protocol improvements and protocol compliance <a href="https://github.com/nrepl/nrepl/discussions/275">https://github.com/nrepl/nrepl/discussions/275</a></li>
</ul>
</li>
<li>Making CIDER more Clojure agnostic
<ul>
<li>CIDER was making some assumptions about the runtime (it was basically expecting Clojure or ClojureScript)</li>
<li>I&rsquo;ve adjusted some code in CIDER so it&rsquo;d play better with alternative Clojure implementation (e.g. nbb)</li>
<li>Down the road we can make CIDER play nicer with any nREPL implementation</li>
</ul>
</li>
<li>Unreleased CIDER improvements:
<ul>
<li>Add custom var <code>cider-merge-sessions</code> to allow combining sessions in two different ways: Setting <code>cider-merge-sessions</code> to <code>'host</code> will merge all sessions associated with the same host within a project. Setting it to <code>'project</code> will combine all sessions of a project irrespective of their host.</li>
<li>Improve cider-browse-ns interface to allow selective hiding of var types as well as grouping options. Include private vars in result list.</li>
</ul>
</li>
<li>Unreleased nREPL improvements
<ul>
<li>Allow reader conditionals for tty transport.</li>
</ul>
</li>
</ul>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<h3 id="babashka-clihttpsgithubcombabashkacli"><a href="https://github.com/babashka/cli">Babashka CLI</a></h3>
<p>Turn Clojure functions into CLIs!</p>
<p>This is one of my newest projects. It aims to close the gap between good command line UX and calling Clojure functions. It is very much inspired by the clojure CLI, but solves a problem which sometimes causes frustration, especially among Windows users: having to use quotes in a shell. It also offers support for subcommands. One project benefiting from that is <a href="https://github.com/babashka/neil">neil</a>. I blogged about babashka CLI <a href="https://blog.michielborkent.nl/babashka-cli.html">here</a>.</p>
<h3 id="http-serverhttpsgithubcombabashkahttp-server"><a href="https://github.com/babashka/http-server">Http-server</a></h3>
<p>Serve static assets.</p>
<p>Another new project is http-server, which can be used in Clojure JVM and babashka to serve static assets in an http server.</p>
<h3 id="clj-kondo-workshophttpsgithubcomclj-kondohooks-workshop-clojured-2022"><a href="https://github.com/clj-kondo/hooks-workshop-clojured-2022">Clj-kondo workshop</a></h3>
<p>In June I had the honor and pleasure to give a workshop about <a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a> at <a href="https://clojured.de/">ClojureD</a>. You can work through the material yourself if you&rsquo;d like <a href="https://github.com/clj-kondo/hooks-workshop-clojured-2022">here</a>. Feel free to join the clj-kondo channel on Clojurians Slack for questions. Here are some <a href="https://twitter.com/borkdude/status/1542521071588347905">pictures</a> from the event.</p>
<h3 id="jethttpsgithubcomborkdudejet"><a href="https://github.com/borkdude/jet">Jet</a></h3>
<p>CLI to transform between JSON, EDN and Transit, powered with a minimal query language.</p>
<p><a href="https://github.com/borkdude/jet/blob/master/CHANGELOG.md">Changelog</a></p>
<p>The <code>jet</code> binary is now available for Apple Silicon and adds <a href="https://github.com/redplanetlabs/specter">specter</a> as part of the standard library for transforming data. Also, the output is colorized and pretty-printed using <a href="https://github.com/greglook/puget">puget</a> now.</p>
<h3 id="edamamehttpsgithubcomborkdudeedamame"><a href="https://github.com/borkdude/edamame">Edamame</a></h3>
<p><a href="https://github.com/borkdude/edamame/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Configurable EDN/Clojure parser with location metadata. It has been stable for a while and reached version 1.0.0. The API is exposed now in <a href="https://github.com/babashka/babashka">babashka</a> and <a href="https://github.com/babashka/nbb">nbb</a> as well.</p>
<h3 id="quickdochttpsgithubcomborkdudequickdoc"><a href="https://github.com/borkdude/quickdoc">Quickdoc</a></h3>
<p>Quickdoc is a tool to generate documentation from namespace/var analysis done by clj-kondo. It&rsquo;s fast and spits out an <code>API.md</code> file in the root of your project, so you can immediately view it on Github. It has undergone significant improvements in the last two months. I&rsquo;m using quickdoc myself in several projects.</p>
<h3 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h3>
<p>Scripting in Clojure on Node.js using SCI.</p>
<p><a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">Changelog</a></p>
<p>Added <code>edamame.core</code>, <code>cljs.math</code>, nREPL improvements and now has significant faster startup due to an improvement in <a href="https://github.com/babashka/sci">SCI</a>.</p>
<h3 id="clojure-lsphttpsgithubcomclojure-lspclojure-lsp"><a href="https://github.com/clojure-lsp/clojure-lsp">Clojure-lsp</a></h3>
<p>Clojure/Script Language Server (LSP) implementation.</p>
<p>This project is driven by the static analysis done by <a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a> and used by many people to get IDE-like features in editors like emacs and VSCode.</p>
<p>I added support for Apple Silicon using <a href="https://cirrus-ci.org/">Cirrus CI</a>.</p>
<h3 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h3>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<p><a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Two new version of babashka were released:</p>
<p>0.8.2 and 0.8.156. The last segment of the version number now indicates the release count, so the last release is the 156th release.</p>
<p>Babashka now also has a new Apple Silicon binary built on <a href="https://cirrus-ci.org/">Cirrus CI</a>. What is very exciting is that babashka can now execute <a href="https://github.com/plumatic/schema">schema</a> from source. Compatibility with <a href="https://github.com/metosin/malli/pull/718">malli</a> is underway.</p>
<h3 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h3>
<p>A linter for Clojure code that sparks joy.</p>
<p><a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">Changelog</a></p>
<p>New linters:</p>
<ul>
<li><a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#warn-on-reflection"><code>:warn-on-reflection</code></a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#redundant-call"><code>:redundant-call</code></a></li>
<li><a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#discouraged-namespace"><code>:discouraged-namespace</code></a></li>
</ul>
<p>Clj-kondo now also has a new Apple Silicon binary built on <a href="https://cirrus-ci.org/">Cirrus CI</a>.</p>
<h3 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h3>
<p>Configurable Clojure interpreter suitable for scripting and Clojure DSLs. Powering babashka, nbb, joyride and many other projects.</p>
<p><a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md">Changelog</a></p>
<p>New releases: 0.3.5 - 0.3.32</p>
<p>Highlights:</p>
<ul>
<li>New <code>sci.async</code> namespace for asynchronous loading of code</li>
<li>Reduce advanced compiled JS output with about 20% (~900kb -&gt; ~740kb)</li>
<li>Many improvements to <code>defrecord</code></li>
</ul>
<h3 id="sci-configshttpsgithubcombabashkasciconfigs"><a href="https://github.com/babashka/sci.configs">SCI configs</a></h3>
<p>A collection of ready to be used SCI configurations.</p>
<p>This project contains configurations for reagent, promesa, etc. and are used in nbb, clerk and other projects.</p>
<p>A recent addition was a configuration for <code>cljs.test</code> which is now shared by nbb and <a href="https://github.com/BetterThanTomorrow/joyride">joyride</a>.</p>
<h3 id="processhttpsgithubcombabashkaprocess"><a href="https://github.com/babashka/process">Process</a></h3>
<p><a href="https://github.com/babashka/process/blob/master/CHANGELOG.md">Changelog</a></p>
<p>New releases: 0.1.2 - 0.1.4</p>
<p>Highlights:</p>
<p>Support <code>exec</code> call in GraalVM <code>native-images</code> - this means you can replace the current process with another one.</p>
<h3 id="scittlehttpsgithubcombabashkascittle"><a href="https://github.com/babashka/scittle">Scittle</a></h3>
<p>The Small Clojure Interpreter exposed for usage in browser script tags.</p>
<p>Added support developing CLJS via nREPL. See <a href="https://github.com/babashka/scittle/tree/main/doc/nrepl">docs</a>.</p>
<h3 id="etaoinhttpsgithubcomclj-commonsetaoin"><a href="https://github.com/clj-commons/etaoin">Etaoin</a></h3>
<p>Pure Clojure Webdriver protocol implementation.</p>
<p>This project is now compatible with babashka! Most of the work on this project was done by Lee Read. If you appreciate his work on this, or other projects like <a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>, consider <a href="https://github.com/sponsors/lread">sponsoring</a> him.</p>
<h3 id="misc">Misc</h3>
<p>Brief mentions of miscellaneous other projects I worked on:</p>
<ul>
<li><a href="https://github.com/borkdude/nbb-action-example">nbb-action-example</a> - example of how to build a Github Action with <a href="https://github.com/babashka/nbb">nbb</a>.</li>
<li><a href="https://github.com/BetterThanTomorrow/joyride">joyride</a> - Making VS Code Hackable since 2022</li>
<li><a href="https://github.com/borkdude/dynaload">dynaload</a> - The dynaload logic from clojure.spec.alpha as a library</li>
<li><a href="https://github.com/borkdude/deps.clj">deps.clj</a> - A faithful port of the clojure CLI bash script to Clojure.</li>
<li><a href="https://github.com/babashka/fs">fs</a> - File system utility library for Clojure</li>
<li><a href="https://github.com/borkdude/fly_io_clojure">fly-io-clojure</a> - A fly.io example for Clojure. Also see examples for <a href="https://github.com/babashka/babashka/tree/master/doc/fly_io">babashka</a> and <a href="https://github.com/babashka/nbb/tree/main/doc/fly_io">nbb</a>.</li>
<li><a href="https://github.com/babashka/pod-babashka-etaoin">pod-babashka-etaoin</a> - Babashka pod wrapping Etaoin</li>
<li><a href="https://github.com/babashka/pod-babashka-fswatcher">pod-babashka-fswatcher</a> - Babashka filewatcher pod</li>
</ul>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>During this reporting period, I focused more on behind-the-scenes work, due to having
a tough schedule on other Clojurists Together project in May (Q1 Deep Diamond). That
left me with less energy for other coding and releases, but OTOH enabled me to work on
foundations of the planned work, specifically Clojure Sound devices and music skills,
Neanderthal sparse matrices, Deep Diamond backends and stability work, etc.</p>
<p>This does not mean that I don&rsquo;t have anything to show, of course! I do, but maybe not as
much as I showed in other reports :)</p>
<p>So, let&rsquo;s start with releases:</p>
<ul>
<li>Neanderthal, 2 releases (0.44.0, 0.44.1)</li>
<li>Deep Diamond (not including releases that were part of Q1-2022), 1 release (0.23.1)</li>
<li>ClojureCUDA, 2 releases (0.23.0, 0.23.1)</li>
<li>Clojure Sound, 1 release (0.2.0)</li>
</ul>
<p>I finally started writing tutorials on my blog. This June I published 4 articles</p>
<ul>
<li>Maple Leaf Rag with Clojure Sound</li>
<li>Clojure Sound 2 - A better piano</li>
<li>My experience with Clojurists Together open source funding (attracted some mild attention on Hacker News).</li>
<li>Clojure Sound 3 - Hello MIDI Controller</li>
</ul>
<p>Fundamentals and hammock time (this is actually sometimes that I spent most of my time on):</p>
<ul>
<li>Continued poking and researching cuDNN backend for Deep Diamond</li>
<li>Investigated how to implement sparse matrices in Neanderthal</li>
<li>Looked at the possibility of implementing another backend for MKL based on javacpp&rsquo;s API and distribution (still undecided about this).</li>
<li>Debugged issues in Uncomplicate libraries that users reported on various OS configurations (mostly related to user errors, but this is valuable since it indicates how to improve documentation and tutorials)</li>
<li>And, as during the last few reporting periods, most of my time was spent on music fundamentals, including learning about theory, instruments, and controlling devices (which could be used for making music, but also as input devices for programming-related tasks; think Emacs pedals). This is a long process, but I think it will pay off handsomely in the mid-term future, as I&rsquo;m planning a course/book/tutorials that teach Clojure programming through music, and music through programming. I hope that this could attract people who have some music skills (kids and adults alike) but would like to learn programming, to choose Clojure. Also, Clojurists would hopefully benefit, as they can learn music and have a more interesting domain for Clojure showcases (not every example needs to be a TODO web-app!).</li>
</ul>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.19.5 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Notable Updates</p>
<ul>
<li>Updated to the newest ClojureScript and Closure Compiler releases</li>
<li>Fixed support for data_readers.cljc to match CLJS behavior</li>
<li>A few smaller cleanups and bugfixes</li>
</ul>
<h2 id="david-nolen">David Nolen</h2>
<ul>
<li>ClojureScript core.async: #js literal support</li>
<li>ClojureScript Test GitHub CI for Windows</li>
<li>General ClojureScript JIRA issues review</li>
<li>Support Node.js &ldquo;exports&rdquo; in package.json (Fixes Firebase v9 usage)</li>
</ul>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hello everybody, this is Niki Tonsky and we continue working for the greater good of Clojure Community.</p>
<p><a href="https://github.com/HumbleUI/HumbleUI">HumbleUI</a>:</p>
<p>Main topic for last two months: text fields! Surprisingly complicated beasts. I have a list of 47 tasks related to it, so far I’ve managed to complete 35 of them, or ~75%.</p>
<ul>
<li>Text field: Support macOS emacs shortcuts in</li>
<li>Use BreakIterator to iterate chars, jump by word</li>
<li>clipboard/get, /set, /get-text, /set-text, cut-copy-paste</li>
<li>Align</li>
<li>Scroll follows cursor, horizontal paddings</li>
<li>Fix move word after delete</li>
<li>Click, drag, double click, triple click support</li>
<li>ui/with-cursor, :padding-h/:padding-top/:padding-bottom</li>
</ul>
<p>Also:</p>
<ul>
<li>Merged tooltip example by @Folcon</li>
<li>Better error containment in dynamic</li>
</ul>
<p><a href="https://github.com/HumbleUI/JWM">JWM</a>:</p>
<ul>
<li>Catch exception in eventListener.accept(e) to remove it from the queue</li>
<li>macOS: fixed Window.setIcon</li>
<li>Helped @dzaima merge resize cursors</li>
<li>macOS: fixed race condition in requestFrame</li>
<li>macOS: fixed requestFrame calls before setVisible</li>
<li>macOS: Merged window focus events by @LuisThiamNye</li>
<li>macOS: Merged restoring cursor when re-entering window by @LuisThiamNye</li>
</ul>
<p><a href="https://github.com/HumbleUI/Skija">Skija</a>:</p>
<ul>
<li>Surface::makeImageSnapshot can now correctly return null #23</li>
</ul>
<p>ClojureScript:</p>
<ul>
<li><a href="https://github.com/clojure/clojurescript/commit/7af8c42f6a9c045b4c5e213163a04816935ebe42">CLJS-3382 Fixed regression in 1.11.54 that broke Rum</a></li>
</ul>
<p><a href="https://github.com/tonsky/datascript">DataScript</a>:</p>
<ul>
<li>Check for nils in upsert attributes</li>
<li>Mention externs for shadow-cljs users #432</li>
</ul>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a>:</p>
<ul>
<li>Fixed clojure_sublimed_eval_code #75</li>
<li>Fixed clojure_sublimed_insert_newline with multicursor #72</li>
</ul>
<p>And some Clojure-related blogging:</p>
<ul>
<li><a href="https://tonsky.me/blog/network-eval/">Ideas for Clojure Network Eval API</a></li>
<li><a href="https://github.com/nrepl/nrepl/discussions/275">Missing features in nREPL</a></li>
</ul>
<section class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1" role="doc-endnote">
<p>Chris Nurenberger, &ldquo;High Performance Data with Clojure.&rdquo;
<em>YouTube</em>, 9 June 2021, <a href="https://youtu.be/5mUGu4RlwKE">https://youtu.be/5mUGu4RlwKE</a>. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Chris Nurenberger. Message posted to #data-science channel,
topic: &ldquo;matrix muliplication in dtype-next&rdquo;. <em>Clojurians Zulip</em>, 20
September 2021. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</section>
]]></content:encoded>
    </item>
    
    <item>
      <title>April 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/april-2022-monthly-update/</link>
      <pubDate>Tue, 10 May 2022 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/april-2022-monthly-update/</guid>
      <description>Read updates from Overtone Playground, Datahike Server, Biff, Orchard, Typed Clojure, Reveal, Deep Diamond, Firefox, Clojure LSP and more updates from our long term projects with Bozhidar Batsov, Michiel Borkent, Dragan Djuric, Thomas Heller, David Nolen, and Nikita Prokopov</description>
      <content:encoded><![CDATA[<h2 id="overtone-playground">Overtone Playground</h2>
<p>My goal for this project is to provide a clear instruction on how to set-up and use Overtone without the hassle of going through bunch of errors and wrong steps which can amplify the frustration and prevent users from exploring programming and music through live coding. Since <a href="https://sonic-pi.net/tutorial.html">Sonic-Pi Tutorial</a> is a good example of how starting guide for live coding should look like, my goal is to make similar one for experimenting with Overtone.</p>
<p>So far I have covered:</p>
<ul>
<li>System audio setup: The first step, and usually overlooked is that Overtone needs JACK (or PipeWire alternative) to work, and I have covered audio setup step-by-step in <a href="https://savo.rocks/posts/pipewire-effortless-linux-audio/">Pipewire: Effortless Linux Audio</a> article on my blog. Although JACK is more mature and widespread software I was positively surprised that Pipewire is also very stable and much simpler to setup/use, so I absolutely recommend it.</li>
<li>Overtone Setup From Scratch: This part covers creating a Clojure project, loading Overtone as a dependency, various little things that could come up as obstacles in the process, connecting audio inputs and outputs, and finally, trying to produce some sounds with basic Overtone functions to test if everything is set up correctly. More details about the process can be found in my <a href="https://savo.rocks/posts/overtone-basic-setup/">Overtone: Basic Setup</a> article.</li>
<li>Editor Setup (VS Code + Calva): I wanted to cover one of the most popular editors (if not THE most popular) when we look at general programming population: VS Code. Since my goal is not only to attract just Clojure programmers to try Overtone, but everyone regardless of the programming language they use, if they are programmers at all! The <a href="https://savo.rocks/posts/setting-up-vs-code-for-clojure-and-overtone-development/">Setting up VS Code for Clojure and Overtone development</a> article covers complete setup of the environment to be used with Clojure and Overtone, as well as some more Overtone code that slowly introduces us to the interesting capabilities of the software.</li>
<li>Complete Emacs Setup (CIDER + Prelude + Custom Tweaks): It was very important for me, as an avid Emacs user to properly cover advanced Emacs setup because a lot of newcomers to Clojure or generally programming will just pick what&rsquo;s the &ldquo;easiest&rdquo;, so they will go with &ldquo;standard&rdquo; editors and later when they hear about Emacs again it will be much harder to make the switch. In article named <a href="https://savo.rocks/posts/starting-your-computer-music-journey-with-clojure-and-overtone-in-emacs/">Starting Your Computer Music Journey with Clojure and Overtone in Emacs</a> I covered in great detail and explained the following aspects: Emacs setup, what is CIDER and how to set it up, introduced Prelude enhancements for Emacs which are probably the most important as they significantly boost Emacs experience. Finally, I have also mentioned several of my custom tweaks and why I recommend them. To make article complete, I covered in detail how to start Clojure project with Overtone, some of the Emacs' most used keybindings and provided more Overtone test examples that build on the previous code, so everybody can start experimenting on their own. The article attracted significant crowd, the <a href="https://news.ycombinator.com/item?id=30971282">HackerNews Post</a> was featured on front page and many people on other platforms had positive reactions.</li>
</ul>
<p>This is the advantage of continuous guide publishing through blog form; it keeps people interested and they engage more often, providing valuable feedback which helps me to write more useful guides in the future, covering areas which maybe I won&rsquo;t think of.</p>
<p>I have updated the <a href="https://github.com/savorocks/overtone-playground">Overtone Playground GitHub</a> project directory which can be cloned and used right away. Some features from the first few chapters of Sonic-Pi tutorial are implemented and can be used in similar manner right away. Guides in my following blog post will cover that process in a similar fashion to Sonic-Pi tutorials, where possible. All my posts that are part of this guide are listed on <a href="https://savo.rocks">My Website</a> under the category <a href="https://savo.rocks/categories/clojurists-together-2022-q1/">Clojurists Together 2022 Q1</a>, so you can bookmark the link if you want to stay tuned.</p>
<h2 id="datahike-server">Datahike Server</h2>
<p>The first iteration focused on planning and updating the server API to the latest library API as well as design and implementation of relevant metrics in Datahike. Additionally we started on the first history integration into the server API.</p>
<h4 id="server-rest-api">Server REST API</h4>
<p>The basis for any updates was a comparison table between available functions on <code>datahike.api</code> versus the current REST API in <code>datahike-server</code> and <code>datahike-client.api</code>. Datahike has grown since our last update on the server, so several additional functions needed to be added and some existing functions needed to be updated with additional functions. This resulted in the current PR 39 (<a href="https://github.com/replikativ/datahike-server/pull/39">https://github.com/replikativ/datahike-server/pull/39</a>) While updating the API we also improved the testing behavior but we&rsquo;re not fully satisfied with the result. So we plan to extend the tests in the next iteration with better coverage.</p>
<h4 id="server-history">Server History</h4>
<p>With history as one of the core functionality in Datahike, we needed to integrate this to the REST API as well. After some experiments and approaches, we decided on simple header arguments for history database selection together with selected REST API endpoints that can support history like <code>q</code> or <code>datoms</code>.  The first basic implementation was finished with the branch <code>historical-db</code>(<a href="https://github.com/replikativ/datahike-server/tree/historical-db">https://github.com/replikativ/datahike-server/tree/historical-db</a>) together with first tests. Together with the better test coverage plan from the Server API we want to extensively test these functions as well in the next iteration.</p>
<h4 id="database-metrics">Database Metrics</h4>
<p>We began implementation of database index count metrics with per-transaction updates, but found that the opacity of whether a net addition of a datom has occurred during upsert, plus the unavailbility of a cheap <code>count</code> field or operation on the hitchhiker tree, make a performant and precise synchronous counter for arbitrary index structures infeasible. For now, we have settled on an on-demand count operation with caching as applicable (see in-progress <a href="https://github.com/replikativ/datahike/pull/515">pull request</a>), with additional or improved implementation options in the future. Database-level metrics reporting backend and lib versions are also in progress.</p>
<h4 id="outlook">Outlook</h4>
<p>The next phase will see three milestones. First we will finish up the tasks from the first iteration, that means first the testing framework with refactoring of the current testing namespaces into separate ones, and in paralllel the integration of metrics into library and server. Second the work on the definition of the JSON specification will start with a proposition on how to handle different data models accordingly and consequently. And third we will collect different platforms, where we want to create a simple client as a wrapper around the REST API. Currently we&rsquo;re thinking about either C#, Go or Rust there.</p>
<h4 id="beyond-clojurists-together-tasks">Beyond Clojurists Together Tasks</h4>
<p>This month saw some fixes in Datahike. The fix of the migration with attribute references, improved docs, major dependencies update with breaking changes for the storage layout and insertion behavior fixes. With the latest release we solved a problem with retractions within our index.</p>
<h2 id="biff">Biff</h2>
<p>Since writing the last update, I have:</p>
<ul>
<li>Finished the <a href="https://biffweb.com/docs/">main documentation</a></li>
<li>Wrote the <a href="https://biffweb.com/api/com.biffweb.html">API documentation</a></li>
<li>Released <a href="https://biffweb.com/p/new-release/">the new Biff version</a>!</li>
<li>Made two screencasts (<a href="https://biffweb.com/p/demo-getting-started/">one</a> for
setting up a new project, and <a href="https://biffweb.com/p/demo-dev-in-prod/">the
other</a> for developing in production)</li>
<li>Made plans for <a href="https://biffweb.com/p/platypub-plans/">a large example
project</a>. In addition to giving
people more code to learn from, I hope it presents a fun opportunity to
contribute PRs to an open-source Biff project.</li>
<li>Made <a href="https://github.com/jacobobryant/biff/releases">a couple tiny releases</a></li>
</ul>
<p>The <a href="https://biffweb.com/newsletter/">Biff newsletter</a> also has 54 subscribers
as of writing this which is dandy.</p>
<p>Thanks again for sponsoring Biff! I&rsquo;m excited for the future of the project.</p>
<h2 id="orchard">Orchard</h2>
<h4 id="cljs-compiler-investigation">Cljs compiler investigation</h4>
<p>I&rsquo;ve checked the cljs compiler state for any possibility of getting the executed function calls.
The good news is that <code>cljs.analyzer.api/analyze</code> returns a data structure that contains most of the data that is needed. The structure is a little awkward to handle since it&rsquo;s used to create the js code.</p>
<p>Here&rsquo;s an abbreviated version that shows the parts that are useful to get the references:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">ana/analyze</span> test-env <span style="color:#f92672">&#39;</span>(<span style="color:#66d9ef">defn </span>abc [] (map <span style="color:#f92672">#</span>(inc %) [<span style="color:#ae81ff">1</span>])))
<span style="color:#75715e">;; =&gt;</span>
{
<span style="color:#e6db74">:init</span> {
    <span style="color:#e6db74">:methods</span> [{
        <span style="color:#e6db74">:body</span> {
            <span style="color:#e6db74">:ret</span> {
                <span style="color:#e6db74">:args</span> [{
                    <span style="color:#e6db74">:methods</span><span style="color:#960050;background-color:#1e0010">:</span> [{
                        <span style="color:#e6db74">:body</span> {
                            <span style="color:#e6db74">:ret</span> {
                                <span style="color:#e6db74">:js-op</span> cljs.core/+
                            }
                        }}]
                    <span style="color:#e6db74">:op</span> <span style="color:#e6db74">:fn-method</span>
                }
                {
                    <span style="color:#e6db74">:op</span> <span style="color:#e6db74">:vector</span> 
                }]
            }
            <span style="color:#e6db74">:fn</span> {
                <span style="color:#e6db74">:name</span> /map
            }
        }
        }]
}

}
</code></pre></div><p>The actual structure is a lot larger, but can mostly be ignored. The advantage here, compared to the Clojure version, is that it&rsquo;s
possible to get anonymous function calls directly and that inlined calls aren&rsquo;t optimized away yet.</p>
<p>Sadly since the output of the analyzer is meant to be used to create js there&rsquo;s already a transformation happening before the output is returned.
For example <code>inc</code> is turned into a js <code>+</code> call, but this will mostly be a problem for very low-level calls and can probably be reversed.</p>
<h4 id="the-bad-news">The bad news</h4>
<p>You can instruct the cljs compiler to dump an analysis cache during compilation. Unless I&rsquo;m mistaken, this cache does not hold the needed information though. It seems to be mostly a cache of metadata. So to be able to use the information that the analyzer can provide I will have to call it on the actual source files.</p>
<p>At that point, I&rsquo;d be using the cljs compiler like a static analyzer. This does have advantages over stand-alone tools like clj-kondo (output would always be &ldquo;correct&rdquo;), but would not be nearly as performant as the Clojure version.</p>
<h4 id="next-steps">Next steps</h4>
<ol>
<li>try to extend the caching, so that functions don&rsquo;t have to be reanalyzed</li>
<li>create a proof of concept version to test performance, if step one fails</li>
<li>integrate the results into orchard</li>
</ol>
<h2 id="typed-clojure">Typed Clojure</h2>
<p>The goal of <a href="https://www.clojuriststogether.org/news/q1-2022-funding-announcement/">this project funded by Clojurists Together</a> is to
(resurrect) support for type checking ClojureScript files in <a href="https://github.com/typedclojure/typedclojure">Typed Clojure</a>.</p>
<p>Since the <a href="https://github.com/typedclojure/typedclojure/blob/main/doc/clojurists-together-q1-2022-update1.md">last update</a>, support for type-checking ClojureScript has improved enough to consider the CLJS type checker &ldquo;resurrected&rdquo; (but still young).</p>
<p>To stress test the ability for Typed Clojure to check <code>.cljc</code> files, I have been <a href="https://github.com/frenchy64/malli/pull/1">type checking malli&rsquo;s implementation</a>.</p>
<p>Checking in CLJS mode has revealed many bugs and shortcomings in the checker. Clojure mode has been outrageously successful&ndash;<a href="https://github.com/metosin/malli/pull/690">it found a bug in malli</a>!</p>
<p>Some other feature work has been landing in Typed Clojure that has support for both Clojure and ClojureScript (enabled by this Clojurists Together project).</p>
<ul>
<li><a href="https://www.patreon.com/posts/static-type-64236939">using malli schemas as types</a></li>
<li><a href="https://www.patreon.com/posts/static-type-64321657">using specs as types</a> (CLJS WIP)</li>
<li><a href="https://www.patreon.com/posts/typed-clojure-1-64869793">support defprotocol and implements? in CLJS</a></li>
<li><a href="https://www.patreon.com/posts/typed-clojure-1-65065388">checking programs without depending on Typed Clojure</a></li>
<li><a href="https://github.com/typedclojure/typedclojure/blob/main/CHANGELOG.md#1028">new syntactic sugar for function types</a></li>
</ul>
<p>See the <a href="https://github.com/typedclojure/typedclojure/blob/main/CHANGELOG.md">CHANGELOG.md</a> for full details on everything else
accomplished in the time period since the last update (versions 1.0.21-1.0.28).</p>
<h2 id="reveal">Reveal</h2>
<p>After completing <a href="https://vlaaad.github.io/reveal/feature/test-runner">the test runner</a> I still had some time left, so I spent it updating <a href="https://vlaaad.github.io/reveal/">Reveal&rsquo;s website</a>. It is now much easier to navigate, and documentation was significantly improved:</p>
<ul>
<li><a href="https://vlaaad.github.io/reveal/setup">Setup</a> section was rewritten and expanded so it&rsquo;s easier to start using Reveal;</li>
<li>All previously undocumented shortcuts are now <a href="https://vlaaad.github.io/reveal/keyboard-shortcuts">properly documented</a>;</li>
<li>I added a new <a href="https://vlaaad.github.io/reveal/tips-and-tricks">Tips and Tricks</a> page that shows some useful patterns I found during my time using Reveal.</li>
</ul>
<h2 id="deep-diamond">Deep Diamond</h2>
<p>My goal with this round is to implement Recurrent Neural Networks (RNN) support in Deep Diamond.
The first month was dedicated to literature review (and other hammock-located work), exploration
of OneDNN implementation of RNN layers, and implementation of RNN prototype in Clojure in Deep Diamond.</p>
<p>Now, in the second month, I managed to make the first iteration of fully functional RNN layer
based on the DNNL backend (currently only Vanilla RNN implementation) that fits into the existing
high-level network building code. (more details follow)</p>
<p>Deep Diamond currently supports general tensor operations, fully connected NN layers, and convolutional (CNN) layers, on CPU and GPU.
Based on this, relatively stable, infrastructure, in the first month I added Vanilla RNN <em>operation</em> implementation backed by OneDNN (Intel, CPU).</p>
<p>Now, in the second month, I only managed to make a couple of commits, but the last one is pretty big.
I couldn&rsquo;t break it into many smaller ones, because I had to make a couple of subtle changes
that affected the internal implementation and broke existing code (_does not affect users, just me!).
I didn&rsquo;t want to commit a completely broken code into the github repository.</p>
<p>Now, what does this commit do?
A. It adds the first complete implementation of RNN layer that
1. technically works and pushes the numbers to the right places connected to it
2. is tested in isolation
3. is supported in high-level Deep Diamond code together with other layers type
B. I implemented a supporting &ldquo;Ending&rdquo; layer for feeding the time-based RNN output to other layer types (Dense, CNN, etc.)
C. I improved the existing infrastructure to support this, and also made it more flexible
D. I fixed bugs and wrote tests&hellip;</p>
<p>That is fine, but I am not completely satisfied with this milestone. I hoped to make a fully working example of a network
that learns something useful, but that proved a bit harder than I expected. I couldn&rsquo;t make
the RNN I have so far actually learn. It appears to be working, but even simple examples for RNN
applications are not <em>that</em> simple, so I wasn&rsquo;t be able to make it learn the artificial one
I tried it with. I am not sure whether it&rsquo;s due to bugs, or the example is simply pathological,
and the Vanilla RNN (which is currently the only type I implemented) can&rsquo;t do anything with it anyway.
This is something that I&rsquo;ll be doing the following days/weeks, and I expect to discover more when I implement
more advanced LSTM and/or GRU RNN types.</p>
<p>Beside that, the CUDA backend is broken in the current commit since I haven&rsquo;t updated it to the last changes,
but it&rsquo;s not a problem; once I nail DNNL, making CUDA compatible will be more or less routine.</p>
<h2 id="firefox">Firefox</h2>
<h3 id="custom-formatters-for-firefox">Custom Formatters for Firefox</h3>
<h4 id="current-status">Current status</h4>
<p>After some back and forth between the reviewer and me, <a href="https://phabricator.services.mozilla.com/D140119">my patch</a> for introducing the display of JsonML will land soon.</p>
<p>In order to handle custom formatters correctly and provide the user with some useful information in case of errors in the custom formatters themselves, there needs to be some exception handling. Therefore I&rsquo;ve created <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1764439">bug 1764439</a>.</p>
<p>There were also several discussions between the Firefox DevTools team and me regarding different implementation details. For example, there needs to be some handling for configuration objects. So I&rsquo;ve created <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1764443">bug 1764443</a> to add that.</p>
<h4 id="whats-next">What&rsquo;s next?</h4>
<p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1734840">Bug 1734840</a> is still missing, which is the main thing to actually get the custom formatters to work. Once that&rsquo;s done, the other bugs mentioned above need to be tackled.</p>
<h2 id="clojure-lsp">Clojure-LSP</h2>
<p>This month we had incredible important performance improvements, especially for big projects, along with support for ClojureDart, and new features!</p>
<h4 id="release-20220418-005932httpsgithubcomclojure-lspclojure-lspreleasestag20220418-005932">Release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2022.04.18-00.59.32">2022.04.18-00.59.32</a></h4>
<p>We started to check how to improve some points of performance and CPU spikes on clojure-lsp, since this release we started to fix logs of cpu spikes in multiple places like: completion, startup, file changes, test tree and others.
Now we have a cache layer for every external file analyzed, which means if user change anything on project that requires a full scan, it should be way faster than before.
We moved the core of LSP to a separate project called <code>lsp4clj</code> making possible to create other LSPs for any languages in Clojure.
Multiple improvements on java analysis for faster analysis and better UX settings.
Multiple improvements on the Drag feature.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Improve settings documentation.</li>
<li>Fix completion performance regression from previous release.</li>
<li>Consider <code>.bb</code> and <code>.cljd</code> files as clj files. #906</li>
<li>Bump to clojure 1.11.0</li>
<li>Improve analysis query performance as a whole for lots of features. #916</li>
<li>Bump clj-kondo to <code>2022.04.09-20220414.123207-3</code> fixing semantic tokens for <code>:require</code>, <code>:refer</code> and <code>:as</code>. <a href="https://github.com/clj-kondo/clj-kondo/issues/1609">#1609</a></li>
<li>Move <code>lsp4clj</code> to outside clojure-lsp to its own repo/jar release.</li>
<li>Fix local files outside source-paths not being linted even if opened/changed.</li>
<li>Consider filename + lastModified as checksum for external files, avoiding analyzing it if analysis is already present.</li>
<li>graalvm: Compile static linux with &ndash;musl for better compatibility. #868</li>
<li>java: Use <code>XDG_CACHE_HOME</code> or <code>.cache/clojure-lsp</code> instead of config files for JDK cache.</li>
<li>java: Cache JDK analysis globally avoiding high CPU usages after startup.</li>
<li>java: Add <code>:java :home-path</code> setting for easier way to specify java location for JDK source analysis. #907</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Introduce ALPHA move-form command. #566</li>
<li>Rename &ldquo;Move coll entry up/down&rdquo; to &ldquo;Drag forward/backward&rdquo;, matching Calva/Paredit terminology</li>
<li>drag: clauses move intuitively in <code>clojure.test/are</code></li>
<li>drag: top-level forms can be dragged #891</li>
<li>Improve completion performance for most cases, reducing time to compute clj/cljs core symbols.</li>
<li>completion: suggest functions defined in Clojure 1.10 and 1.11</li>
<li>completion: Fix to no require extra ns when alias is already required. #920</li>
<li>promote-fn: <em>new feature</em> Promote a fn to a top-level defn. #783 @mainej
<ul>
<li>promote-fn can also promote a literal #() to a fn</li>
</ul>
</li>
<li>demote-fn: Demote a fn to a literal #()</li>
<li><em>breaking</em> remove cycle-fn-literal, since the same refactorings can be performed with the more clearly named promote-fn and demote-fn</li>
<li>drag: Fix to drag element-wise in destructured keys, not pair-wise. #927</li>
<li>test-tree: reduce CPU usage, especially during startup</li>
</ul>
</li>
<li>
<p>CLI</p>
<ul>
<li>Reduce CPU and wall-clock time in cli commands clean-ns and diagnostics</li>
</ul>
</li>
</ul>
<h4 id="release-20220503-123540httpsgithubcomclojure-lspclojure-lspreleasestag20220503-123540">Release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2022.05.03-12.35.40">2022.05.03-12.35.40</a></h4>
<p>This release added the feature of when renaming files via editor, clojure-lsp will automatically rename the namespace and all references.
A huge improvement on uncache startup with changes on clj-kondo which resulted on faster analysis.
It&rsquo;s now possible to sort package imports inside <code>:import</code> forms during <code>clean-ns</code>.
Also, the progress report during startup is more precise resulting in a better UX.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Bump clj-kondo to <code>2022.04.26-20220429.192438-2</code>.</li>
<li>Decrease uncached startup time by 60-70%, by instructing clj-kondo to skip var definition bodies when analyzing deps. <a href="https://github.com/clj-kondo/clj-kondo/pull/1674">#1674</a></li>
<li>Improve speed of alias/ns completions.</li>
<li>Change alias/ns completions to return a label that matches the input.</li>
<li>Support sorting classes inside package imports during <code>clean-ns</code>. #932</li>
<li>Avoid saving duplicate source-paths, not calling clj-kondo to analyze same filenames multiple times, improving startup speed.</li>
<li>Improve progress report both on editor and CLI using new clj-kondo callback feature.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Support <code>workspace/willRenameFiles</code>, renaming namespaces and all its references when a file is renamed.</li>
<li>Don&rsquo;t save cache when classpath lookup failed.</li>
<li>Wait for editor to apply edits before requesting cursor re-positioning. Fixes cursor positioning after drag in Calva.</li>
<li>drag: Request edit only of changed clauses, not entire parent, reducing flicker.</li>
</ul>
</li>
<li>
<p>CLI/API</p>
<ul>
<li>Bump lsp4clj to <code>0.3.0</code>.</li>
</ul>
</li>
</ul>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>My main focus in the past couple of months was the preparation of CIDER 1.4. The release is almost ready and I expect to cut it any day now. It includes:</p>
<ul>
<li>lots of small improvements and bug-fixes</li>
<li>improved interop with lsp-mode for things like completions and xref</li>
<li>the ability to store the last result automatically in a register (?e by default) or to quickly recall the result using <code>cider-last-result</code></li>
<li>the iconic inspirational messages on connect have been restored after being absent for a few years and now you can even display them manually with <code>cider-inspire-me</code></li>
<li>misc documentation improvements</li>
</ul>
<p>The whole changelog is <a href="https://github.com/clojure-emacs/cider/blob/master/CHANGELOG.md#master-unreleased">here</a>.
We&rsquo;ve also celebrated 10 years since the first CIDER commit on the 17th of April. You can read a bit more about CIDER&rsquo;s history <a href="https://docs.cider.mx/cider/about/history.html">here</a></p>
<p><strong>Note:</strong> Technically speaking <a href="https://github.com/clojure-emacs/cider/releases/tag/v1.3.0">CIDER 1.3</a> and <a href="https://github.com/clojure-emacs/clojure-mode/releases/tag/v5.14.0">clojure-mode 5.14</a> were released in March, but I already mentioned them in my previous update.</p>
<p>Also as usual - I&rsquo;ve spent a lot of time discussing/investigating tickets on GitHub and providing support to various CIDER users.</p>
<p>Outside of CIDER:</p>
<ul>
<li>I&rsquo;ve updated CIDER&rsquo;s and nREPL&rsquo;s websites to use the latest versions of Antora and Algolia&rsquo;s Docsearch (you might notice the search is a lot better these days).</li>
<li>You can now disable eldoc in inf-clojure if it causes performance issues for you.</li>
<li>clojure-mode now supports ClojureDart source files.</li>
<li>nREPL&rsquo;s built-in client is about the get support for Unix sockets (see <a href="https://github.com/nrepl/nrepl/pull/270/files">https://github.com/nrepl/nrepl/pull/270/files</a>)</li>
</ul>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>I&rsquo;d like to thank all the sponsors and contributors that make this work possible.</p>
<h4 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h4>
<p>A linter for Clojure (code) that sparks joy.</p>
<p>Published versions: 2022.03.04, 2022.03.08, 2022.03.09, 2022.04.08,
2022.04.23, 2022.04.25</p>
<p>Read the changelog
<a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>New linters: <code>:namespace-mismatch</code>, <code>:non-arg-vec-return-type-hint</code>,
<code>:keyword-binding</code>, <code>:discouraged-var</code></li>
<li>More analysis output for Java classes, protocols and multi-methods</li>
</ul>
<h4 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h4>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<p>Published versions: 0.7.7, 0.7.8, 0.8.0, 0.8.1</p>
<p>Read the changelog
<a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>Declarative pod configuration in <code>bb.edn</code></li>
<li>Compatibility with
<a href="https://github.com/redplanetlabs/specter">specter</a></li>
<li>Fixes for <code>reify</code>, calls to interface default methods are now
correctly implemented</li>
</ul>
<h4 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h4>
<p>Configurable Clojure interpreter suitable for scripting and Clojure
DSLs.</p>
<p>Published versions: 0.3.2, 0.3.3, 0.3.4</p>
<p>Read the changelog
<a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md">here</a>.</p>
<p>Summary: many small incremental improvements.</p>
<h4 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h4>
<p>Ad-hoc CLJS scripting on Node.js using SCI.</p>
<p>Published versions: v0.2.1 - v0.3.10.</p>
<p>Read the changelog
<a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li><a href="https://github.com/babashka/nbb/blob/main/doc/dev.md#features">Features</a>
mechanism which allows you to re-package nbb with your favorite CLJS
libraries.</li>
<li>Videos: <a href="https://youtu.be/7DQ0ymojfLg">London Clojurians</a>, <a href="https://youtu.be/_-G9EKaAyuI">On the
Code Again</a></li>
<li><code>nbb.core/await</code> REPL helper to &quot;block&quot; on promises and get their
results</li>
<li>nREPL completion improvements</li>
</ul>
<h4 id="joyridehttpsgithubcombetterthantomorrowjoyride"><a href="https://github.com/BetterThanTomorrow/joyride">Joyride</a></h4>
<p>Modify VSCode by executing ClojureScript (SCI) code in your REPL and/or
run scripts via keyboard shortcuts.</p>
<p>Read the changelog
<a href="https://github.com/BetterThanTomorrow/joyride/blob/master/CHANGELOG.md">here</a>.</p>
<p>This is a new project!</p>
<h4 id="grasphttpsgithubcomborkdudegrasp"><a href="https://github.com/borkdude/grasp">Grasp</a></h4>
<p>Grep Clojure code using clojure.spec regexes.</p>
<p>Highlights:</p>
<ul>
<li>Support <code>:keep-fn</code>, allowing you to keep track of the conformed
value in one go</li>
</ul>
<h4 id="obbhttpsgithubcombabashkaobb"><a href="https://github.com/babashka/obb">Obb</a></h4>
<p>Ad-hoc ClojureScript scripting of Mac applications via Apple's Open
Scripting Architecture.</p>
<p>Published versions: 0.0.3</p>
<p>Read the changelog
<a href="https://github.com/babashka/obb/blob/main/CHANGELOG.md">here</a>.</p>
<h4 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h4>
<p>A CLI to add common aliases and features to deps.edn-based projects.</p>
<p>Highlights:</p>
<ul>
<li>List available versions</li>
<li>Dependency search</li>
<li>New <code>license</code> subcommand</li>
</ul>
<h4 id="rewrite-ednhttpsgithubcomborkduderewrite-edn"><a href="https://github.com/borkdude/rewrite-edn">Rewrite-edn</a></h4>
<p>Utility lib on top of rewrite-clj with common operations to update EDN
while preserving whitespace and comments.</p>
<p>Read the changelog
<a href="https://github.com/borkdude/rewrite-edn/blob/master/CHANGELOG.md">here</a>.</p>
<h4 id="toolsmischttpsgithubcomclj-easytoolsmisc"><a href="https://github.com/clj-easy/tools.misc">Tools.misc</a></h4>
<p>Tools library similar to clojure.tools.logging but for misc. tools.</p>
<p>So far this is just an experiment, but join the discussion if you want.</p>
<h4 id="fshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Fs</a></h4>
<p>File system utility library for Clojure.</p>
<p>Published versions: 0.1.4.</p>
<p>Read the changelog
<a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md">here</a>.</p>
<p>Discuss this post
<a href="https://github.com/borkdude/blog/discussions/categories/posts">here</a>.</p>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>In this reporting period, I continued work on Clojure Sound, and finally made it ready for
the first release into Clojars.</p>
<p>In the previous period (January and February) the main objective was to learn the fundamentals of
sound processing and communicating with control devices on the JVM, and start the work towards
an initial version of full blown Clojure library that is capable of serious work in this area.
Now I&rsquo;ve wrapped up the first milestone with the initial release, that includes:</p>
<h4 id="from-the-previous-period">From the previous period:</h4>
<ul>
<li>Full initial Clojure-friendly coverage of Java Sound API</li>
<li>Extracting common protocols for MIDI and Sampled parts of Java Sound into a core package</li>
<li>Clojurising the MIDI namespace quite a lot</li>
<li>UX layer for the MIDI standard that goes further than Java Sound</li>
<li>Full code examples for a large part of the Java MIDI tutorial, in the form of fully working tests.</li>
<li>Acquired and experimented with several hardware MIDI-compatible controllers</li>
</ul>
<h4 id="added-and-improved-in-this-reporting-period">Added and improved in this reporting period</h4>
<ul>
<li>Support for midi synthesizers</li>
<li>Support for audio/file formats</li>
<li>Support for audio mixers</li>
<li>Support for audio controls</li>
<li>General improvements for listeners support in both midi and sampled namespaces</li>
<li>Various improvements and bugfixes of the existing code</li>
<li>Improved support for reading/writing/converting between files and formats</li>
<li>Fully covered the Java Sound Tutorial with automated midje tests</li>
<li>Released version 0.1.0 (fully operational and decently tested, with a fairly polished UX)</li>
</ul>
<p>Of course, I continued with lots of dedication to learning the fundamentals of this, including music theory, music instruments and devices, and whatnot.
That is not something I can immediately convert into useful music related Clojure software (beyond Clojure Sound). However,
month by month I feel the foundations are building so in a several months, or a year, or a couple of years (depends on how optimistic I am)
I might be having some pleasant surprises for Clojurians!</p>
<p>As for the motivation, let me repeat (copy) what I wrote in the Jan-Feb report:</p>
<p>Although the motivation might be unclear to many Clojurists - who needs <em>sound</em> stuff in Clojure - I predict
that this will be a very interesting and attractive project to many Clojurists, beginners and veterans alike.
First of all, sound-related stuff is interesting, so it&rsquo;s a good hobby coding and experimenting platform.
As such, it&rsquo;s a good choice for demonstrating various code techniques while avoiding boring topics.
Next, it&rsquo;s great for beginners to give them a topic that they know and like, music, as a playing ground
for learning the topics that they don&rsquo;t (yet) understand (Clojure and programming in general).
Further, it covers things only incidentally related to music: communication with external hardware
controller devices, which are often created for musicians in mind, but can be utilized in ingenious
ways in general computing, with their abundance of knobs, slider, pads, and other convenient control methods.
Last (but there will be more), digital signal processing is one of fundamental domains where high performance
computing is applied. This will be an excellent demonstration platform for showing off Clojure&rsquo;s HPC
computing capabilities. Who knows, maybe we&rsquo;ll even be able to build something that kicks-ass. Even if we
don&rsquo;t it will be an excellent platform for many Clojurists to make the first steps in DSP and HPC, and may
even attract some people to look into Clojure.</p>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.18.0 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Notable Updates</p>
<ul>
<li>Removed some old and mostly unused EQL related experiments. The only consumer was the UI loading its initial data and using the pathom backend for this was entirely overkill. Removed without replacement, as it was never part of any public API it shouldn&rsquo;t affect anyone.</li>
<li>Removed the graaljs scriptengine dependency. It was only used for conflict resolution for <code>deps.cljs</code> declaring <code>:npm-deps</code>. Since this was rare to begin with it now uses the simpler variant of using the first declared dependency. Users can manually resolve conflicts by installing the desired version directly. Dropping this dependency also removes some annoying Graal-related warnings.</li>
<li>Tweaked npm-resolve some more to match webpack even closer</li>
<li>Fixed build reports. They didn&rsquo;t properly categorize npm dependencies anymore and instead put them all in &ldquo;Generated Files&rdquo;. Now properly split by npm package again.</li>
</ul>
<h2 id="david-nolen">David Nolen</h2>
<ul>
<li>Clojure 1.11 compatibility
<ul>
<li>review and merge clojure.math patch CLJS-3347</li>
</ul>
</li>
<li>self-host fix CLJS-3288</li>
<li>review MERGE 20+ arity apply fn fix CLJS-3348</li>
<li>fix global shadowing issue CLJS-3368</li>
<li>investigate potential externs issue CLJS-3373</li>
<li>evalute dep shading solutions for ClojureScript AOT artifact</li>
</ul>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hello everybody, this is Niki Tonsky and we are still building Clojure Desktop UI framework in public.</p>
<p><a href="https://github.com/HumbleUI/HumbleUI/">Humble UI</a>:</p>
<ul>
<li>A lot of under-the-hood work</li>
<li>Scrollbars and clickables can now be nested</li>
<li>New components: button, image, svg, checkbox, canvas</li>
<li>Initial work on text fields</li>
<li>Apache 2.0 license</li>
</ul>
<p>First few apps built with Humble UI:</p>
<ul>
<li>Folcon has built <a href="https://folcon.itch.io/fruit-economy-7drl-2022">a game prototype for 7DRL</a>.</li>
<li>Luis Thiam-Nye has built <a href="https://twitter.com/LuisThiamNye/status/1509564956643057666">a dependency graph visualisation</a> and <a href="https://twitter.com/LuisThiamNye/status/1509569953531322381">a text editor</a>.</li>
</ul>
<p>I am beyond excited!</p>
<p><a href="https://github.com/HumbleUI/JWM">JWM</a>:</p>
<ul>
<li>Clipboard on macOS</li>
<li>Better Clojure compatibility</li>
<li>Fixed C++ name clash with AWT</li>
<li>Several X11 fixes</li>
</ul>
<p><a href="https://github.com/HumbleUI/Skija">Skija</a>:</p>
<ul>
<li>Bumped Skia to m102</li>
<li>Cached Font::getMetrics</li>
</ul>
<p>DataScript, Rum and Tongue saw some maintenance releases.</p>
<p>Talks:</p>
<ul>
<li>Talked with Jacek Schae at ClojureStream <a href="https://soundcloud.com/clojurestream/sublimed-with-nikita-prokopov">about Clojure Sublimed</a>.</li>
<li>Presented at HYTRADBOI <a href="https://www.hytradboi.com/2022/your-frontend-needs-a-database">where DBs fits in client-server apps</a>.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>March 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/march-2022-monthly-update/</link>
      <pubDate>Fri, 08 Apr 2022 04:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-2022-monthly-update/</guid>
      <description>Read the project updates of Dependabot Core, Biff, Orchard, Typed Clojure, Reveal, Clojure-LSP, Deep Diamond, and Firefox, and the update from our long term project with Bozhidar Batsov.</description>
      <content:encoded><![CDATA[<h2 id="biff">Biff</h2>
<p>At the start of the project, I had mostly finished updating Biff&rsquo;s library code.
Since then, I&rsquo;ve finished updating the template project. As a refresher, some
of the changes from the previous version of Biff include:</p>
<ul>
<li>
<p>No more ClojureScript or React. Just server-side rendering with HTMX. This
has let me delete a bunch of code. The template project project still
includes the same real-time chat example, all done with HTMX now. It&rsquo;s
wonderful. See
<a href="https://biffweb.com/docs/#htmx">https://biffweb.com/docs/#htmx</a> for some
code examples that are mostly the same as what&rsquo;s in the template project.
You can also take a look at
<a href="https://github.com/jacobobryant/biff/blob/dev/example/src/com/example/feat/app.clj">app.clj</a>
from the template project (search for <code>:hx-</code>).</p>
</li>
<li>
<p>The entire project has been structured to accommodate &ldquo;developing in prod.&rdquo;
You can run <code>./task prod-dev</code> which will watch your local files for changes,
rsync them to the server, and then run a command on the server via nREPL to
evaluate all the changed files.</p>
</li>
</ul>
<p>So the code is pretty much complete. There&rsquo;s just a handful of cleanup things
that I&rsquo;ll do right before the release. (I also still need to test everything on
Mac, especially develop-in-prod). Besides that:</p>
<ul>
<li>I&rsquo;ve made a <a href="https://biffweb.com/">spiffy new website</a>.</li>
<li>I set up <a href="https://biffweb.com/newsletter/">a Biff newsletter</a> and published
a funding announcement.</li>
<li>I have <em>almost</em> finished rewriting <a href="https://biffweb.com/docs/">the
documentation</a> from scratch (I just need to
finish the &ldquo;System Composition&rdquo; and &ldquo;Production&rdquo; sections at the end).</li>
</ul>
<p>Once the main documentation page is complete, I&rsquo;ll write a bunch of doc strings
and update the <a href="https://biffweb.com/api/">API docs</a> page. Then it&rsquo;ll be time to
release.</p>
<h2 id="orchard">Orchard</h2>
<p>I&rsquo;ve invested a day to look into my preferred method of solving this: inspecting the produced JS objects inside the running VM, in a similar manner to the JVM implementation.</p>
<p>It turns out even the only kind of viable way to do that is <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller">Function.caller</a> which has multiple problems:</p>
<ol>
<li>It’s deprecated</li>
<li>We&rsquo;d have to rewrite every generated JS function to add this</li>
<li>We would have to execute every function</li>
<li>Worst: There is no general way to even run every code path</li>
</ol>
<h4 id="further-investigation">Further investigation</h4>
<p>The next possibility I will check is a hybrid version, which is less useful but still a lot better than nothing:
Using the cljs compiler to provide the references while compiling the code.</p>
<p>This is not ideal since it doesn&rsquo;t allow investigating code that is already running and will probably not allow investigating hierarchies inside JS code. It should be good enough for most consumers of orchard though since it&rsquo;s mostly used during development.</p>
<h2 id="typed-clojure">Typed Clojure</h2>
<p>The goal of <a href="https://www.clojuriststogether.org/news/q1-2022-funding-announcement/">this project funded by Clojurists Together</a> is to
(resurrect) support for type checking ClojureScript files in <a href="https://github.com/typedclojure/typedclojure">Typed Clojure</a>.</p>
<p><a href="https://github.com/typedclojure/typedclojure/compare/25a3433b1c0c05c4f06e2583440713834371d8c8...f56fe2c4eab493ab0ff4661c71e16412008fed9e">Roughly 10,000 lines</a> of refactoring, improvements, and feature work has culminated to a <a href="https://github.com/typedclojure/typedclojure/tree/f56fe2c4eab493ab0ff4661c71e16412008fed9e/example-projects/minimal">working minimal project</a> that can check a <code>.cljc</code> file in both Clojure and ClojureScript.</p>
<p>The <a href="https://github.com/typedclojure/typedclojure/blob/f56fe2c4eab493ab0ff4661c71e16412008fed9e/doc/clojurists-together-q3-2021-update2.md">work</a> I completed for the previous Clojurists Together funding for Typed Clojure has been transferred to ClojureScript, as my <a href="https://www.clojuriststogether.org/news/q1-2022-funding-announcement/">proposal</a> speculated. The <a href="https://github.com/typedclojure/typedclojure/tree/f56fe2c4eab493ab0ff4661c71e16412008fed9e/example-projects/minimal">minimal project</a> shows off how a type error involving <code>(clojure.core/inc a)</code> is presented as if <code>inc</code> were a regular function&ndash;in Clojure it is inlinable yet Typed Clojure prints <code>(inc a)</code> instead of <code>clojure.lang.Numbers/inc</code>, and in ClojureScript is it a macro call yet prints <code>((do inc) a)</code> instead of a <code>js*</code> call (some room for improvement).</p>
<p>A new macros namespace <a href="https://github.com/typedclojure/typedclojure/blob/f56fe2c4eab493ab0ff4661c71e16412008fed9e/typed/clj.runtime/src/typed/clojure.cljc">typed.clojure</a>
has been created for cross-platform use. Instead of using <code>clojure.core.typed</code> or <code>cljs.core.typed</code>, you can use <code>typed.clojure</code>
and the correct implementation will be chosen automatically. A new namespace was created so then we can (eventually) target self-hosting ClojureScript forcing reader conditionals on users.</p>
<p>The base type environment for both Clojure and ClojureScript has been moved to <a href="https://github.com/typedclojure/typedclojure/blob/f56fe2c4eab493ab0ff4661c71e16412008fed9e/typed/lib.clojure/src/typed/ann/clojure.cljc">typed.ann.clojure</a>. It houses 2400 lines of annotations and serves as a real-world example of how to annotate functions, protocols, and records for multiple platforms using reader conditionals.</p>
<p>Typing rules for macros are now shared across Clojure and ClojureScript implementations. This means the <a href="https://github.com/typedclojure/typedclojure/blob/f56fe2c4eab493ab0ff4661c71e16412008fed9e/doc/clojurists-together-q3-2021-update2.md">work</a> completed for the previous Clojurists Together project can be transferred to ClojureScript, such as the improved error messages for let-destructuring.</p>
<h2 id="reveal">Reveal</h2>
<p>The test runner is done! New versions of Reveal (<a href="https://vlaaad.github.io/reveal/">Free 1.3.270</a> and <a href="https://vlaaad.github.io/reveal-pro">Pro 1.3.339</a>) provide:</p>
<ul>
<li>a UI to run and re-run tests and view the results in a structured tree view output;</li>
<li>contextual <code>test</code> action on namespaces and vars to make running tests easier;</li>
<li><code>diff</code> action for 2-element tuples and maps with <code>:expected</code> and <code>:actual</code> keys (these are present in the test output tree);</li>
<li>test sticker window that can be configured to run tests on the classpath (all or filtered based by test var/ns metadata).</li>
</ul>
<p>Here is what it looks like:</p>
<p><video controls><source src="https://vlaaad.github.io/assets/reveal/test-runner.mp4" type="video/mp4"></source></video></p>
<p>During the remaining month, I plan to revamp the Reveal site to make it more structured and approachable, and in turn, make Reveal easier to set up, understand, and use.</p>
<h2 id="deep-diamond">Deep Diamond</h2>
<p>My goal with this round is to implement Recurrent Neural Networks (RNN) support in Deep Diamond.
The first month was dedicated to literature review (and other hammock-located work), exploration
of OneDNN implementation of RNN layers, and implementation of RNN prototype in Clojure in Deep Diamond.</p>
<p>Deep Diamond currently supports general tensor operations, fully connected NN layers, and convolutional (CNN) layers, on CPU and GPU.
Based on this, relatively stable, infrastructure, I started adding Vanilla RNN implementation backed by OneDNN (Intel, CPU).</p>
<p>OneDNN RNN implementation is, like all the low-level backends that leading DL frameworks use, very heavy, convoluted, and rather unclojure-y.
So it takes some time to discover how it should be properly used, and how to best hide its complexity under a nice high level Clojure.</p>
<p>Specifically, this was implemented in the first month of Q1:</p>
<ul>
<li>a prototype of developer-friendly implementation of RNN in Clojure</li>
<li>Vanilla RNN support (as the stepping stone for more serious LSTM and GRU)</li>
<li>The first iteration of an extension infrastructure for various backend implementations of RNN.</li>
<li>a clean low-level integration with Intel&rsquo;s oneDNN RNN on the CPU (for Vanilla RNN).</li>
<li>TESTS. Not ideal amount of, but enough for this phase.</li>
</ul>
<p>So far, I&rsquo;m pretty satisfied with the progress, as I think I have discovered the roughest edges of
Intel&rsquo;s implementation, and found ways to fit this into existing Deep Diamond code. I expect
the following 2 months of the project to require lots of work and tests, but I feel I shouldn&rsquo;t
expect nasty surprises. I believe that by the end of the funding period I&rsquo;ll be able to release
the version of Deep Diamond that will have the functionality I&rsquo;ve proposed.</p>
<h2 id="firefox">Firefox</h2>
<h4 id="custom-formatters-for-firefox">Custom Formatters for Firefox</h4>
<p>Hello everyone, I am Sebastian! I am currently working on bringing Custom Formatters to Firefox, and by that allow tools like <a href="https://github.com/binaryage/cljs-devtools">cljs-devtools</a> to work with Firefox.</p>
<h4 id="what-are-custom-formatters">What are Custom Formatters?</h4>
<p>Custom Formatters allow to display specific objects within the DevTools using formats and styles provided by the website. Those Custom Formatters are used in different places throughout the DevTools - everywhere were the objects are displayed. Mainly this is done in the <a href="https://firefox-source-docs.mozilla.org/devtools-user/web_console/">Web Console</a> and the <a href="https://firefox-source-docs.mozilla.org/devtools-user/debugger/">Debugger</a>.</p>
<p>Daniel also provided a short introduction to the feature with links to more information in his <a href="https://www.clojuriststogether.org/news/funding-development-on-custom-formatters-for-firefox/">article about the funding of this feature</a>.</p>
<h4 id="current-status">Current status</h4>
<p>In <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1746830">bug 1746830</a> I introduced a preference <code>devtools.custom-formatters</code> behind which this feature is implemented. This preference can be enabled via <code>about:config</code>.</p>
<p>I&rsquo;ve also added an option called <em>Enable custom formatters</em> to the <a href="https://firefox-source-docs.mozilla.org/devtools-user/settings/index.html">Settings panel</a> in <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1746831">bug 1746831</a>. This option controls the preference <code>devtools.custom-formatters.enabled</code>.</p>
<p>Currently, I am working on implementing the formatting itself in <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1746824">bug 1746824</a>. This includes interpreting <a href="http://www.jsonml.org">JsonML</a> and using it to style the object.</p>
<p>A work-in-progress patch of this can be seen at <a href="https://phabricator.services.mozilla.com/D140119">https://phabricator.services.mozilla.com/D140119</a>.</p>
<p>If you want to follow the progress, please have a look at the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1734614">meta-issue</a>.</p>
<h4 id="whats-next">What&rsquo;s next?</h4>
<p>I&rsquo;ll finalize the patch mentioned above. This lays the foundation to display the Custom Formatters. Though by itself this change won&rsquo;t have a visual difference. It requires the Custom Formatters defined within the page to be interpreted. This is covered in <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1734840">bug 1734840</a>, which will be the next thing I am working on.</p>
<h2 id="clojure-lsp">Clojure-LSP</h2>
<p>We had huge performance improvements and a new long waited feature requested, Java interop!</p>
<h4 id="release-20220325-120259httpsgithubcomclojure-lspclojure-lspreleasestag20220325-120259">Release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2022.03.25-12.02.59">2022.03.25-12.02.59</a></h4>
<p>This release fixed an annoying performance issue we had with our custom linter for unused public vars, on one of the big projects we tested where before use to take 30s to analyze async the whole project for only that linter, it takes 0.2s now!
A new feature was included, the ability to find definition of <code>defmulti</code>s, finding all <code>defmethod</code>s!
We now have more built-in completion snippets on clojure-lsp following @practicalli-john suggestions.
Regarding the API/CLI usage, we fixed a issue where could cause some false-positives regarding clean-ns and format and we started working on a big refactor, creating a new submodule that may be extracted out of clojure-lsp in the future, called <code>lsp4clj</code>, with that we could implement other LSP servers (for probably other languages) in clojure easier!</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Fix cljfmt settings merge during refresh/classpath configs merge to avoid multiple config vectors on same symbol.</li>
<li>Fix install script for aarch64. #794</li>
<li>Fix handling cljfmt config files that end in <code>.clj</code> <a href="https://github.com/weavejester/cljfmt/issues/190">https://github.com/weavejester/cljfmt/issues/190</a></li>
<li>parser: more efficiently seek to cursor position, improving performance especially in large files. #793 @mainej</li>
<li>Fix clean-ns not sorting properly node requires for cljs. #815</li>
<li>Fix move-to-let to ensure locals don&rsquo;t move out of scope. #830</li>
<li>Improve logic around require suggestions. #837</li>
<li>Enhance move-to-let to introduce and expand let if an existing one doesn&rsquo;t exist. #829</li>
<li>Bump <code>org.clojure/clojure</code> to <code>1.11.0</code>.</li>
<li>Fix move-coll-entry to maintain cursor position instead of a range. #862</li>
<li>Clean ns automatically after adding missing require/imports, enabled by default under new <code>:clean :after-ns-refactor</code> flag. #558</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>extract-function: Fix wrong args when extracting from multi-arity fn. #683</li>
<li>extract-function: Fix wrong args when extracting after a local usage. #812 @mainej</li>
<li>move-coll-entry: clauses move intuitively in <code>assoc</code>, <code>case</code>, <code>cond</code>, and similar functions. #780 @mainej</li>
<li>move-coll-entry: fix NPE when when invoked from top-level #803 @mainej</li>
<li>Generate stubs async after startup, improving startup time. #788</li>
<li>Improve and add lots of new snippets following practicalli config. #797</li>
<li>Improve how watched new files are analyzed avoiding infinite loops and performance issues. #796</li>
<li>Avoid infinite loops when several files are changed simultaneously. #796 @mainej</li>
<li>Fix &ldquo;incoming call hierarchy&rdquo; not considering usages inside defmethods. #808</li>
<li>range-formatting: more efficiently locate extent of range and reduce number of calls to cljfmt, improving performance especially when formatting large ranges. #795 @mainej</li>
<li>cycle-fn-literal: <em>new feature</em> convert between function-literal syntaxes <code>(fn [] ...)</code> &lt;-&gt; <code>#(...)</code>. #774</li>
<li>Add find-implementation feature to <code>defmulti</code> and <code>defmethod</code>. #751</li>
<li>Make find-implementation of <code>defprotocol</code> names find its implementations and find-implementation on <code>deftype</code>/<code>defrecord</code> methods find other implementations.</li>
<li>Add new code action <code>Introduce let</code> for existing command. #825</li>
<li>Make find-implementations consider <code>reify</code>. #827</li>
<li>Fix namespace on file creation when nested source-paths are available. #832</li>
<li>unused-public-var: fix to show warnings on vars defined with declare. #840</li>
<li>unused-public-var: large performance improvements, especially for large projects. #861 @mainej</li>
</ul>
</li>
<li>
<p>API/CLI</p>
<ul>
<li>Extract lsp4clj as a seperate library. #807 @Cyrik Supported by <a href="https://www.scarletcomply.com">Scarlet</a></li>
<li>Fix inconsistency with clean-ns/format not copying kondo configs.</li>
</ul>
</li>
</ul>
<h4 id="release-20220331-142114httpsgithubcomclojure-lspclojure-lspreleasestag20220331-142114">Release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2022.03.31-14.21.14">2022.03.31-14.21.14</a></h4>
<p>This was a release with fewer new features/improvements but things we were researching/working for a long time, with
this release and the help from clj-kondo, we now have support for Java interop. This is a long-waited feature that now makes
clojure-lsp be able to find definition of java classes, and even decompile the <code>.class</code> if no java source is found. We also automatically
try to find the JDK source or download it if the setting is enabled.
This is a huge step for clojure-lsp, making it a better IDE tool and helping the development of clojure projects that use java interop, make sure to <a href="https://clojure-lsp.io/settings/#java-support">check docs</a>
Besides that, we had another performance improvement regarding big projects/files, removing CPU spikes for those cases.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Avoid high CPU usage and freezes by more efficiently finding referenced files to notify on file change. #844 @mainej</li>
<li>Bump clj-kondo to <code>2022.03.10-20220331.135739-32</code> improving java analysis and fixing a critical regression for re-frame. #888</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Add java class find-definition support, decompiling .class files when available. #762</li>
<li>Add JDK source discoverability feature, searching for installed JDK for later analyze with clj-kondo and support java classes interop.</li>
<li>Add <code>:java :download-jdk-source?</code> setting to download JDK source after startup if not cached before globally or found locally. Disabled by default.</li>
</ul>
</li>
</ul>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>In the past couple of months my main focus were:</p>
<ul>
<li>CIDER 1.3 (which just got released on March 7th)</li>
<li>Improvements to clj-refactor.el and clojure-mode</li>
</ul>
<p>In CIDER we&rsquo;ve been working towards replacing some fragile
logic for dealing with package sources and Javadoc with
the external enrich-classpath tool. While this already works
reasonably well in most scenarios, there&rsquo;s still some edge
cases that need to be addressed (mostly probably in CIDER 1.4).</p>
<p>Another big change is some untangling of the dependency-injection
code in CIDER, which was a total mess before CIDER 1.3.</p>
<p>My availability was impacted heavily by the war in Ukraine, that&rsquo;s why this update is coming a bit late.</p>
<h2 id="dependabot-core">Dependabot Core</h2>
<ul>
<li>Communications on the slack channel.</li>
<li>Meeting with justin hutchings from github about the new apis we could use for the project.</li>
<li>Received API keys to tinker the project with, the api keys can only be used trough a github action for the time being.</li>
<li>This might be promising for the near future but requires further investigation. The documentation is long and java / javascript specific.</li>
<li>The next goal would be to build a proof of concept.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>February 2022 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/february-2022-monthly-update/</link>
      <pubDate>Tue, 08 Mar 2022 05:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/february-2022-monthly-update/</guid>
      <description>Read the first update from one of our 2022 Q1 projects Clojure-LSP, and the updates from the remaining 2021 projects Malli and our long term projects with Michiel Borkent, Dragan Djuric, Thomas Heller, David Nolen, and Nikita Prokopov</description>
      <content:encoded><![CDATA[<h2 id="clojure-lsp">Clojure LSP</h2>
<p>This first month we had one big release with performance and new features.</p>
<h4 id="release-20220223-121212httpsgithubcomclojure-lspclojure-lspreleasestag20220223-121212">release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2022.02.23-12.12.12">2022.02.23-12.12.12</a></h4>
<p>The focus of this release was to make clojure-lsp faster on a lot of places, especially on the post-startup time, which as a summary stands for the time editor/CLI is waiting for clojure-lsp start to then offer all IDE features clojure-lsp has, the most significant improvement was when clojure-lsp analyzed whole project with clj-kondo default linters but is yet linting whole project for unused-public-vars and looking for test trees.
We also had lots of performance improvements in different places since CLI usage using parallelism to code-actions and code completion features, offering a smoother IDE experience.</p>
<p>One big change is that now clojure-lsp, by default, discover the project <strong>source-paths</strong> from the classpath string and not manually scanning deps/lein files, decreasing a lot the false-positives of wrong source-paths where users would need to manually configure it for more complex projects.</p>
<p>And as a new asked feature, and with the help of clj-kondo, we now have support for <a href="https://clojure-lsp.io/features/#find-defprotocol-implementations">finding implementations of defprotocols</a> following LSP spec.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Use <code>:source-aliases</code> setting during default deps.edn and lein project-spec aliases, avoiding the need to configure a whole project-spec just because of a additional alias.</li>
<li>Exclude from unused-public-var linter vars with metadata <code>^:export</code>. #753</li>
<li>Fix clean-ns multiple refers sort when there is a alias before the refers.</li>
<li>Bump clj-kondo from <code>2022.01.15</code> to <code>2022.02.09</code> adding support for implementation analysis and more improvements.</li>
<li>Medium performance improvement during startup when unused-public-var linter is disabled.</li>
<li>Medium performance improvement during startup on unused-public-var calculation parallelizing calculations.</li>
<li>Small performance improvement on code actions calcullation.</li>
<li>Add <code>:use-source-paths-from-classpath</code> setting defaulting to true, which makes clojure-lsp do not manually discovery source-paths but get from classpath excluding jar files and paths outside project-root. #752 #551</li>
<li>Improve completion performance when all clojure.core or cljs.core symbols are valid completions. #764, #771 @mainej</li>
<li>Fix scenarios where the lint findings in individual files differed from what you&rsquo;d expect based on the .clj-kondo/config.edn settings.</li>
<li>Add <code>:exclude-regex</code> and <code>:exclude-when-definted-by-regex</code> to <code>:clojure-lsp/unused-public-var</code> linter.</li>
<li>Bump <code>org.clojure/clojure</code> to <code>1.11.0-rc1</code>.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Fix exception during code actions calculation when in a invalid code of a map with not even key-pairs.</li>
<li>Don&rsquo;t return diagnostics for external files like files on jar dependencies, avoiding noise on lint when opening dependencies.</li>
<li>Support finding implementations of defprotocol and references of defrecord/deftype, implementing LSP method <code>textDocument/implementation</code>. #656</li>
<li>Make the actions and commands aware of when they were invoked from comments or whitespace. This will allow individual refactorings to be more deliberate about how they handle comments and whitespace. #716 @mainej</li>
<li>Correctly position the cursor after calling move-coll-entry-down on an entry with leading comments. #758 @mainej</li>
<li>Don&rsquo;t return completions when invoked from a comment, avoiding performance problems. #756</li>
<li>Fix small anomalies in parameter names of extracted private functions. #759 @mainej</li>
<li>Add semantic tokens for protocol implementations methods like defrecord and deftype.</li>
<li>Small performance improvevement on code lens calculation using transducers.</li>
</ul>
</li>
<li>
<p>API/CLI</p>
<ul>
<li>Small performance improvement to <code>format</code>, <code>clean-ns</code>, <code>diagnostics</code>, and <code>rename</code> via parallelizing parts of the logic.</li>
<li>Fix edn-&gt;json parser of <code>serverInfo/raw</code> for Calva use cljfmt configuration. #763</li>
<li>Add <code>:cljfmt-raw</code> config to <code>serverInfo/raw</code> for Calva. #768</li>
<li>Add support for passing specific <code>--filenames</code> for most actions. #775</li>
</ul>
</li>
</ul>
<h2 id="malli">Malli</h2>
<p>by <a href="https://twitter.com/ikitommi">Tommi Reiman</a></p>
<img src="https://raw.githubusercontent.com/metosin/malli/master/docs/img/malli.png" width=150 align="right"/>
<h4 id="done-stuff">Done Stuff</h4>
<ul>
<li>Shipped a major version of Malli, the 0.8.0 on Jan 23th! Biggest changes were: dev-tooling support for CLJS, Tools for Destructuring and support for the Plumatic Defn Syntax. Also the following smaller improvements:
<ul>
<li><code>malli.dev/start!</code> uses <code>malli.dev.pretty/reporter</code> by default</li>
<li>allow <code>:malli/schema</code> to be defined via arglist meta-data, <a href="https://github.com/metosin/malli/pull/615">#615</a></li>
<li><strong>BREAKING</strong>: local registries with schemas in vector syntax are stored as identity, not as form</li>
<li><strong>BREAKING</strong>: <code>:malli.provider/tuple-threshold</code> has no default value</li>
<li>FIX: <code>me/-resolve-root-error</code> does not respect <code>:error/path</code>, <a href="https://github.com/metosin/malli/issues/554">#554</a></li>
<li>FIX: <code>m/from-ast</code> does not work with symbols or unamespaced keywords, <a href="https://github.com/metosin/malli/issues/626">#626</a></li>
<li>FIX: <code>:+</code> parsing returns vector, not sequence</li>
<li>transformer names can be qualified, schema properties support <code>:decode</code> and <code>:encode</code> keys</li>
<li>updated dependencies</li>
<li><code>malli.dev.pretty/explain</code> for pretty-printing explanations</li>
</ul>
</li>
</ul>
<img src="https://raw.githubusercontent.com/metosin/malli/master/docs/img/pretty-explain.png" width=800>
<ul>
<li>new <code>malli.destructure</code> ns for parsing Clojure &amp; Plumatic destructuring binding syntaxes, see <a href="https://github.com/metosin/malli#destructuring">Destructuring</a>.</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clj" data-lang="clj">(<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[malli.destructure <span style="color:#e6db74">:as</span> md])

(-&gt; <span style="color:#f92672">&#39;</span>[a b <span style="color:#f92672">&amp;</span> cs] (<span style="color:#a6e22e">md/parse</span>) <span style="color:#e6db74">:schema</span>)
<span style="color:#75715e">; =&gt; [:cat :any :any [:* :any]]</span>

(-&gt; <span style="color:#f92672">&#39;</span>[a <span style="color:#e6db74">:-</span> <span style="color:#e6db74">:string</span>, b <span style="color:#f92672">&amp;</span> cs <span style="color:#e6db74">:-</span> [<span style="color:#e6db74">:*</span> <span style="color:#e6db74">:int</span>]] (<span style="color:#a6e22e">md/parse</span>) <span style="color:#e6db74">:schema</span>)
<span style="color:#75715e">; =&gt; [:cat :string :any [:* :int]]</span>
</code></pre></div><ul>
<li>new <code>malli.experimental</code> namespace with schematized <code>defn</code>, automatically registers the functions schemas with <code>m/=&gt;</code>.</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clj" data-lang="clj">(<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[malli.experimental <span style="color:#e6db74">:as</span> mx])

(<span style="color:#a6e22e">mx/defn</span> kakka <span style="color:#e6db74">:-</span> <span style="color:#e6db74">:int</span>
  <span style="color:#e6db74">&#34;inline schemas (plumatic-style)&#34;</span>
  [x <span style="color:#e6db74">:-</span> <span style="color:#e6db74">:int</span>] (inc x))
</code></pre></div><ul>
<li>Released also small patch releases (0.8.1 - 0.8.3) with bug fixes and small improvements</li>
<li>Read and reviewed all open PRs and managed to close most of them</li>
</ul>
<h4 id="todo">TODO</h4>
<p>Nothing, I&rsquo;m happy with the things I managed to complete during the 6 month period despite the priorities changed during it. Looking at the original list:</p>
<ol>
<li>First-class Schema inferring and effective schema types</li>
</ol>
<ul>
<li><strong>MOSTY DONE</strong>: it&rsquo;s not first class but orders of magnitude faster with lot&rsquo;s of new features like inferring <code>:tuple</code>, <code>:map-of</code>, <code>:enum</code>, type-hints and inferring via decoding. I&rsquo;m happy with the current state.</li>
</ul>
<ol start="3">
<li>Re-visit Schema registries, lifecycle, caching and contexts</li>
</ol>
<ul>
<li><strong>DONE</strong>: the registry can be swapped by default, workers are cached on instances etc</li>
</ul>
<ol start="5">
<li>Error messages and tooling integration: pretty-printing of schema creation</li>
</ol>
<ul>
<li><strong>MOSTY DONE</strong>: new tools for pretty explaining, more robust EDN printer etc</li>
</ul>
<p>Extra stuff that was added:</p>
<ol>
<li>SchemaAST - parseless method of creating Schemas</li>
<li>LiteSyntax - optional simple syntax for tools like <a href="https://github.com/metosin/reitit">reitit</a></li>
<li>Schema Creation Performance - massive improvements</li>
<li>Dev-tooling - improvements to clj, support for cljs (kudos to <a href="https://github.com/dvingo">Dan Vingo</a>), clj-kondo support</li>
</ol>
<h4 id="future-of-malli">Future of Malli</h4>
<p>There would be so much to do, need to figure out a sustainable way to work on those. These include:</p>
<ul>
<li>Better support for Dates <a href="https://github.com/metosin/malli/issues/49">#49</a></li>
<li>2-way transformation with TypeScript <a href="https://github.com/metosin/malli/issues/656">#656</a></li>
<li>Simplified Types <a href="https://github.com/metosin/malli/issues/264">#264</a></li>
<li>On fixing Recursive Generation <a href="https://github.com/metosin/malli/issues/452">#452</a></li>
<li>2-way transformation for JSON Schema, <a href="https://github.com/metosin/malli/issues/54">#54</a></li>
</ul>
<p>Cheers.</p>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<h4 id="babashka">Babashka</h4>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<p>Published versions: 0.7.4 - 0.7.6.</p>
<p>Read the changelog <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>Add new namespace from clojure 1.11: clojure.math</li>
<li>Performance improvements (see SCI).</li>
<li>Compatibility with more Clojure libraries and lots of small bug fixes.</li>
</ul>
<p>I also submitted a PR to cli-matic to fix the long standing issue about babashka compatibility.</p>
<p>Please leave some feedback about babashka in the <a href="https://forms.gle/ko3NjDg2SwXeEoNQ9">Q1 Survey</a>!</p>
<h4 id="clj-kondo">Clj-kondo</h4>
<p>A linter for Clojure (code) that sparks joy.</p>
<p>Published versions: 2022.01.13, 2022.01.15, 2022.02.09.</p>
<p>Read the changelog <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>Maybe new linters added: :conflicting-fn-arity, :clj-kondo-config, :reduce-without-init, :redundant-fn-wrapper, linting for bb.edn config files.</li>
<li>Improvements with regards to type inferences and map results</li>
<li>Contributed to clj-kondo config in better-cond so everyone who uses the library gets correct and useful linting feedback.</li>
</ul>
<h4 id="sci">SCI</h4>
<p>Configurable Clojure interpreter suitable for scripting and Clojure DSLs.</p>
<p>Published versions: v0.2.9 - v0.3.1.</p>
<p>Read the changelog <a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md">here</a>.</p>
<ul>
<li>Fix compatibility with Graal.js</li>
<li>Performance improvements for loops and vararg function calls.</li>
<li>JS interop fixes / improvements</li>
</ul>
<h4 id="nbb">Nbb</h4>
<p>Ad-hoc CLJS scripting on Node.js using SCI.</p>
<p>Published versions: v0.1.1 - v0.2.0.</p>
<p>Read the changelog <a href="https://github.com/babashka/nbb/blob/main/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>See SCI improvements.</li>
<li>Bundled library updates</li>
</ul>
<h4 id="scittle">Scittle</h4>
<p>Published versions: v0.1.0 - v0.1.2.</p>
<p>Read the changelog <a href="https://github.com/babashka/scittle/blob/main/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>Upgrade SCI with performance and JS interop improvements</li>
<li>Expose more Reagent features</li>
</ul>
<h4 id="obb">Obb</h4>
<p>Ad-hoc ClojureScript scripting of Mac applications via Apple&rsquo;s Open Scripting Architecture.</p>
<p>Published versions: 0.0.1 - 0.0.2</p>
<p>Read the changelog <a href="https://github.com/babashka/obb/blob/main/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>This is a new project!</li>
</ul>
<h4 id="fs">Fs</h4>
<p>File system utility library for Clojure.</p>
<p>Published versions: 0.1.3.</p>
<p>Read the changelog <a href="https://github.com/babashka/fs/blob/master/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>New functions create-temp-file and zip</li>
<li>Compatibility with com.google.cloud/google-cloud-nio</li>
</ul>
<h4 id="process">Process</h4>
<p>Clojure wrapper for java.lang.ProcessBuilder.</p>
<p>Published versions: 0.1.1. Read the changelog <a href="https://github.com/babashka/process/blob/master/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>Support appending to files in addition to overwriting them.</li>
</ul>
<h4 id="pod-babashka-go-sqlite-3">Pod-babashka-go-sqlite-3</h4>
<p>A babashka pod for interacting with sqlite3.</p>
<p>Released versions: 0.1.0.</p>
<p>Highlights:</p>
<ul>
<li>Bump sqlite version and support single string rather than wrapped in vector.</li>
</ul>
<h4 id="pod-babashka-buddy">Pod-babashka-buddy</h4>
<p>A pod around buddy core (Cryptographic Api for Clojure).</p>
<p>Released versions: 0.1.0.</p>
<p>Highlights:</p>
<ul>
<li>Expose more namespaces.</li>
</ul>
<h4 id="pod-babashka-aws">Pod-babashka-aws</h4>
<p>AWS pod wrapping the Cognitect aws-api library.</p>
<p>Released versions: 0.1.1-0.1.2.</p>
<p>Read the changelog <a href="https://github.com/babashka/pod-babashka-aws/blob/main/CHANGELOG.md">here</a>.</p>
<p>Highlights:</p>
<ul>
<li>Provide aarch64 binary.</li>
</ul>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>Since a dedicated project proposal for RNN support in Deep Diamond has been accepted by CT (Mar-Apr-May),
I got an unexpected opportunity to create and work on a new project as part of this funding: Clojure Sound.</p>
<p>The main objective during January and February was to learn the fundamentals of sound processing and
communicating on control devices on the JVM, and create an initial version of full blown Clojure library
that is capable of serious work in this area. So far, I have achieved this in code:</p>
<pre><code>- Full initial Clojure-friendly coverage of Java Sound API
- Extracting common protocols for MIDI and Sampled parts of Java Sound into a core package
- Clojurising the MIDI namespace quite a lot
- UX layer for the MIDI standard that goes further than Java Sound
- Full code examples for a large part of the Java MIDI tutorial, in the form of fully working tests.
- Acquired and experimented with several hardware MIDI-compatible controllers
</code></pre>
<p>Although the motivation might be unclear to many Clojurists - who needs <em>sound</em> stuff in Clojure - I predict
that this will be a very interesting and attractive project to many Clojurists, beginners and veterans alike.
First of all, sound-related stuff is interesting, so it&rsquo;s a good hobby coding and experimenting platform.
As such, it&rsquo;s a good choice for demonstrating various code techniques while avoiding boring topics.
Next, it&rsquo;s great for beginners to give them a topic that they know and like, music, as a playing ground
for learning the topics that they don&rsquo;t (yet) understand (Clojure and programming in general).
Further, it covers things only incidentally related to music: communication with external hardware
controller devices, which are often created for musicians in mind, but can be utilized in ingenious
ways in general computing, with their abundance of knobs, slider, pads, and other convenient control methods.
Last (but there will be more), digital signal processing is one of fundamental domains where high performance
computing is applied. This will be an excellent demonstration platform for showing off Clojure&rsquo;s HPC
computing capabilities. Who knows, maybe we&rsquo;ll even be able to build something that kicks-ass. Even if we
don&rsquo;t it will be an excellent platform for many Clojurists to make the first steps in DSP and HPC, and may
even attract some people to look into Clojure.</p>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.17.5 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Notable Updates</p>
<ul>
<li>Fixed a couple Compatibility issues encountered when updating to the latest Closure Compiler release.</li>
<li>Rewrote most of the npm resolve code to match <code>webpack/node</code> more closely. Wrote a test suite that verifies against the current <code>enhanced-resolve</code> package (which is used by <code>webpack</code>). Also laid the foundation to support <code>package.json</code> <code>&quot;exports&quot;</code>, which will become essential once more packages start adopting it.</li>
<li>Adjusted the <code>:as-alias</code> implementation to match the updated CLJ implementation (eg. allowing non-loading <code>:as-alias</code> in combination with other loading attributes, such as <code>:as</code> or <code>:refer</code>).</li>
<li>Added a <a href="https://github.com/thheller/shadow-cljs/blob/master/doc/remote.md">shadow-remote</a> nREPL bridge. This is meant for editor implementors giving more access to shadow-cljs data and APIs over existing nREPL connections. If you are interested please <a href="https://github.com/thheller/shadow-cljs/issues/990">reach out</a>.</li>
</ul>
<h2 id="david-nolen">David Nolen</h2>
<ul>
<li>various CLJS tickets</li>
<li>fix issues with npm dependencies with package.json exports
(firebase 9.X was affected in particular)</li>
<li>1.10.914 release</li>
<li>1.11 work started
<ul>
<li>:as-alias</li>
<li>port CLJ-2603</li>
<li>support in progress port of cloure.math</li>
</ul>
</li>
</ul>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hi, this is Niki Tonsky and I continue writing a lot of Clojure! Progress has been steady on all fronts:</p>
<p><a href="https://github.com/HumbleUI/HumbleUI/">Humble UI</a></p>
<ul>
<li>Layout in a good shape</li>
<li>First demo apps built: <a href="https://github.com/HumbleUI/HumbleUI/blob/e0a0d5689dc8f08147a4eee6b369393f91d88518/dev/examples/calculator.clj">Calculator</a> and <a href="https://github.com/HumbleUI/HumbleUI/blob/e0a0d5689dc8f08147a4eee6b369393f91d88518/dev/examples/wordle.clj">Wordle</a></li>
<li>Blogged about progres here:
<ul>
<li><a href="https://tonsky.me/blog/humble-decomposition/">Decomposition</a></li>
<li><a href="https://tonsky.me/blog/humble-layout/">Layout</a></li>
<li><a href="https://tonsky.me/blog/humble-dx/">Developer Experience</a></li>
</ul>
</li>
<li>Streamed <a href="https://www.youtube.com/watch?v=qSswvHrVnvo">Wordle development</a></li>
</ul>
<p>Wordle implementation takes ~200 loc, which is very decent in my opinion. Especially considering that API is very rough and not designed for ease of use yet.</p>
<p><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a></p>
<ul>
<li>Finally available through Package Control</li>
<li>Support indentation and formatting rules from <a href="https://tonsky.me/blog/clojurefmt/">Better Clojure formatting</a></li>
<li>Pretty print &amp; expand long returned values</li>
<li>Bug fixes &amp; PRs</li>
</ul>
<p><a href="https://github.com/tonsky/datascript/">DataScript</a></p>
<ul>
<li>6 new releases (patches and PRs)</li>
</ul>
<p><a href="https://github.com/tonsky/uberdeps">Uberdeps</a></p>
<ul>
<li>3 new releases</li>
</ul>
<p><a href="https://github.com/HumbleUI/JWM">JWM</a></p>
<p>Helped contributors merge lots of PRs:</p>
<ul>
<li>macOS: change titlebar style by @mworzala</li>
<li>macOS: set window progress by @mworzala</li>
<li>macOS: represented filename by @mworzala</li>
<li>macOS: work around -XstartOnMainThread by @mworzala</li>
<li>Windows: focus events by @i10416</li>
<li>X11: poll-based event loop by @dzaima</li>
<li>X11: mouse buttons by @dzaima</li>
<li>X11: focus events by @dzaima</li>
<li>X11: input methods by @dzaima</li>
</ul>
<p><a href="https://github.com/HumbleUI/Skija">Skija</a></p>
<ul>
<li>Upgraded Skia to m100</li>
<li>Bug fixes &amp; PRs</li>
</ul>
<p>People started expressing genuine interest and even build stuff in both Skija, JWM and Humble UI, which is a fantastic sign!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2022 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q1-2022-funding-announcement/</link>
      <pubDate>Fri, 18 Feb 2022 07:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2022-funding-announcement/</guid>
      <description>Clojurists Together is funding 12 projects for Q1 2022. These projects are practicalli, clojure-lsp, deep diamond, datahike server, tablecloth, and clj-kondo, conjure, reveal, overtone playground biff, orchard, and Typed Clojure</description>
      <content:encoded><![CDATA[<p>We&rsquo;re off to a great start! Clojurists Together is very excited and happy to announce that for Q1 2022 we are funding a total of 12 projects:</p>
<p><strong>$9,000</strong></p>
<ul>
<li><a href="https://github.com/practicalli">Practicalli</a> - John Stevenson</li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp">Clojure-LSP</a> -	Eric Dallo</li>
<li><a href="https://github.com/uncomplicate/deep-diamond">Deep Diamond</a> - Dragan Djuric</li>
<li><a href="https://github.com/replikativ/datahike-server">Datahike Server</a> - Konrad Kühne</li>
<li><a href="https://github.com/scicloj/tablecloth">Tablecloth</a> -	Ethan Miller</li>
<li><a href="https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md">Clj-kondo</a>, <a href="https://github.com/babashka/babashka/blob/master/doc/companies.md">Babashka</a>, and other related projects - Michiel Borkent</li>
</ul>
<p><strong>$2,000</strong></p>
<ul>
<li><a href="https://github.com/Olical/conjure">Conjure</a> - Oliver Caldwell</li>
<li><a href="https://vlaaad.github.io/reveal">Reveal</a> -	Vlad Protsenko</li>
<li><a href="https://github.com/savorocks/overtone-playground">Overtone Playground</a> -	Savo Djuric</li>
</ul>
<p><strong>$1,000</strong></p>
<ul>
<li><a href="https://github.com/jacobobryant/biff">Biff</a> - Jacob O&rsquo;Bryant</li>
<li><a href="https://github.com/clojure-emacs/orchard">Orchard</a> -	Lukas Domagala</li>
<li><a href="https://github.com/clojure/core.typed">Typed Clojure</a> - Ambrose Bonnaire-Sergeant</li>
</ul>
<h1 id="q1-2022-projects">Q1 2022 Projects</h1>
<p>Each project&rsquo;s plans are detailed below</p>
<h2 id="practicalli">Practicalli</h2>
<p><strong>Funding details:</strong> $9,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Supports Clojure developers deliver projects effectively, capturing and sharing common practices from the community.
Also helps those new to Clojure navigate the myriad of choices when developing apps and services, to lower the barriers to adoption.  Providing a regularly updated source of information that the community can share with confidence.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Extend code examples, specific guides and video content across the Practicall Books, including the following topics</p>
<ul>
<li>Clojure Web Services - production grade project guides
<ul>
<li>Building REST API&rsquo;s with Reitit and clojure.spec</li>
<li>Building GraphQL API&rsquo;s with lacinia and juxt/grab</li>
<li>Authentication &amp; Authorization (with Auth0 service)</li>
<li>Integrant REPL and Integrant with Aero</li>
<li>structured logging with mulog / log</li>
</ul>
</li>
<li>Clojure CLI
<ul>
<li>using tools, project templates for deps-new</li>
<li>tools.build guide</li>
<li>deployment (CLI specific heroku build pack, GitHub actions, Docker)</li>
</ul>
</li>
<li>Essential Clojure - a curated guide to the most common tools and libraries to support developers navigate the myriad of options in the Clojureverse
<ul>
<li>Unit testing &amp; Test runners: clojure.test (humane output) Koacha or Cognitect Labs</li>
<li>Repl Terminal UI - Rebel &amp; addlibs</li>
<li>REST API Reitit and Clojure.spec</li>
<li>App server - jetty or httpkit</li>
<li>Logging - mulog</li>
<li>Relational dB - next.jdbc and postgresql &amp;migration libraries</li>
<li>Clojure editor - gitpods for evaluating (Calva, Spacemacs/Doom, Cursive, Conjure, Clover)</li>
<li>System components lifecycle - Integrant, Mount, Component</li>
</ul>
</li>
</ul>
<p>Each book also has additional ideas for the community to vote on in their respective repositories <a href="https://github.com/practicalli/">https://github.com/practicalli/</a></p>
<h2 id="clojure-lsp">Clojure-LSP</h2>
<p><strong>Funding details:</strong> $9,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It&rsquo;s probably the only tool for Clojure that has most IDE&rsquo;s features in a single place that can be used on multiple editors.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<ul>
<li>Keep improving current features (cliche but takes a lot of time), clojure-lsp has a lot of features, some have performance issues that can be enhanced and others have corner cases that doesn&rsquo;t work for some user/project cases.</li>
<li>Support downstream issues/questions (Mainly Calva and Emacs requests)</li>
<li>Add more docs/guides about how to setup on other editors like IntelliJ, Sublime, vim etc.</li>
<li>Improve test support, like running and getting feedback of tests.</li>
<li>Add more code actions, these make the editor a lot more like a IDE giving quick actions to do refactors on current code.</li>
<li>Support upcoming LSP 3.17 official specification, including new features.</li>
<li>Add minimal Java interop support (find classes/method definition, see method arity), needs considerable work on clj-kondo side</li>
<li>Improve CLI/API support, making clojure-lsp not just a tool for editor but something to be used on CIs for example.</li>
<li>I want to try add a minimal debugger following DAP (Debugger Adapter Protocol), not sure if that will be bundled in clojure-lsp or as a separated project, but it will probably need some time/work</li>
</ul>
<h2 id="deep-diamond">Deep Diamond</h2>
<p><strong>Funding details:</strong> $9,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It is the infrastructure for deep learning, machine learning, and other high performance scientific software based on high-performance tensor operations.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>My goal with this round is to implement Recurrent Neural Networks (RNN) support in Deep Diamond.</p>
<p>Deep Diamond is a Clojure library for fast tensors and neural network computations based on the highly optimized native libraries and computation routines for both CPU and GPU.
It is a lean, high performance, infrastructure for working with tensors in Clojure, with emphasis on Deep Learning.
It currently supports general tensor operations, fully connected NN layers, and convolutional (CNN) layers, on CPU and GPU.</p>
<p>The major missing part is RNN support, which is commonly used in native language processing, timeseries, speech, translation, etc.</p>
<p>The state of the art implementation of low-level operations will be provided by integrating Nvidia&rsquo;s cuDNN (GPU), and Intel&rsquo;s oneDNN (CPU). Leading high-level frameworks for DL, TensorFlow and PyTorch, are based on the same libraries with lots of C++/Python cruft on top.
All these are very heavy, convoluted, and rather unclojure-y; Clojure can use them only as a second-class citizen, without much opportunity to extend and build on top. Clojure community found it a challenge even learning how to use these, yet alone build anything on top of them,
even though the area may be the most popular IT subject today. This is something that is currently poorly supported on the JVM, let alone Clojure.</p>
<p>My work is aiming to make a path for Clojure community to learn this area, and (hopefully) develop serious competence leading to application and tools on top of the infrastructure.</p>
<p>I propose to implement:</p>
<ul>
<li>a developer-friendly implementation of common RNN layers in Clojure</li>
<li>LSTM (long short-term memory cell) support</li>
<li>GRU (gated recurrent unit cell) support</li>
<li>an extension infrastructure for various backend implementations of RNN.</li>
<li>a clean low-level integration with Nvidia&rsquo;s cuDNN RNN on the GPU</li>
<li>a clean low-level integration with Intel&rsquo;s oneDNN RNN on the CPU</li>
<li>assorted improvements to Deep Diamond to support this additions</li>
<li>related bugfixes</li>
<li>TESTS (of course!)</li>
</ul>
<p>This would improve Deep Diamond and make it more complete as:</p>
<ul>
<li>A fast and simple Clojure-first infrastructure library that people can build on top of for everything tensor-related (which includes lots of ML)</li>
<li>A fast and user-friendly RNN implementation in Clojure</li>
<li>A showcase for Clojure&rsquo;s capabilities in expressiveness and performance (the existing implementation is already as fast or faster than alternatives in Python, Julia, Java, etc.)</li>
</ul>
<p>This will NOT be a port of TensorFlow, PyTorch, MXnet, nor DL4J, to Clojure. It does not even aim for the same features. As an JVM analogy, it stands in a similar position as Clojure vs Spring framework. It leverages DNNL and cuDNN to provide high-performance tensor operations similarly to how Clojure leverages JVM, and enable users to then use Clojure to find simpler and more effective ways to build higher-level functionality on top of it.</p>
<p>I will follow up this work with continuous improvement of Deep Diamond, and its ecosystem of books, docs, tutorials, etc. (I have already published two books covering this).</p>
<h2 id="datahike-server">Datahike Server</h2>
<p><strong>Funding details:</strong> $9,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>As one of the common Clojure Datalog database Datahike has matured over the last years from an experimental DataScript fork to a self-contained project. A mostly compliant API with Datomic and shared code with DataScript makes Datahike a good target for small to medium-sized projects that want to leverage the power of Datomic&rsquo;s Datalog flavor and the simplicity of DataScript&rsquo;s setup together with a simple extensible persistence layer that supports backends like JDBC or Azure CosmosDB. With more users running Datahike in production environments this year, the focus lies now on scalability through the remote server, and robustness through benchmarks, regression tests, security design as well as migrations in both schema and version.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>We will use the funding to bring both client and server into a usable state where it could be also used from other platforms as a REST system:</p>
<ul>
<li>history support: <a href="https://github.com/replikativ/datahike-server/issues/30">https://github.com/replikativ/datahike-server/issues/30</a></li>
<li>latest Datahike API support: <a href="https://github.com/replikativ/datahike-server/issues/31">https://github.com/replikativ/datahike-server/issues/31</a></li>
<li>healthcheck: <a href="https://github.com/replikativ/datahike-server/issues/32">https://github.com/replikativ/datahike-server/issues/32</a></li>
<li>database metrics: <a href="https://github.com/replikativ/datahike-server/issues/33">https://github.com/replikativ/datahike-server/issues/33</a></li>
<li>general support documentation: <a href="https://github.com/replikativ/datahike-server/issues/34">https://github.com/replikativ/datahike-server/issues/34</a></li>
<li>client adjustment: <a href="https://github.com/replikativ/datahike-client/issues/2">https://github.com/replikativ/datahike-client/issues/2</a></li>
<li>foreign platform client: <a href="https://github.com/replikativ/datahike-client/issues/3">https://github.com/replikativ/datahike-client/issues/3</a></li>
</ul>
<h2 id="tablecloth">Tablecloth</h2>
<p><strong>Funding details:</strong> $9,000 USD (12 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>This project is vital for the Clojure community in two related but distinct ways.</p>
<p>First, this project is a necessary piece of the broader goal of making the emerging Clojure data science ecosystem more accessible to beginning users. The tablecloth library is essential in this ecosystem because it is comfortable for beginners and fast. Adding support that is easy and intuitive (like tablecloth itself) and that leverages dtype-next’s high-performance abstractions for array-processing will help make this vital library still more complete and powerful.</p>
<p>Secondly, this project will promote a new style of programming that is suitable for exploring and managing large amounts of data fluidly. Dtype-next offers abstractions &ndash; primarily a typed, countable random-access buffer &ndash; that support optimized array processing on the JVM analogous to a tool like Python’s Numpy. However, its API operates at a lower level of abstraction than your average or beginning user would want to work daily. By providing a concrete interpretation of what it means to work with dtype-next at a higher-level of abstraction and in the style of tablecloth’s existing API, this project will introduce dtype-next’s array processing capabilities to a broader community by making them easy to use.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Currently, tablecloth provides an easy-to-use wrapper over tech.ml.dataset’s high-performance dataset processing constructs. One part of the tech.ml stack that tablecloth has not directly covered is dtype-next, which provides a highly performant basis for array-like numerical processing, similar to Numpy. The project I am proposing aims to wrap dtype-next within tablecloth, providing a new easy-to-use API for numerical structures for the emerging Clojure data processing ecosystem.</p>
<p>During this project, I will focus on the following tasks:</p>
<ol>
<li>
<p>Add a new function to tablecloth (perhaps named <code>column</code> or <code>array</code>) that will return a typed, countable, random-access data structure backed by dtype-next’s abstractions;</p>
</li>
<li>
<p>Design two API pathways to interact with this structure: one that realizes the data fully at each step, providing more straightforward but less efficient interaction; and another, more performant but slightly harder to use, that allows users to wrap processing steps in a &ldquo;transaction&rdquo;;</p>
</li>
<li>
<p>Mimic the Numpy (and possibly R vector) APIs ensuring an equivalently complete functional interface for numerical processing;
Ensure support reading-friendly format for printing columns in the Clojure REPL (see <a href="https://github.com/techascent/tech.ml.dataset/issues/203);">https://github.com/techascent/tech.ml.dataset/issues/203);</a></p>
</li>
<li>
<p>Validate the usefulness of the API by implementing real-world examples with various characteristics (missing values, various data types, challenging sizes, etc.) and comparing the ergonomics with other platforms such as Python and R.</p>
</li>
</ol>
<p>While working on the above tasks, I will also lean on the resources within the SciCloj community to ensure that the API is, in fact, easy to use. In particular, I will seek to validate the clarity of the API by testing experimental versions within the Scicloj &ldquo;study group&rdquo; (live-coding) sessions.</p>
<h2 id="clj-kondo-babashka-and-other-related-projects">Clj-kondo, babashka, and other related projects</h2>
<p><strong>Funding details:</strong> $9,000 USD (6 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Babashka and clj-kondo were mentioned in reply to &ldquo;Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?&rdquo;.</p>
<ul>
<li>
<p>Clj-kondo is a Clojure linter that is used by a wide variety of individual users
and companies(<a href="https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md)">https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md)</a>.</p>
</li>
<li>
<p>Babashka is a scripting environment that can execute a significant subset of JVM
Clojure programs with instant startup. It is used by a individual users and
companies (<a href="https://github.com/babashka/babashka/blob/master/doc/companies.md)">https://github.com/babashka/babashka/blob/master/doc/companies.md)</a>. It is currently my
project with the most stars on Github.</p>
</li>
<li>
<p>Sci is the Clojure interpreter powering babashka and several other projects (see
<a href="https://github.com/borkdude/sci#projects-using-sci)">https://github.com/borkdude/sci#projects-using-sci)</a>.</p>
</li>
</ul>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<ul>
<li>
<p>Clj-kondo</p>
<ul>
<li>linting for .clj-kondo/config.edn files (it&rsquo;s about time!)</li>
<li>discouraged var linter</li>
<li>warn on non-matching file and namespace names</li>
<li>analysis and API improvements for clojure-lsp</li>
<li>.cljc configuration/refinements</li>
<li>datalog linting improvements</li>
<li>numerous other little issues, see the project board:
<a href="https://github.com/clj-kondo/clj-kondo/projects/1">https://github.com/clj-kondo/clj-kondo/projects/1</a></li>
</ul>
</li>
<li>
<p>Babashka</p>
<ul>
<li>declarative pod configuration in bb.edn</li>
<li>babashka.nrepl-client library: a library to connect to running nREPL processes and evaluate expressions</li>
<li>babashka.http-client library: a library to consolidate the existing http clients in babashka</li>
<li>improve documentation in book.babashka.org</li>
<li>addressing issues of several libs in bb: fs, process, etc.</li>
</ul>
</li>
<li>
<p>SCI</p>
<ul>
<li>interop performance improvements</li>
<li>async documentation for usage in CLJS/JS</li>
</ul>
</li>
<li>
<p>Nbb (SCI on Node.js)</p>
<ul>
<li>(n)REPL improvements</li>
</ul>
</li>
</ul>
<h2 id="conjure">Conjure</h2>
<p><strong>Funding details:</strong> $2,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Conjure has become a popular (in my opinion) tool among Neovim users and is enough of a pull to convert some people over from Vim just for the support of the tool. It&rsquo;s not just a fluent way to interact with Clojure programs but it acts as a platform to work with other languages to increase the user base immensely.</p>
<p>This nexus of (mostly lispy) languages means improvements and bug fixes come from many sources and all accidentally help each other. The person that added TreeSitter support initially was doing it for the Julia lang, for example, but the Clojure ecosystem can benefit from it!</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Closing out various Clojure related feature requests and bugs as well as refactoring to make those changes possible. Conjure supports many languages, but my main audience and my main use is Clojure. I would love to integrate TreeSitter (a new feature in Neovim 0.5) more, allowing much richer and efficient evaluation mechanics.</p>
<p>I&rsquo;d like to rewrite and refine documentation and onboarding, especially <a href="https://github.com/Olical/magic-kit">https://github.com/Olical/magic-kit</a> and video content sharing workflows and introducing people to the language / tooling.</p>
<p>I&rsquo;d also like to work on a companion tool that bridges various REPL implementations to other REPLs, meaning Conjure can talk to more languages and servers while also benefiting tools such as Chlorine (the author of Chlorine has expressed interest in this idea and would love me to build it!). This means Conjure (or ANY Clojure client) could talk to socket (p)repls even though it only speaks nREPL since this bridge can perform the translation.</p>
<h2 id="reveal">Reveal</h2>
<p><strong>Funding details:</strong> $2,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Reveal is a visual inspector overlay that runs in the JVM, thus making it available in any IDE/text editor capable of sending forms to REPL. Having a good test runner UI independent of IDE/text editor makes it available to any Clojure developer. I think clojure.test is a bit cumbersome to use from the REPL, and I want to improve it.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I want to add a test runner to Reveal — a way to run Clojure tests that is more useful than running from the CLI:</p>
<ul>
<li>include UI elements that separate test output between different tests;</li>
<li>have access to test results as values in the VM, e.g. be able to inspect and evaluate code on expected/actual values;</li>
<li>have REPL integration for running and re-running tests, e.g. Reveal actions to run var/ns tests, or watch vars and re-run var&rsquo;s tests on var re-definitions</li>
</ul>
<h2 id="overtone-playground">Overtone Playground</h2>
<p><strong>Funding details:</strong> $2,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Overtone is one of most recognizable and popular projects in Clojure community. However, the development has ceased in recent years, and the tutorials are almost non-existent.
The potential of Overtone is massive, as it can be used to help newcomers to learn Clojure &amp; to program music.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I aim to open the door for learning and exploring music with Clojure and Overtone and (in the long term) resurrect Overtone development.</p>
<p>Overtone Playground builds on top of Overtone and aims to provide users with clear instructions on how to learn music and programming from scratch.</p>
<p>My minimal goals for this project are:</p>
<ul>
<li>Transcribe tutorial from Sonic-Pi so it can be followed with Overtone</li>
<li>Discover missing features in Overtone (while working on the tutorial)</li>
<li>Explore how to provide these features and work on prototypes</li>
<li>Music Theory Integration</li>
<li>Future Goal (not part of this application): Resurrect Overtone in the long run</li>
</ul>
<p>Overtone was one of the most popular Clojure projects, but the development has stalled since Sam Aaron (the main developer) switched all his efforts to
Sonic-Pi years ago. Sonic-PI is popular, actively developed, well funded, Ruby based project with lots of learning materials. Overtone has almost no instructions on how to use it; the little that is available is related to environment setup and technicalities without high-level learning materials. I aim to transcribe as much of Sonic-Pi book and tutorials as possible to Overtone code and examples.</p>
<p>Most of Sonic-Pi learning materials cannot be applied directly. Overtone is missing lots of high-level features of Sonic-Pi, and some low-level features due to different platforms. While transcribing the tutorial I will discover and systematize all these missing features, issues and challenges.</p>
<p>I will play with code examples and prototype the discovered features that are missing from Overtone. I am pretty sure that these prototypes will be far from perfect, but they will be the foundation for a more serious future work that will aim to resurrect Overtone. The goal of this future project would be to bring Overtone to usability level of Sonic-Pi.</p>
<p>Even Sonic-Pi is not perfect. While having good technical examples, its literature is fairly undeveloped regarding music theory. Since I am an experienced guitar player I can improve on both Sonic-Pi and Overtone literature in the area of music theory and creative aspects of those projects. I hope to make Overtone a good tool for learning both Clojure programming AND non-trivial music creation.</p>
<p>If this project goes well I hope that I&rsquo;ll be able to port lots of these improvements to Overtone itself and resurrect Overtone development. I hope this can be a good fit for a $9k funding in some of the future Clojurists Together rounds.</p>
<h2 id="biff">Biff</h2>
<p><strong>Funding details:</strong> $1,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>I think the Clojure ecosystem would benefit from having a strong, well-adopted web framework with lots of documentation and community support. Biff is IMO a good candidate for this, despite not having much adoption yet. I&rsquo;ve used it in my own bootstrapped business (<a href="https://thesample.ai/">https://thesample.ai/</a>) for the past 20 months and it&rsquo;s been wonderful. It&rsquo;s been tried out by a handful of people but I don&rsquo;t think anyone other than me has used it in production. It gets a lot of upvotes whenever I post about it on Reddit at least: <a href="https://www.reddit.com/r/Clojure/search/?q=biff">https://www.reddit.com/r/Clojure/search/?q=biff</a></p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I&rsquo;d like to finish up a major release that&rsquo;s been half done for a couple months. Most of the coding is finished, but I need to redo the new project template (in particular, I&rsquo;m replacing ClojureScript with HTMX, and switching to Railway.app as the default/recommended hosting provider) and also rewrite most of the documentation on <a href="https://biff.findka.com">https://biff.findka.com</a>.</p>
<p>After this release is finished, I&rsquo;d like to focus on writing tutorials, creating more example projects, and in general trying to get more people to use it and then iterating on the pain points. I only mention this because I am trying to allocate more time to Biff starting next week, so on the off chance that I both finish the release by next month and also get accepted, that&rsquo;s what I&rsquo;d use the funding for.</p>
<h2 id="orchard">Orchard</h2>
<p><strong>Funding details:</strong> $1,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>ClojureScript tooling is always worse than Clojure tooling, partly because it&rsquo;s harder to write, but also because it&rsquo;s a chicken and egg problem. This project is one of the underpinnings of most Clojure tooling, so it would be a good first step to reduce the gap.
Runtime tooling is always a great driver for more things to build on top, so having more of it in ClojureScript would also help the ecosystem.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Try to implement ClojureScript function dependency lookup similar to xref/fn-deps. I&rsquo;ve just extended the Clojure side of fn-deps and there is no such runtime tooling for ClojureScript anywhere.</p>
<h2 id="typed-clojure">Typed Clojure</h2>
<p><strong>Funding details:</strong> $1,000 USD (3 months)</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It provides static type checking for Clojure code as another tool for program verification. It is also a handy framework from which to study and conceptualize Clojure&rsquo;s semantics.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<h4 id="typed-clojurescript-stable-release">Typed ClojureScript stable release</h4>
<p>Typed Clojure is a type system for Clojure. It once supported ClojureScript, but it was put on hold in order to concentrate on improving the core type system.</p>
<p>The type system can seen many improvements, and I want to resurrect Typed ClojureScript so both Clojure and ClojureScript users can benefit from them.</p>
<p>In my last funding round for Clojurists Together I created an analyzer for ClojureScript code that supports partial macro expansion[1]. Building on this, I want to integrate the new analyzer with the Typed ClojureScript type checker.</p>
<p>Most of the Typed ClojureScript code base will need to be updated to support the latest ClojureScript version, the aforementioned analyzer, and the latest type system. If it goes well, we should be able to release a stable version of Typed ClojureScript so people can try it out.</p>
<p>[1] <a href="https://github.com/typedclojure/typedclojure/blob/d02755ed6fc6101ca9acc9e478079f5893fb4085/doc/clojurists-together-q3-2021-update2.md">https://github.com/typedclojure/typedclojure/blob/d02755ed6fc6101ca9acc9e478079f5893fb4085/doc/clojurists-together-q3-2021-update2.md</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Funding development on Custom Formatters for Firefox</title>
      <link>https://www.clojuriststogether.org/news/funding-development-on-custom-formatters-for-firefox/</link>
      <pubDate>Thu, 17 Feb 2022 14:30:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/funding-development-on-custom-formatters-for-firefox/</guid>
      <description>Clojurists Together is funding work to bring custom formatters to Firefox.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is funding work to bring custom formatters to Firefox. This will make Firefox a much more powerful tool for ClojureScript development, and bring more browser choice to the ClojureScript community.</p>
<h2 id="what-are-custom-formatters">What are Custom Formatters?</h2>
<p>One of the most useful tools for developing with ClojureScript is <a href="https://github.com/binaryage/cljs-devtools">cljs-devtools</a>. It implement&rsquo;s Chrome&rsquo;s <a href="https://docs.google.com/document/d/1FTascZXT9cxfetuPRT2eXPQKXui4nWFivUnS_335T3U/preview">custom formatters spec</a> to render ClojureScript&rsquo;s persistent data structures in a much more readable format.</p>
<p>CLJS Devtools example:</p>
<p><img src="https://camo.githubusercontent.com/142c820fadf564e7ca87c7f08b091759e404dbb5d77afbbe547312cd50ba71c0/68747470733a2f2f626f782e62696e6172796167652e636f6d2f636c6a732d646576746f6f6c732d73616d706c652d66756c6c2e706e67" alt=""></p>
<p>The only downside of cljs-devtools is that it is only available in Chrome. Many ClojureScript developers would like to use Firefox, but the lack of cljs-devtools made it hard to switch. At Clojurists Together we saw that and have worked with the Mozilla team and an independent contractor <a href="https://github.com/SebastianZ">Sebastian Zartner</a> to bring custom formatters to Firefox! We&rsquo;re funding Sebastian $18,000 USD to develop, test, and ship custom formatters.S</p>
<p>Sebastian is a long-time contributor to Firefox DevTools and was previously a core contributor to <a href="https://getfirebug.com">Firebug</a>.</p>
<h2 id="how-can-you-help">How can you help?</h2>
<p>When Sebastian is ready for more testing, we&rsquo;ll put out a call to the ClojureScript community, explaining how to test this beta feature and to give your feedback.</p>
<p>In the meantime, you can follow the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1734614">Custom Formatter meta issue</a> on the Firefox bugtracker.</p>
<h2 id="thanks">Thanks!</h2>
<p>Thanks to the Mozilla team for their support in developing this plan, to Sebastian for taking on this project, to Antonin Hildebrand for developing cljs-devtools, and to every Clojurists Together member for your help in funding this project.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>December 2021 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/december-2021-monthly-update/</link>
      <pubDate>Sat, 08 Jan 2022 05:40:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/december-2021-monthly-update/</guid>
      <description>Read updates from Dependabot Core, Clojure LSP, Typed Clojure, Polylith, Holy Lambda, Clojurians-log-v2, Malli, PCP, and our long term projects with Bozhidar Batsov, Dragan Djuric, Thomas Heller, David Nolen, and Nikita Prokopov</description>
      <content:encoded><![CDATA[<p>Happy New Year everyone! I hope all of you had a wonderful holiday season with your loved ones. Below are the recent project updates to wrap up the end of the year 2021.</p>
<h2 id="dependabot-core">Dependabot Core</h2>
<p>The dependabot core project has successfully been quick-started by having a technical conversation with Daniel.</p>
<p>We rapidly figured out that the people at github are currently considering a major rewrite/upgrade of the current apis, one that wouldn&rsquo;t
&ldquo;require us to write a whole bunch of ruby&rdquo; we realized later on.</p>
<p>Shortly after, Github&rsquo;s stakeholders were contacted involved in the process of figuring out the best way to build the system.
I also made sure to create a slack channel on the clojurians slack for communications on this.</p>
<p>We had a discussion with the GitHub Dependabot team, they&rsquo;re working on a new integration path which will be a lot easier for us to integrate against. The current plan is to review this new API sometime in Q1 2022.</p>
<p>For the next weeks, we&rsquo;re hoping to understand where the dependabot team is heading towards in terms of designs, and hopefully be able to tag along and start writing code that would benefit from the new apis.
I&rsquo;m also hoping to be able to involve as many people as possible in the work.</p>
<h2 id="clojure-lsp">Clojure LSP</h2>
<h4 id="release-20211116-165214httpsgithubcomclojure-lspclojure-lspreleasestag20211116-165214">release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2021.11.16-16.52.14">2021.11.16-16.52.14</a></h4>
<p>This release was focused mostly on housekeeping, minor fixes and improvements to keep features more mature and stable for most cases. We had huge improvements on  keywords completion, completion snippets improvements adding documentation and other details to common clojure.core snippets, code actions tune and more.
One of the new features was the ability to suggest require an already refer required before in other namespace, a very requested feature.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Improve rename feature to not heavily rely on valid source-paths for most cases.</li>
<li>Fix setTrace exception logs for graalvm native images.</li>
<li>Huge improvements on namespaces renames and namespaces references find. #573</li>
<li>Fix/Remove warnings during datalevin access.</li>
<li>Improve freezing for some MacOS cases. #631</li>
<li>Bump clj-kondo to <code>2021.10.20-20211116.110002-7</code> improving code parsing and other fixes.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Fix &ldquo;Add require&rdquo; code actions adding multiple requires instead of the selected.</li>
<li>Improve &ldquo;Add require&rdquo; wording, making it easier to understand what each different action will do.</li>
<li>Smart check all available refers to require, adding refer options to <code>Add require</code> code actions. #627</li>
<li>Big improvements on keyword completions. #630</li>
<li>Add setting <code>keep-parens-when-threading?</code> to keep parens for single arity functions when threading. #636</li>
<li>Avoid adding duplicate requires when adding a new require via code action. #640</li>
<li>Improve common known snippets to replace completion items, improving completion UX. #638</li>
</ul>
</li>
</ul>
<h4 id="release-20211201-122816httpsgithubcomclojure-lspclojure-lspreleasesedit20211201-122816">release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/edit/2021.12.01-12.28.16">2021.12.01-12.28.16</a></h4>
<p>This was a important release for community, a lot of new features we added, the main highlights are: It&rsquo;s possible to generate stubs for specific namespaces, this is a huge step for clojure-lsp as now it&rsquo;s possible to get most clojure-lsp features working even for closed source libraries like <code>datomic.api</code>.
There are new code actions like <code>Sort map</code> to sort a clojure map keys alphabetically and <code>Create function</code> which creates a unknown public function on the specified namespace or even create the namespace and require it automatically if doesn&rsquo;t exist yet.
We improved the <code>deps.edn</code> source-path discovery, improving support mostly for mono-repo projects like <code>polylith</code>!</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Add support for LSP method <code>textDocument/prepareRename</code> which it&rsquo;s the proper way to check if the rename will work correctly. #642</li>
<li>Expose new custom method <code>clojure/cursorInfo/raw</code> for custom hack on current cursor information code. #645</li>
<li>Support stub generation using <code>clj-easy/stub</code>, adding analysis and linting support for closed sources codes like Datomic. Check <code>:stubs</code> settings for more details. #637</li>
<li>Handle config deep merge differently for collections, concating instead of overwriting.</li>
<li>Fix unnecessary exception thrown on graal images during startup.</li>
<li>Support <code>deps.edn</code> <code>:local/root</code> source-paths discovery, improving support for monorepo projects like <code>polylith</code>. #652</li>
<li>New setting value for <code>:clean :sort :require</code>: <code>:lexicographic</code>. #654</li>
<li>Bump clj-kondo to <code>2021.10.20-20211126.151305-16</code>.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Support completion on aliased keywords. #649</li>
<li>Add new <code>Sort map keys</code> refactoring code action. #651</li>
<li>Add new <code>Create function</code> code action, allowing to create a function on a existing namespace or creating a new namespace + the function. #646</li>
<li>Improve <code>Extract function</code> refactoring to consider comments above current function.</li>
<li>Experimental: new <code>:linters :clj-kondo :async-custom-lint?</code> setting, when true, scan unused-public-vars async improving lint/analysis UI feedback for huge buffers (&gt; ~1000 lines). Default <code>false</code>.</li>
</ul>
</li>
</ul>
<h2 id="typed-clojure">Typed Clojure</h2>
<p>The goal of <a href="https://www.clojuriststogether.org/news/q3-2021-funding-announcement/">this project funded by Clojurists Together</a> is to
improve static type error messages in <a href="https://github.com/typedclojure/typedclojure">Typed Clojure</a>,
specifically to replace expanded code in error messages with surface-level syntax.</p>
<p>In the first half of the project (last update), I concentrated on three main areas:</p>
<ol>
<li>Increase direct support for problematic clojure.core macros</li>
<li>Improve error messages for inlining functions</li>
<li>Identify classes of implementation quirks in core Clojure macros to prepare for potential typing rules</li>
</ol>
<p>In the second half (this update), I:</p>
<ul>
<li>Improved the experience of mixing clojure.spec and Typed Clojure
<ul>
<li>Typed Clojure no longer complains about the expansion of <code>s/def</code> <code>s/fdef</code></li>
<li>Approach: implemented custom typing rules for both macros that ignores the body</li>
<li><a href="https://github.com/typedclojure/typedclojure/commit/2c423fb3daacaeb120b54a390c315588bba531a5">Commit</a></li>
</ul>
</li>
<li>Trimmed error messages
<ul>
<li>Some hints in error messages have become irrelevant noise.</li>
<li><a href="https://github.com/typedclojure/typedclojure/commit/613691ff176d05dd886a5d387979868a5f5ab2bb">Commit</a></li>
</ul>
</li>
<li>Created a proof-of-concept cljs.analyzer variant that can partially macroexpand
<ul>
<li>inspired by the inlining work from the first half of this project</li>
<li>Problem: CLJS uses lots of macros. Typed Clojure errors are even worse in CLJS.
<ul>
<li>eg., (+ 1 2) =&gt; (js* &ldquo;(~{})&rdquo; 1)</li>
<li>we want to pass (+ 1 2) to the type checker, not (js* &ldquo;(~{})&rdquo; 1)
<ul>
<li>but + is a macro call&hellip; not representable by cljs.analyzer</li>
</ul>
</li>
</ul>
</li>
<li>Solution: make partially expanded forms representable to the type checker
<ul>
<li>Type checker uses tools.analyzer-style AST&rsquo;s to analyze code
<ul>
<li>so does cljs.analyzer</li>
</ul>
</li>
<li>I created typed.clj.analyzer to add an :unanalyzed form for partially expanded forms
<ul>
<li>but I didn&rsquo;t know how to port to cljs</li>
</ul>
</li>
</ul>
</li>
<li>Promising early results
<ul>
<li>unit tests for pausing the expansion of the children of each AST :op</li>
</ul>
</li>
<li>Next: integrate into cljs checker (which was on pause for several years and needs a lot of other updates)</li>
<li><a href="https://github.com/typedclojure/typedclojure/commit/c8c2f870d7f58ff8a8abfaa83f939b5a824bd5cb">Commit</a></li>
</ul>
</li>
</ul>
<h2 id="polylith">Polylith</h2>
<p>I haven&rsquo;t been able to work near as much this quarter as the previous one (where I worked too much to finish everything) and I couldn&rsquo;t manage to finish the big task &ldquo;Custom commands&rdquo; (issue 113) but is working on it.</p>
<p>These tasks are finished but I will wait with a release till issue 133 is finished:</p>
<p>These tasks are finished but I will wait with a release till issue 133 is finished:</p>
<ul>
<li><a href="https://github.com/polyfy/polylith/issues/161">Issue 161</a>: If test setup fails, tests should not run</li>
<li><a href="https://github.com/polyfy/polylith/pull/148">PR 148</a>: restore description/url to generated pom.xml</li>
<li><a href="https://github.com/polyfy/polylith/issues/154">Issue 154</a>: Allow entities to be symbols in &ldquo;clojure -T&rdquo; commands</li>
<li><a href="https://github.com/polyfy/polylith/issues/144">Issue 144</a>: poly flags :dev alias if it has no :extra-paths in it</li>
<li><a href="https://github.com/polyfy/polylith/issues/145">Issue 145</a>: Calculate the size of the library even if using short shas</li>
</ul>
<h2 id="holy-lambda">Holy Lambda</h2>
<h4 id="version-060">Version 0.6.0</h4>
<p>Finally, I&rsquo;ve removed the mandatory download of dependencies to the local <code>.holy-lambda</code> directory. Previously both <code>deps.edn</code> and <code>bb.edn</code> required a special <code>:mvn/local-repo</code> keyword pointing to <code>.holy-lambda</code> directory to compile the project in Docker context or to pack <code>babashka</code> dependencies into deployable zip. Now uberjaring Clojure sources happen without Docker. Additionally, <code>bb hl:babashka-sync</code> packs <code>babashka</code> dependencies via a combination of <code>bb uberjar</code> and <code>unzip</code>. Thanks to packaging changes, it will be easier to cache dependencies in CI by pointing to standard <code>$HOME/.m2</code> directory. It&rsquo;s also possible to use <code>polylith</code> now since HL stopped requiring mounting local dependencies in the Docker context.
Moreover, packaging changes allowed me to reduce the deployment artifact size for <code>babashka</code>.</p>
<p>I&rsquo;m also pleased to announce a new extension for Holy Lambda request/response model that is <a href="https://github.com/FieryCod/holy-lambda-ring-adapter">holy-lambda-ring-adapter</a>.
The adapter supports the Ring request/response specification. Users may now utilize an adapter to run full-featured Ring applications on AWS Lambda. To boost productivity for API Lambda development, one can plug in an adapter with Jetty instead of relying on slow AWS Lambda API emulators.</p>
<p>AWS recently announced an AWS Lambda support for ARM-based processors. Running code on Graviton2 is beneficial for the users since both the cost per 1M invocations and the cold start time are lower. I&rsquo;ve introduced a new <a href="https://github.com/FieryCod/holy-lambda/pkgs/container/holy-lambda-builder">holy-lambda-builder</a> images hosted in Github Registry with the support to both ARM64 (aarch64) and AMD64 architectures. Furthermore, HL works now great with M1-powered Macs and aarch64 based builder images.</p>
<p>Babashka backend layers for each architecture are available in <code>AWS Serverless Repository</code>:</p>
<ul>
<li><a href="https://serverlessrepo.aws.amazon.com/applications/eu-central-1/443526418261/holy-lambda-babashka-runtime-amd64">AMD64 Babashka backend Layer</a></li>
<li><a href="https://serverlessrepo.aws.amazon.com/applications/eu-central-1/443526418261/holy-lambda-babashka-runtime-arm64">ARM64 Babashka backend Layer</a></li>
</ul>
<h4 id="version-061">Version 0.6.1</h4>
<p>Holy Lambda now automatically parses the inner body of the event according to <code>content-type</code> to <code>:body-parsed</code> field.
I&rsquo;ve bumped the inner <code>babashka</code> dependency in the backend layer to version <code>0.6.3</code>.</p>
<h4 id="version-062">Version 0.6.2</h4>
<p>The new version brings some improvements in tasks and <code>babashka</code> backend. Users can now update tasks to the latest stable revision by invoking the <code>bb hl:update-bb-tasks</code> command. I was also able to speed up the <code>babashka</code> backend by removing the costly classpath calculation in the init step by taking into account the recent changes to packaging.</p>
<p>Babashka&rsquo;s backend layer now also doesn&rsquo;t depend directly on <code>holy-lambda</code>.</p>
<p>Why it&rsquo;s important?</p>
<ul>
<li>users can now deploy the backend layer and provide their implementation of the custom runtime,</li>
<li>users can now update the <code>holy-lambda</code> independently by packaging a new version in the dependencies layer.</li>
</ul>
<h2 id="clojurians-log-v2">Clojurians-log-v2</h2>
<p>Hello fellow clojurians!</p>
<p>The beta release of Clojurians log v2 is live at: <a href="https://clojurians-log-v2.oxal.org/">https://clojurians-log-v2.oxal.org/</a> 🦄 😊</p>
<p>Source code: github.com/oxalorg/clojurians-log-v2</p>
<p>The initial goal we had with clojurians=log-v2 was mostly around improved full
text searching. But as we all know the clojurians slack was sponsored for a paid
version for the next 1 year (thanks to all who got this done!) which means our
direction has to change a little.</p>
<p>Although full text search will be available and working on the v2, we would like
to focus more on other parts of the app now and find ways to make the logs more
usefull because paid slack already does search very well.</p>
<p>With that said the beta release now had the following work put into it:</p>
<ul>
<li>The importing of data for threaded messages / replies / reactions has been
added. This was huge as this was the last key pending in the idempotent
imports 🎉.</li>
<li>UI now shows all thread messages directly under the parent. This is effecient
enough to not cause any slowdowns.</li>
<li>The UI is now fully mobile responsive 📱. That means easy reading of logs from
your bed, and also better SEO points by Google!</li>
<li>That brings us to SEO. Not only are we fully compatible with the existing
clojurians-log, but we have also added lots of open-graph tags, html structure
and other small changes for optimal SEO brownie points. The improved seo tags
should also now help &ldquo;Clojure&rdquo; to rank higher in the TIOBE index.</li>
<li>Lots of behind the scene work to improve deployment strategy. Although not
fully automated, I have some local scripts which gets me to deploy new
versions quite easily. A future task would be to convert it into GH actions.</li>
<li>Added support for db migrations using migratus.</li>
<li>Analytics for the website are now PUBLIC. You can view them at
<a href="https://clojurians-log-v2.goatcounter.com/">https://clojurians-log-v2.goatcounter.com/</a></li>
</ul>
<p>I would like to extend immense gratitude to the clojurists-together team and the
clojure community for helping us get here.</p>
<p>So what&rsquo;s next? We do have a near-future roadmap of things which should land in very soon:</p>
<ul>
<li>Right now all the data imports are manual. Implementing of real-time socket
API and making it compatible / interchangable with the idempotent incremental
imports (w/ option to backfill data) is posing a bit of a hassle which needs
some more work</li>
<li>Although we&rsquo;ve got the reactions into the database, rendering of reactions as
emojis on the UI is pending</li>
<li>Contacting a clojurians slack admin to get the data up-to-date</li>
</ul>
<p>After that, there are tons more ideas listed on the repo which should keep us
busy throughout the next year! Super humbled and excited to continue working on
this 🙏😊</p>
<p>Cheers and Happy New Years everyone 🌟🎄</p>
<p>Mitesh (@oxalorg)</p>
<h2 id="malli">Malli</h2>
<p>Part 2/3 by <a href="https://twitter.com/ikitommi">Tommi Reiman</a>.</p>
<img src="https://raw.githubusercontent.com/metosin/malli/master/docs/img/malli.png" width=150 align="right"/>
<h4 id="done-stuff">Done Stuff</h4>
<ul>
<li>Shipped one of the biggest releases of Malli, the 0.7.0 on Dec 7th! contained all the stuff done earlier + small fixes and more performance improvements &amp; tests</li>
<li>Wrote <a href="https://www.metosin.fi/blog/high-performance-schemas-in-clojurescript-with-malli-1-2/">High-Performance Schemas in Clojure/Script with Malli 1/2</a> to celebrate the release</li>
<li>Implemented a most wanted feature, <a href="https://github.com/metosin/malli/blob/master/CHANGELOG.md#swappable-default-registry">a swappable default registry</a></li>
<li>Helping users and contributors (should do much more of this)</li>
<li>27 Closed PRs</li>
<li>Pushed five small patch releases (0.7.1 - 0.7.5) with bug fixes, updated dependencies and some nice schema provider improvements:
<ul>
<li>support for <code>:map-of</code>, <code>:tuple</code> and <code>:enum</code> types</li>
<li>support for type-hints</li>
<li>schema inferring via value decoding (e.g. <code>:uuid</code>, <code>inst?</code>)</li>
<li>performance improvements</li>
</ul>
</li>
<li>Improvements to <a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a> interop</li>
</ul>
<h4 id="todo">TODO</h4>
<p>Zillion things to do and 2 months to go. Currently working on <a href="https://github.com/metosin/malli/pull/606">destructuring parser</a> to enable first-class support inline typehints and to support inferring of function schemas from vanilla Clojure/Script. Seems like the easy features are all done, just the hard ones left :)</p>
<p>Cheers.</p>
<h2 id="pcp">PCP</h2>
<p>TLDR</p>
<ul>
<li><input checked="" disabled="" type="checkbox"> Create Project using CLI from <a href="https://github.com/alekcz/pcp-template">template project</a></li>
<li><input checked="" disabled="" type="checkbox"> Introduce dev daemon simplified local development</li>
<li><input checked="" disabled="" type="checkbox"> Reworked CLI for easier maintenance</li>
<li><input checked="" disabled="" type="checkbox"> Automated docker image creation</li>
<li><input checked="" disabled="" type="checkbox"> Add convenience script for docker</li>
<li><del>Trigger Deploy from CLI</del></li>
<li><del>Deploy from git</del></li>
<li><input disabled="" type="checkbox"> Create 1-click deploy to Heroku</li>
<li><input disabled="" type="checkbox"> Document the new and improved PCP.</li>
</ul>
<p>Hello friends. I hope you had a pleasant holiday season. It&rsquo;s been an interesting 45 days for PCP. I&rsquo;m in two minds about the progress to date. Hammock time overtook hand on keyboard time. The change was quite uncomfortable but I think overall better for the project.</p>
<p>Initially my thinking was to add functionality like the firebase-cli with something along the lines of <code>pcp deploy</code> as well as something like heroku where <code>git push pcp</code> would trigger a deploy. These two approaches are critical in the absence of container based deploys. They are however (in my estimation) inferior if containerized deploys are possible. I spent a fair bit investigating both.</p>
<ul>
<li><code>pcp deploy</code> introduces the question whether latest in git is equivalent to the latest deployed version.</li>
<li><code>git push pcp</code> requires either a standalone git server (not possible with a $5 VPS) or two a fro between the VPS and the git repository.</li>
</ul>
<p>Both of these issues are eliminated by connecting the pcp docker images and the project repository directly to DigitalOcean or Heroku (or any other app platform) as you get the the benefits of the $5 VPS (low price) without the downside (managing the infra).</p>
<p>After coming this  conclusion improving the CLI became a lot more straight forward. The CLI is now easier to maintain and the end user can create project from the CLI directly in a manner that allows the project to be deployed to DigitalOcean directly.</p>
<p>There are two task I need to complete as part of Clojurists Together funding specifically the new documentation and the deployment to Heroku so our end user isn&rsquo;t locked in to DigitalOcean. I expect to complete these in the next week or so.</p>
<p>So what&rsquo;s next?
This update is the last one as part of the Clojurists Together funding. It&rsquo;s not the end of PCP though.
I used PCP to build a simple In Memoriam during the last quarter. I now want to use PCP in anger, perhaps in e-commerce to really stress test it. I imagine I&rsquo;ll pick up some rough edges and bugs in the process.</p>
<p>It&rsquo;s been real. Stay frosty.</p>
<p>Alex</p>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>In the past couple of months I&rsquo;ve achieved the following major objectives:</p>
<ul>
<li>Released nREPL 0.9 (<a href="https://metaredux.com/posts/2021/12/12/nrepl-0-9.html">https://metaredux.com/posts/2021/12/12/nrepl-0-9.html</a>)</li>
<li>Released CIDER 1.2 (<a href="https://metaredux.com/posts/2021/12/22/cider-1-2-nice.html">https://metaredux.com/posts/2021/12/22/cider-1-2-nice.html</a>)</li>
</ul>
<p>Some smaller achievements from this period:</p>
<ul>
<li>Lots of documentation improvements for CIDER (<a href="https://docs.cider.mx">https://docs.cider.mx</a>)</li>
<li>CIDER is now available for installation from NonGNU ELPA (<a href="https://elpa.nongnu.org/nongnu/cider.html">https://elpa.nongnu.org/nongnu/cider.html</a>)</li>
<li>cider-nrepl and orchard had new releases. Orchard finally achieved its goal to
get rid of its dynapath dependency and is now a dep-free library (which is a very desirable trait in development tooling).</li>
</ul>
<p>Going forward I&rsquo;ll need to update Leiningen for nREPL (mostly to support starting a server listening to an Unix socket), solidify the API specs for nREPL and cider-nrepl and continue to polish the new CIDER functionality. If I have enough time and inspiration I might revisit sayid for a bit as well. Thanks to everyone for your support!</p>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>The main objective during November and December was to create a cuDNN-based GPU implementation of Deep Diamond&rsquo;s
support for advanced neural networks developed on the CPU in the previous two months.
Previously, Deep Diamond&rsquo;s cuDNN engines supported fully connected layers, convolutional layers, and a bunch of supporting
infrastructure for effective learning, including access at different abstraction tiers, from lowest, tensor routines level,
to automatic network construction from pure, simple, Clojure functions. Tensor operations were quite well developed, too.
This high level API only supported sequential architecture of layers (which is quite useful) but
not branching that would enable advanced direct acyclic graphs, which is used in many modern networks.
This required matching implementation of relevant lower level concepts that I&rsquo;ve developed on DNNL, but backed by cuDNN.
While working on this, I fixed bugs that slipped previously, improved general code, and tests.</p>
<p>The following features were developed for cuDNN engine:</p>
<pre><code>- Implementation of Bach Normalization (API, functions, layer, and the cuDNN backend)
- Concatenation (API, functions, layer, cuDNN backend)
- Branching (API, functions, layer, cuDNN backend)
- Sum (API, functions, layer, cuDNN)
- Split (API, functions, layer, cuDNN)
- Parallel network branches support for cuDNN
- Tested cuDNN support for directed acyclic graphs in high-level API
- Improved some internal code.
- Several important bugfixes
- Tests for all this
- Research (literature, theory) in the background
</code></pre>
<p>Although that work finely summed up by the end of the month, I&rsquo;m still not satisfied with the polish,
so I decided not to rush the release before doing further high-level tests. I expect to uncover some
more subtle bugs (of course, whoever wants to experiment, can easily clone the repository from GitHub and build their own snapshot).
I plan to tackle this in January, since I wouldn&rsquo;t be able to do more serious deep work during that time
due to numerous classes and exams.</p>
<p>I hope that in February I&rsquo;ll be able to have more uninterupted periods for the next major theme (still
undecided what will come first: Neanderthal sparse matrices, Neanderthal FFT, or some work on Deep Diamond support for recurrent networks).
Anyway, the next big chunk of work in February, March, and/or April should be Recurrent Networks support,
as the last major feature that was missing from DD.</p>
<p>In addition to this, I devoted lots of time to learning skills in preparation for a new Clojure project.
There&rsquo;s a long path ahead, so it might be many months until I&rsquo;m ready to actually build and release
something, but I hope that this long shot will be interesting to many Clojurists,
and hopefully many not(yet)-Clojurists. (I realize that this sentence is verbatim copy/paste from the
last report, but it&rsquo;s the same long-term work that the sentence describes accurately. ;)</p>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>Current shadow-cljs version: 2.16.10 <a href="https://github.com/thheller/shadow-cljs/blob/master/CHANGELOG.md">Changelog</a></p>
<p>Notable Updates</p>
<ul>
<li>Updated everything to support the latest ClojureScript and Closure Compiler/Library releases. This included some breaking changes originating from the Closure Library. More info is available in the <a href="https://clojurescript.org/news/2021-11-04-release">ClojureScript news post</a>.</li>
<li>Added a new <code>^:dev/asset-load</code> metadata hook as requested by <a href="https://github.com/thheller/shadow-cljs/issues/951">#951</a>. This allows calling a CLJS function after a CSS file was hot-reloaded. This may be useful if you are using <code>getComputedStyle</code> and use the results somewhere in your code.</li>
</ul>
<p>Example:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">defn </span><span style="color:#f92672">^</span><span style="color:#e6db74">:dev/asset-load</span> css-updated! [path node]
  (<span style="color:#a6e22e">js/console.log</span> <span style="color:#e6db74">&#34;css-updated!&#34;</span> path node))

<span style="color:#75715e">;; path is the path used in &lt;link href=&#34;...&#34;&gt;</span>
<span style="color:#75715e">;; node is the actual link DOM node</span>
</code></pre></div><h2 id="david-nolen">David Nolen</h2>
<h4 id="november">November</h4>
<ul>
<li>ClojureScript core.async: #js literal support</li>
<li>ClojureScript Test GitHub CI for Windows</li>
<li>General ClojureScript JIRA issues review</li>
</ul>
<h4 id="december">December</h4>
<ul>
<li>Support Node.js &ldquo;exports&rdquo; in package.json (Fixes Firebase v9 usage)</li>
<li>ClojureScript Test GitHub CI for Windows</li>
<li>General ClojureScript JIRA issues review</li>
</ul>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hi, this is Niki Tonsky and I have been writing lots of Clojure for the past two months!</p>
<h4 id="datascripthttpsgithubcomtonskydatascript"><a href="https://github.com/tonsky/datascript/">DataScript</a></h4>
<ul>
<li>6 new releases.</li>
<li>A full rewrite of <code>pull</code>/<code>pull-many</code>, up to 7× faster than before. <code>pull</code> is finally a better choice than <code>entity</code> performance-wise, as it was always supposed to be.</li>
<li>Patches and PRs.</li>
</ul>
<h4 id="humbleuihttpsgithubcomhumbleui"><a href="https://github.com/HumbleUI">HumbleUI</a></h4>
<ul>
<li><a href="https://github.com/HumbleUI/Skija/blob/master/script/build_utils.py">Unified build system</a> between all projects.</li>
<li>Skija upgdated to Skia m98.</li>
<li>Common types between JWM and Skija extracted into <a href="https://github.com/HumbleUI/Types">github.com/HumbleUI/Types</a>.</li>
<li>Simplified JWM usage: layers, event listeners, event propagation.</li>
<li>Ship Skija layers with JWM (Skija linked optionally).</li>
<li>All you need to get started with JWM now is create a window and provide <code>onPaint</code> handler. Everything else is optional.</li>
<li><a href="https://github.com/HumbleUI/HumbleUI/blob/214352b2296ad89091c7891d7407a8b19d172d14/dev/user.clj#L23-L49">Basic Clojure APIs</a> already allow one to build simple (but dynamic!) UIs. A screenshot:</li>
</ul>
<p><img src="https://github.com/HumbleUI/HumbleUI/raw/main/extras/screenshot.png" alt=""></p>
<p>This first UI demostrates:</p>
<ul>
<li>JWM and Skija integration.</li>
<li>Text labels (including Unicode).</li>
<li>Correct text measurement (notice how perfectly centered text inside a button is).</li>
<li>Nested components.</li>
<li>Basic dynamic layout (center, gap, padding, column) relative to window size.</li>
<li>Dynamic components (hoverable/clickable button, click counter).</li>
<li>Composable and reusable components (see <a href="https://github.com/HumbleUI/HumbleUI/blob/214352b2296ad89091c7891d7407a8b19d172d14/dev/user.clj#L23-L49">the code</a>).</li>
</ul>
<h4 id="clojure-sublimedhttpsgithubcomtonskyclojure-sublimed"><a href="https://github.com/tonsky/Clojure-Sublimed">Clojure Sublimed</a></h4>
<ul>
<li>10 new releases.</li>
<li><a href="https://tonsky.me/blog/sublime-clojure/">Publicly announced</a>.</li>
<li>Renamed from Sublime Clojure to pass Package Control naming guidelines.</li>
<li>Still not merged to Package Control, but perfectly avaliable from sources.</li>
<li>Many patches by me and <a href="https://github.com/jaihindhreddy">Jaihindh Reddy</a>.</li>
</ul>
<h4 id="uberdepshttpsgithubcomtonskyuberdeps"><a href="https://github.com/tonsky/uberdeps/">Uberdeps</a></h4>
<ul>
<li>Issue: <a href="https://github.com/tonsky/uberdeps/pull/45">Munge Main-Class name</a> submitted by <a href="https://github.com/mvproton">Maks</a>.</li>
</ul>
<h4 id="tonguehttpsgithubcomtonskytongue"><a href="https://github.com/tonsky/tongue/">Tongue</a></h4>
<ul>
<li>Feature: <a href="https://github.com/tonsky/tongue/issues/32">Override missing key message</a>.</li>
</ul>
<h4 id="netasynchttpsgithubcomtonskynetasync"><a href="https://github.com/tonsky/net.async">net.async</a></h4>
<ul>
<li><a href="https://github.com/tonsky/net.async/pull/5">Unbind server port when calling shutdown!</a> via <a href="https://github.com/dpetran">dpetran</a>.</li>
</ul>
<h4 id="youtube">YouTube:</h4>
<ul>
<li>New <a href="https://www.youtube.com/watch?v=HU_fvRfY2VA">Talk on QML</a> (in Russian)</li>
<li>Advent of Code, <a href="https://www.youtube.com/playlist?list=PLdSfLyn35ej-UL9AuxUvoFXerHac4RYnH">all 25 days</a> solved live in Clojure, Sublime Text and Clojure Sublimed in front of a camera.</li>
</ul>
<h4 id="design">Design:</h4>
<ul>
<li><a href="https://tonsky.me/design/#clj-commons">New logo for clj-commons</a></li>
<li><a href="https://tonsky.me/design/#eql">New logo for EQL</a></li>
</ul>
<p>To wrap up 2021, I build this simple interactive demo in Humble UI <a href="https://youtu.be/qqfiWlr2YHw">watch it here</a></p>
<p>Happy New Year!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Next funding round</title>
      <link>https://www.clojuriststogether.org/news/next-funding-round/</link>
      <pubDate>Thu, 23 Dec 2021 22:22:58 +0100</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/next-funding-round/</guid>
      <description>Applications for our next funding round are open until January 10th 2022.</description>
      <content:encoded><![CDATA[<p><strong>Clojurists Together is starting our next funding round for Q1 2022. Applications are open until the 10th of January 2022. <a href="/open-source/">Apply</a> today!</strong></p>
<p>Developers can choose between three different funding tiers ($1,000, $2,000, $9,000) and can decide on the length of the funding, from 3 to up to 12 months (for the $9,000 tier). In addition, funding can be delayed by up to two months. The $1k and $2k funding tiers are for experimental projects, whereas the $9k tier for more established projects.</p>
<p>Similar to the <a href="q3-2021-funding-announcement">last funding round</a>, we are planning to fund three developers for each tier, resulting in 9 developers in total and a total funding amount of $36,000.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>According to our last survey, this is what our members are looking for:</p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things our members were interested in:</p>
<ul>
<li>Developer Experience Tools</li>
<li>Build tooling</li>
<li>IDE support</li>
<li>Documentation</li>
<li>Test tooling</li>
<li>Error Messages</li>
<li>Debuggers</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>Clojure LSP</li>
<li>CIDER</li>
<li>ClojureScript compiler</li>
<li>clj-kondo</li>
<li>Shadow CLJS</li>
<li>Babashka</li>
</ul>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>October 2021 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/october-2021-monthly-update/</link>
      <pubDate>Wed, 22 Dec 2021 06:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2021-monthly-update/</guid>
      <description>Read updates from Clojure LSP, Clojurians-log-v2, Malli, PCP and our long term projects with Bozhidar Batsov, Michiel Borkent, Dragan Djuric, Thomas Heller, David Nolen, and Nikita Prokopov.</description>
      <content:encoded><![CDATA[<p>This post includes also our long-term projects updates. Here are the project updates from the second half of October to November. Updates for December will be coming soon!</p>
<h2 id="clojure-lsp">Clojure LSP</h2>
<p>This month we had 2 important releases with a lot of fixes and improvements!</p>
<h4 id="release-20211020-130411httpsgithubcomclojure-lspclojure-lspreleasestag20211020-130411">release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2021.10.20-13.04.11">2021.10.20-13.04.11</a></h4>
<p>This release had some big core changes like replacing the cache db implementation from <code>sqlite</code> to <code>datalevin</code>, this increase a lot the performance of saving and reading the cache improving clojure-lsp startup time.
Besides that, a lot of bugs and improvements were made like auto refresh settings if any changed, performance improvements, new code actions to create tests from current function, and last but not least, the <code>clojuredocs</code> integration, showing examples, documentation, notes about the current symbol!</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Improve initialization feedback report messages, this is important for user knows what server is doing during it&rsquo;s initialization and how much time left.</li>
<li>Consider <code>dev</code> and <code>test</code> alias for deps.edn projects as project-specs during classpath lookup. #586</li>
<li>Avoid scanning source-paths twice, as it was being considered as part of external classpath as well.</li>
<li>Change cache db from sqlite to datalevin for faster startup + better graalvm compatibility.</li>
<li>Make the cache analysis save async to make startup faster.</li>
<li>Support Auto refresh settings memoizing with a ttl of 1 second avoiding the need of restarting server when changing configs. #502</li>
<li>Bump clj-kondo adding new <code>gen-class</code> linter and other fixes/improvements. Fixes #589</li>
<li>Remove unused duplicate require if any. #527</li>
<li>Fix crash on clean-ns when ns contains comments.</li>
<li>Improve project analysis filter to check source-paths. #597</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Add reference code lens for ns forms. #578</li>
<li>Fix expand-let bug that occurs when a list form precedes let. #590</li>
<li>Add new command to create test for function at point. #582</li>
<li>Add new code action to create test for current function/var</li>
<li>Add <code>private</code> to documentSymbol to make clear that a var or function is  <code>private</code>.</li>
<li>Add new code action <code>Suppress xxx diagnostic</code>, adding clj-kondo comment code to ignore the diagnostic. #591</li>
<li>Add more semantic tokens: aliases for macros, variable and function definitions.</li>
<li>Add <a href="https://clojuredocs.org/">clojuredocs</a> information during symbol hover. #571</li>
</ul>
</li>
</ul>
<h4 id="release-20211102-152447httpsgithubcomclojure-lspclojure-lspreleasesedit20211102-152447">release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/edit/2021.11.02-15.24.47">2021.11.02-15.24.47</a></h4>
<p>This release added some new features like new live rename locals on files with the new LSP <code>LinkedEditingRange</code> feature, new <code>Unwind thread</code> code actions, huge improvement on <code>Add missing require</code> code action making it smarter on finding which namespace is related to the unresolved alias, and the change of <code>:notify-references-on-file-change</code> from false to true after important performance improvements on clojure-lsp, which this clojure-lsp will have more consistent diagnostics about user&rsquo;s projects becoming a more reliable tool.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Bump Graalvm from 21.2.0 to 21.3.0 improving binary performance/size</li>
<li>Fix wrong parse of code when code contains namespaced maps like <code>#:foo{:bar 1}</code>. This issue was affecting a lot of features for example code actions.</li>
<li>Bump datalevin from 0.5.26 to 0.5.27.</li>
<li>Improve semantic tokens for dynamic vars, function definitions, namespaced and aliased keywords.</li>
<li>Fix bug where <code>:source-paths</code> settings could be hot-reloaded with wrong-value.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Deprecates setting <code>:show-docs-arity-on-same-line?</code> in favor of <code>:hover</code> <code>:arity-on-same-line?</code>.</li>
<li>Add support to new LSP <code>LinkedEditingRange</code> feature. #341</li>
<li>Improve suggested <code>Add require ...</code> code actions, this should make clojure-lsp smarter when user wants to add a missing require. #614</li>
<li>Change <code>:notify-references-on-file-change</code> default from <code>false</code> to <code>true</code>, we had some performance improvements and I&rsquo;ve been testing this for some time now and didn&rsquo;t see any new issues with that. This should improve a lot the UX when user change any code that is references on other files, updating the diagnostics for those files as well.</li>
<li>Improve rename feature UX to output errors when it&rsquo;s not possible rename.</li>
<li>Add support for <code>window/showDocument</code> LSP method, used on <code>create-test</code> command/code action after creating the test to show the test file.</li>
<li>Add new <code>Unwind thread once</code> and <code>Unwind whole thread</code> code actions to undo a thread call.</li>
<li>Improve code actions performance requesting async all actions.</li>
<li>Add new LSP custom method <code>clojure/clojuredocs/raw</code> which takes a symbol and a namespace (both strings) and returns any Clojuredocs entry found, otherwise <code>null</code>.</li>
<li>Fix missing keywords rename/references for destructured keywords.</li>
</ul>
</li>
<li>
<p>CLI</p>
<ul>
<li>Show error/warning message when a classpath scan fail during analysis. Fixes #626</li>
<li>Add coloring to <code>diagnostics</code> output matching diagnostic severity.</li>
</ul>
</li>
</ul>
<h2 id="clojurians-log-v2">Clojurians-log-v2</h2>
<p>Hello fellow clojurians!</p>
<p>The alpha release of Clojurians log v2 is now live at: <a href="https://clojurians-log-v2.oxal.org/">https://clojurians-log-v2.oxal.org/</a> 🦄 😊</p>
<p>Source code: <a href="https://github.com/oxalorg/clojurians-log-v2">github.com/oxalorg/clojurians-log-v2</a></p>
<p>PS: it&rsquo;s not 100% usable on mobile yet, please use a desktop for the time being!</p>
<p>This release brings in the following features:</p>
<ul>
<li>Search across the entire slack logs
<ul>
<li>try it here: <a href="https://clojurians-log-v2.oxal.org/search?q=hello+clojurians">https://clojurians-log-v2.oxal.org/search?q=hello+clojurians</a></li>
<li>lots of work is still pending to get this into an actual usable state, but hey it works! 💃</li>
<li>searches over 2 million messages in ~50-500ms!</li>
</ul>
</li>
<li>ansible scripts to setup the server
<ul>
<li>setup user, fail2ban, firewall, postgres, docker, java, clojure, git, caddy, SSL, etc.</li>
</ul>
</li>
<li>🐿 Web app deployed live on a domain 🌏 on a Hetzner VPS (2cpu, 4gb ram)</li>
<li>setup docker deployment and recreating process</li>
<li>setup the production postgres db</li>
<li>idempotent import data for channels, members, and messages
<ul>
<li>it works (atleast for the current schema, most likely to change soon)</li>
<li>fixed mysterious null character issues in slack dumps, postgres really doesn&rsquo;t like to eat <code>\u0000</code> chars for breakfast</li>
<li>only partial data is imported (~2 million messages) as I only have slack dumps till June 2021</li>
<li>expect things to break because I&rsquo;m still messing around with indexes, rankings, and migrations to optimise search and other queries 🤪</li>
<li>imports for reactions, threads, etc are still pending</li>
</ul>
</li>
<li>added <code>mrkdwn</code> message rendering with emojis</li>
<li>more advanced configuration, dynamic based on <code>:dev</code> vs <code>:prod</code></li>
<li>proper support for secrets via a <code>secrets.edn</code> file</li>
<li>lots of small bug fixes, UI/UX changes, optimized db queries, refactoring, etc.</li>
</ul>
<p>I wanted to ship the minimal possible version first and then iterate over it. And I&rsquo;m quite happy with this. Looking forward to adding lots more features and polish over the next few months, especially related to text searching!</p>
<p>Please feel free to hop over in #clojureverse-ops channel in clojurians slack to discuss anything related to this project! Thanks.</p>
<h2 id="malli">Malli</h2>
<p>Have spent a lot of time working with Malli internals: on hammock, paper protos,
reading about stuff done elsewhere, perf tuning and testing, better designs, in the mushroom forest,
refactoring and finally, an initial new internal design I&rsquo;m quite happy with.</p>
<h4 id="the-performance-gains">The Performance gains</h4>
<ul>
<li>Malli has now an 1-2 orders of magnitude faster Schema inferrer</li>
<li>Malli&rsquo;s <a href="https://github.com/metosin/malli#performance">runtime validation and transformation performance</a> is on most cases better than using idiomatic hand-written Clojure, while being fully declarative.</li>
<li>Schema creation and transformations are 10-200 times faster than before</li>
<li>Schema workers can be effectively cached yielding much better dev experience (and perf)</li>
<li>Relevant resolved issues and PRs:
<ul>
<li>malli.providers/provide takes &ldquo;forever&rdquo; for large samples, <a href="https://github.com/metosin/malli/issues/191">#191</a></li>
<li>Performance of Schema and Worker Creation, <a href="https://github.com/metosin/malli/issues/513">#513</a></li>
<li>Schema AST - Fast Schema Creation and Transformations, <a href="https://github.com/metosin/malli/issues/543">#543</a></li>
<li>Perf part4, <a href="https://github.com/metosin/malli/pull/539">#539</a></li>
<li>faster mu/merge, <a href="https://github.com/metosin/malli/pull/540">#540</a></li>
<li>Schema AST, Cached and other performance improvement, <a href="https://github.com/metosin/malli/pull/544">#544</a></li>
<li>Cleanup, Entry parser protocol, worker caches and fast inferring, <a href="https://github.com/metosin/malli/pull/550">#550</a></li>
</ul>
</li>
</ul>
<h4 id="the-release">The Release</h4>
<p>All the current improvements are shipped in <code>[metosin/malli &quot;0.7.0-20211031.202317-3&quot;]</code>, will test it properly againt real projects before releasing 0.7.0. See the full <a href="https://github.com/metosin/malli/blob/master/CHANGELOG.md#070-20211031202317-3-2021-10-31">CHANGELOG</a>.</p>
<h2 id="pcp">PCP</h2>
<h4 id="tldr">TLDR</h4>
<p>[x] Created docker image for PCP
[x] Created <a href="https://github.com/alekcz/pcp-template">template project</a> with  1-click deploy to DigitalOcean
[x] Improved security with strict mode by only allowing access to <code>/var/pcp/</code>
[x] Automatically route domains to similarly name folders</p>
<p>Hello friends. Hope you&rsquo;re all well. It&rsquo;s been a pretty productive month and half. I&rsquo;m pretty happy with the progress so far and I hope you&rsquo;ll be too.</p>
<p>These last 45 days I focused on achieving a 1-click deploy to DigitalOcean (DO). Unfortunately DOs app platform doesn&rsquo;t natively support Clojure (or Java for that matter), it does however support docker images. And so I went down the long winding path of creating a docker image for PCP and deciphering the DO spec for 1-click deploy apps.</p>
<p>Out of this herculean effort (aka skimming the docs and paying the price)  a number of default options are now configurable via environment variables; when PCP was only service this wasn&rsquo;t necessary. We also got 1-click deploys to DO from this effort. That &ldquo;Deploy to DigitalOcean&rdquo; really is a thing of beauty.</p>
<p>Once deploying was working it dawned on my that further changes to the core of PCP were required. You see hosting multiple sites per instance was pretty simple when PCP was running as a service on a VPS, but now with docker some changes were necessary. After some tinkering, PCP now routes requests based on the host name of a request so your various domains will be routed to the right place with minimum admin on your part. e.g. navigating to <code>www.clojuriststogether.org</code> will send PCP looking for a project in <code>/var/pcp/www.clojuriststogether.org/</code>. If no folder matches the host name PCP targets <code>/var/pcp/default</code>. Pretty neat, right?</p>
<h4 id="so-whats-next">So what&rsquo;s next?</h4>
<p>There are a few more tweaks I&rsquo;d like to make so that copying the template project easier. From there my focus will then shift to the CLI and deploying from git. Depending how things go I might also create a 1-click deploy to Heroku. My only hesitation with Heroku is their pricing for upgrades, it&rsquo;s tad too steep.</p>
<p>That&rsquo;s all from me. Stay frosty.</p>
<p>Alex</p>
<h4 id="here-are-the-updates-from-our-long-term-project-grantees">Here are the updates from our long-term project grantees.</h4>
<h2 id="bozhidar-batsov">Bozhidar Batsov</h2>
<p>My focus for the past couple of months were:</p>
<ul>
<li>nREPL 0.9 (we&rsquo;re more or less feature-complete there)</li>
<li>clj-refactor/refactor-nrepl 3.0 (released)</li>
<li>CIDER 1.2 (ETA Dec)</li>
</ul>
<p>The main improvements to CIDER in this period were:</p>
<ul>
<li>proper support for sideloading</li>
<li>integration with enrich-classpath (a Lein plugin that automatically fetches Java sources and Javadoc)</li>
<li>babashka support in cider-jack-in</li>
</ul>
<p>As usual there was also some bug-fixing, documentation updates and lots of support work going on.</p>
<h2 id="michiel-borkent">Michiel Borkent</h2>
<p>I&rsquo;ll be going over the releases of existing and new projects and will mention highlights in some of them. Often, the devil is in the details and there aren&rsquo;t any new user-facing features, but still a lot of work has gone into refining existing features.</p>
<p>Note that the projects listed below are not exclusively my effort and are worked on by a number or regular contributors. My thanks also goes out to them.</p>
<h4 id="nbbhttpsgithubcombabashkanbb"><a href="https://github.com/babashka/nbb">Nbb</a></h4>
<p>Ad-hoc CLJS scripting on Node.js using SCI.</p>
<p>Many releases on <a href="https://www.npmjs.com/package/nbb">npm</a>.</p>
<p>Highlights:</p>
<ul>
<li>Console REPL. If you have Node.js simply type npx nbb and you will be dropped into a REPL.</li>
<li>Socket server REPL</li>
<li>nREPL server for development with Calva</li>
<li>Add <strong>clojure.test</strong> so you can now use nbb to develop e.g. browser tests using puppeteer or playwright</li>
<li>Support for reader conditionals using <strong>:org.babashka/nbb</strong></li>
<li>Print nicer stacktrace when error happens (similar to bb)</li>
<li>Misc. fixes and enhancements.</li>
<li>Add <strong>js-interop</strong> module</li>
<li>Add Javascript API</li>
</ul>
<p>Many exciting things are happening around this project in the community. It&rsquo;s now possible to run nbb on <a href="https://github.com/vharmain/nbb-lambda-adapter">lambda</a>. <a href="https://github.com/babashka/nbb/discussions/91#discussioncomment-1510273">Exercism</a> is using babashka and nbb to run Clojure exercise submissions. <a href="https://github.com/chr15m/sitefox">Sitefox</a> is a CLJS + Node.js web framework that works well with nbb.</p>
<h4 id="clj-kondohttpsgithubcomclj-kondoclj-kondo"><a href="https://github.com/clj-kondo/clj-kondo">Clj-kondo</a></h4>
<p>A linter for Clojure (code) that sparks joy.</p>
<p>Releases: <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20211019">2021.10.19</a>, <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20210925">2021.09.25</a>, <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20210915">2021.09.15</a>, <a href="https://github.com/clj-kondo/clj-kondo/blob/master/CHANGELOG.md#20210914">2021.09.14</a></p>
<p>Highlights:</p>
<ul>
<li>New linter: warn on missing <strong>gen-class</strong> when writing <strong>-main</strong> function. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#main-without-gen-class">docs</a>.</li>
<li>New <strong>loop</strong> without <strong>recur</strong> linter. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#loop-without-recur">docs</a>.</li>
<li>Several inference improvements, e.g. <strong>(def f (fn [])) (f 1 2)</strong> will now give an arity warning.</li>
<li>Return arbitrary metadata in analysis data. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/analysis/README.md">docs</a>.</li>
</ul>
<h4 id="babashkahttpsgithubcombabashkababashka"><a href="https://github.com/babashka/babashka">Babashka</a></h4>
<p>Native, fast starting Clojure interpreter for scripting.</p>
<p>Releases: <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#064">0.6.4</a>, <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#063">0.6.3</a>, <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#062">0.6.2</a>, <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#061">0.6.1</a>, <a href="https://github.com/babashka/babashka/blob/master/CHANGELOG.md#060">0.6.0</a></p>
<p>Highlight:</p>
<ul>
<li>Support for java.net HTTP Client (via raw Java interop). This enables running <a href="https://github.com/schmee/java-http-clj">java-http-clj</a> from source.</li>
</ul>
<h4 id="api-diffhttpsgithubcomborkdudeapi-diff"><a href="https://github.com/borkdude/api-diff">Api-diff</a></h4>
<p>Print API diffs between library versions.</p>
<p>This is a new project.</p>
<h4 id="scihttpsgithubcombabashkasci"><a href="https://github.com/babashka/sci">SCI</a></h4>
<p>Configurable Clojure interpreter suitable for scripting and Clojure DSLs.</p>
<p>Releases: <a href="https://github.com/babashka/sci/blob/master/CHANGELOG.md#v027">0.2.7</a></p>
<p>Highlights:</p>
<ul>
<li>Loads of JS improvements coming from usage in <a href="https://github.com/borkdude/nbb">nbb</a>. Printing in JS targets can now be controlled via <em>print-fn</em> like in ClojureScript.</li>
</ul>
<h4 id="neilhttpsgithubcombabashkaneil"><a href="https://github.com/babashka/neil">Neil</a></h4>
<p>A CLI to add common aliases and features to deps.edn-based projects.</p>
<p>This is a new project.</p>
<h4 id="edamamehttpsgithubcomborkdudeedamame"><a href="https://github.com/borkdude/edamame">Edamame</a></h4>
<p>Configurable EDN/Clojure parser with location metadata</p>
<p>Releases: <a href="https://github.com/borkdude/edamame/blob/master/CHANGELOG.md#0012">0.0.12</a></p>
<h4 id="scittlehttpsgithubcombabashkascittle"><a href="https://github.com/babashka/scittle">Scittle</a></h4>
<p>The Small Clojure Interpreter exposed for usage in browser script tags.</p>
<p>Releases: <a href="https://github.com/babashka/scittle/blob/main/CHANGELOG.md#v004">0.0.4</a></p>
<h4 id="babashkafshttpsgithubcombabashkafs"><a href="https://github.com/babashka/fs">Babashka.fs</a></h4>
<p>File system utility library.</p>
<p>Releases: <a href="https://github.com/babashka/fs/releases/tag/v0.1.0">0.1.0</a></p>
<p>Highlight: <strong>add fs/zip</strong> function.</p>
<h4 id="depscljhttpsgithubcomborkdudedepsclj"><a href="https://github.com/borkdude/deps.clj">Deps.clj</a></h4>
<p>A faithful port of the clojure CLI bash script to Clojure. Used as native CLI, deps resolver in babashka and getting started REPL in Calva.</p>
<p>Various <a href="https://github.com/borkdude/deps.clj/releases">releases</a></p>
<h4 id="graal-build-timehttpsgithubcomclj-easygraal-build-time"><a href="https://github.com/clj-easy/graal-build-time">Graal-build-time</a></h4>
<p>Library to initialize Clojure packages at build time with GraalVM native-image.</p>
<p>This is a new project.</p>
<h4 id="graal-confighttpsgithubcomclj-easygraal-config"><a href="https://github.com/clj-easy/graal-config">Graal-config</a></h4>
<p>GraalVM native-image configurations distribution for Clojure libraries.</p>
<p>This is a new project.</p>
<h4 id="jethttpsgithubcomborkdudejet"><a href="https://github.com/borkdude/jet">Jet</a></h4>
<p>Releases: 0.0.16</p>
<p>Highlight: allow keywordize fn to access all available conversion functions from camel-snake-kebab lib. e.g. <strong>csk/-&gt;PascalCase</strong>.</p>
<h4 id="digesthttpsgithubcomclj-commonsdigest"><a href="https://github.com/clj-commons/digest">Digest</a></h4>
<p>Digest algorithms (md5, sha1 &hellip;) for Clojure.</p>
<p>I took over this library from Miki Tebeka and I&rsquo;m maintaining it under clj-commons.</p>
<h4 id="carvehttpsgithubcomborkdudecarve"><a href="https://github.com/borkdude/carve">Carve</a></h4>
<p>Carve out the essentials of your Clojure app.</p>
<p>Fixed a regression.</p>
<h2 id="dragan-djuric">Dragan Djuric</h2>
<p>My main objective in September and October was to improve Deep Diamond&rsquo;s support for advanced neural networks.
Previously, Deep Diamond supported fully connected layers, convolutional layers, and a bunch of supporting
infrastructure for effective learning, including access at different abstraction tiers, from lowest, tensor routines level,
to automatic network construction from pure, simple, Clojure functions. Tensor operations were quite well developed, too.
However, the high level API only supported sequential architecture of layers (which is quite useful) but
not branching that would enable advanced direct acyclic graphs, which is used in many modern networks.
This required implementation of relevant lower level concepts and the integration with appropriate Intel DNNL routines.
While I was at DNNL, I decided to integrate a few other layer types, which will be used all-around in network training.</p>
<p>This includes:</p>
<pre><code>- Implementation of Bach Normalization (API, functions, layer, and the DNNL backend)
- Concatenation (API, functions, layer, DNNL backend)
- Branching (API, functions, layer, DNNL)
- Sum (API, functions, layer, DNNL)
- Split (API, functions, layer, DNNL)
- Parallel network branches support
- Support for directed acyclic graphs in high-level API
- Implementation of Reduction operation in DNNL backend
- Removing a few protocols and concepts that were rendered obsolete by the new code
- Improving support for simpler resource requirements for inference-only networks
- Several important bugfixes (that took lots of time to even identify bugs, so it was subtle but important for future robustness)
- Tests for all this
- Research (literature, theory) in the background
</code></pre>
<p>All this work solidly, but needs more polishing AND functional tests with real networks, so I was not able
to cut a release (of course, whoever wants to experiment, can easily clone the repository from GitHub and build their own snapshot).
I plan to tackle this in the next period.</p>
<p>In particular, I need to implement the same stuff on the GPU with cuDNN, and properly test and polish this new functionality.</p>
<p>I hope that in the next two months I&rsquo;ll be able to do that, and release this major improvement. After that,
the next big chunk of work will be Recurrent Networks support, as the last major feature that was missing from DD.</p>
<p>In addition to this, I devoted lots of time to learning skills and early preparations for a new Clojure project
that I plan to start with a new Clojure programmer. There&rsquo;s a long path ahead, so it might be many months until
we&rsquo;re ready to actually build and release something, but I hope that this long shot will be interesting to many Clojurists, and hopefully many not(yet)-Clojurists.</p>
<h2 id="thomas-heller">Thomas Heller</h2>
<p>Time was mostly spent on doing maintenance work and some bugfixes. As well as helping people out via the typical channels (eg. Clojurians Slack).</p>
<p>I did some work on the shadow-cljs UI as well, most notably:</p>
<ul>
<li>Making the Inspect browser slightly smarter when using maps with mixed keys (eg. vectors and keywords). When displaying maps Inspect tries to sort keys before displaying. This previously failed when mixed keys where used but now works fine. Sorting is important since otherwise hash-maps may appear is a somewhat random order making it difficult to find certain keys you may be looking for.</li>
<li>First draft of &ldquo;Explore Runtime&rdquo;, you can find it in the shadow-cljs UI Runtimes tab (defaults to http://localhost:9630/runtimes). The idea was to display all loaded namespaces and their vars in a somewhat structured manner and letting you click around and work with it. Turns out that this requires much more work to be of any actual use (eg. namespace/var filtering+search) but it works for CLJ and all CLJS build targets that support the REPL. Even without any builds you can always test this using the default Clojure Runtime (ie. the runtime shadow-cljs itself is running in) and exploring the shadow-cljs internal runtime state. Find the <code>shadow.cljs.devtools.server.runtime</code> namespace and the <code>instance-ref</code> in there. Hope to make this all a little more usuable over time. Ideas are welcome.</li>
</ul>
<h2 id="david-nolen">David Nolen</h2>
<ul>
<li>ClojureScript JIRA tickets</li>
<li>Update ClojureScript to latest Google Closure Compiler /
Lbrary - handle breaking changes, future-proofing work</li>
</ul>
<h2 id="nikita-prokopov">Nikita Prokopov</h2>
<p>Hi, this is Niki Tonsky and we are building a Desktop UI Framework in Clojure!</p>
<p>The work on UI framework started in September with a blog post that collected everything I knew about UI frameworks. This is that post: <a href="https://tonsky.me/blog/clojure-ui/">https://tonsky.me/blog/clojure-ui/</a></p>
<p>The post caused a fantastic feedback and filled my read/watch list for weeks to come. In reaction to that feedback, I did three public interviews with developers involved in UI programming:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=PwuwG2-0n3I">Raph Levien on Rust Druid</a></li>
<li><a href="https://www.youtube.com/watch?v=Nk6mcyv7Sz4">Adrian Smith on Clojure Membrane</a></li>
<li><a href="https://www.youtube.com/watch?v=qn6M2WO_TDE">Yakov Zhmurov on Epam Unified UI</a> (in Russian)</li>
</ul>
<p>Both JWM and Skija were migrated from JetBrains Github into the neutral HumbleUI organization and deployed to Maven Central repository.</p>
<p>JWM got a few quality-of-life fixes regarding mouse scroll, themes, z-order and macOS crashes. We also got native-image example contributed.</p>
<p>Finally, as the culmination of all that preparation, the first commit to the new Clojure UI framework <a href="https://github.com/HumbleUI/HumbleUI/commit/d8eca60ef77f22a26d472fb38440109928b72f47">has been made</a>!</p>
<p>Another big thing that happened in October is Sublime Clojure: a new Clojure REPL client for Sublime Text.</p>
<p>Github repo: <a href="https://github.com/tonsky/sublime-clojure">https://github.com/tonsky/sublime-clojure</a>
Blog post: <a href="https://tonsky.me/blog/sublime-clojure/">https://tonsky.me/blog/sublime-clojure/</a>
Youtube lecture on Clojure REPLs in general: <a href="https://www.youtube.com/watch?v=Rdk5r1bjBoc">https://www.youtube.com/watch?v=Rdk5r1bjBoc</a></p>
<p>DataScript, Uberdeps, Tongue are all continued to be maintained and got few PRs merged.</p>
<p>Finally, one more post was written in September <a href="https://tonsky.me/blog/python-build/">https://tonsky.me/blog/python-build/</a></p>
<p>My hope is that majority of November and December will be focused on Humble UI from now on.</p>
<p>If any of that sounds exciting to you and you want to participate, both <a href="https://github.com/HumbleUI/JWM">JWM</a> (Java/C++) and <a href="https://github.com/tonsky/sublime-clojure">Sublime Clojure</a> (Python) need a few helping hands and both have a huge scope for contributions. Let me know!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>September 2021 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/september-2021-monthly-update/</link>
      <pubDate>Sun, 17 Oct 2021 09:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/september-2021-monthly-update/</guid>
      <description>Read updates from Clojure LSP, Polylith, Holy Lambda, and Typed Clojure.</description>
      <content:encoded><![CDATA[<p>A big welcome to new company members <a href="https://stylitics.com">Stylitics</a>, <a href="https://parkside.app/">Parkside</a>, and <a href="https://www.doctronic.de/">doctronic</a>; thanks for your support!</p>
<h4 id="here-are-the-project-updates-from-the-month-of-september-to-the-first-half-of-october">Here are the project updates from the month of September to the first half of October.</h4>
<h1 id="clojure-lsp">Clojure LSP</h1>
<p>This was the month with the most changes, updates, and fixes of the project!
Also, this is the new clojure-lsp webpage: <a href="https://clojure-lsp.io">https://clojure-lsp.io</a></p>
<h3 id="release-20210913-193200httpsgithubcomclojure-lspclojure-lspreleasestag20210913-193200">release <a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2021.09.13-19.32.00">2021.09.13-19.32.00</a></h3>
<p>This release added a new <code>diagnostics</code> feature to clojure-lsp API, making clojure-lsp the only tool that can do most Clojure lint tasks in a single tool!
Besides that, it was fixed a lot of issues and improved some defaults to make clojure-lsp a tool that just works out of the box along with some preparations for changing the way clojure-lsp persists the analysis cache.</p>
<p>Here is the changelog of this release:</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Create .clj-kondo folder if not exists in the project root. #528</li>
<li>Fix exception when <code>:clojure-lsp/unused-public-var</code> linter is <code>:off</code>. #546</li>
<li>Bump clj-kondo to <code>2021.08.07-20210903.210340-28</code> to fix a false-positive with potemkin. <a href="https://github.com/clj-kondo/clj-kondo/issues/1370">https://github.com/clj-kondo/clj-kondo/issues/1370</a>.</li>
<li>Bump clj-kondo to <code>2021.08.07-20210909.131804-29</code> fixing issues with built-in clj-kondo cache not present on graalvm binaries. #548</li>
<li>Exclude <code>cljs.test/deftest</code> from unused public vars linter.</li>
<li>Migrate default db file from <code>.lsp/sqlite.db</code> to <code>.lsp/.cache/sqlite.db</code>, this is necessary as in the future we will replace sqlite with other db implementation, for users they just need to consider/gitignore the <code>.lsp/.cache</code> folder, this way any next change on db implementations or any other cache will not affect user.</li>
<li>Auto migrate existing <code>.lsp/sqlite.db</code> to new <code>.lsp/.cache/sqlite.db</code> to avoid unnecessary project re-scan.</li>
<li>Deprecates <code>:sqlite-db-path</code> in place of <code>:cache-path</code>.</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Fix <code>didChangeWatchedFiles</code> to correctly create the file on the server, properly change file content and re-scan with clj-kondo, or remove file analysis. This should improve LSP analysis reliability when changing files outside the editor. #536</li>
<li>Improve completion only showing valid local vars for the current cursor.</li>
<li>Improve completion sorting adding priority to each item, showing most used symbols like variables and functions first before other completion items.</li>
</ul>
</li>
<li>
<p>API/CLI</p>
<ul>
<li>New <code>diagnostics</code> command, which returns all diagnostics found by clojure-lsp (using clj-kondo). Check the API section for more details.</li>
</ul>
</li>
</ul>
<h3 id="clojure-lsp-1">Clojure LSP</h3>
<p>I released version <a href="https://github.com/clojure-lsp/clojure-lsp/releases/edit/2021.09.30-12.28.16">2021.09.30-12.28.16</a>.</p>
<p>This release focused on improving user UX giving better feedback during clojure-lsp startup both on API and editor. Also, it fixed a lot of issues making clojure-lsp a more mature tool with fewer false positives and more settings to work with more Clojure projects.</p>
<ul>
<li>
<p>General</p>
<ul>
<li>Use lower-case for refer/import/require sorting. #560 #561</li>
<li>Avoid removing comments when sorting/cleaning namespace. #559</li>
<li>Break lines when sorting refers along with then new <code>:clean :sort :refer :max-line-length</code> setting with a default of <code>80</code>. #562</li>
<li>Deprecate <code>lens-segregate-test-references</code> in favor to <code>:code-lens :segregate-test-references</code></li>
<li>Check for a default <code>.cljfmt.edn</code> config file for cljfmt config settings if no <code>:cljfmt-config-path</code> was provided. #563</li>
<li>Bump clj-kondo to <code>2021.09.25</code> fixing false-positives with potemkin import-var analysis.</li>
<li>Re-scan whole project if any clj-kondo config changed for better consistence. #331</li>
<li>Fix clojure-lsp not initializing when empty <code>project.clj</code>. #579</li>
<li>Support finding config in classpath via new setting<code>:classpath-config-paths [&quot;my-org/my-lib&quot;]</code>. #580</li>
</ul>
</li>
<li>
<p>Editor</p>
<ul>
<li>Fix <code>resolve macro as</code> code action after regression introduced recently.</li>
<li>Fix <code>unused-public-var</code> not being suppressed during project startup. #554</li>
<li>Improve <code>hover</code> feature to return elements when inside a function call. #569</li>
<li>Fix <code>create-private-function</code> command and code action to consider when new function is inside thread macros.</li>
<li>Support <code>$/progress</code> LSP feature, sending notifications for client when server is starting, improving the feedback for the user.</li>
<li>Improve semantic tokens support for java classes and methods.</li>
</ul>
</li>
<li>
<p>API/CLI</p>
<ul>
<li>Support renaming namespaces as well with <code>rename</code> feature.</li>
<li>Use relative paths instead of absolute paths on diff messages.</li>
<li>Add <code>analyze-project!</code> to analyze whole project only and cache analysis, useful for REPL usage for example.</li>
<li>Follow same exit status from clj-kondo for <code>diagnostics</code> feature. #572</li>
<li>Improve start project feedback reporting the percentage and specific message.</li>
</ul>
</li>
</ul>
<h1 id="polylith">Polylith</h1>
<p>I&rsquo;ve released <a href="https://github.com/polyfy/polylith/releases/tag/v0.2.13-alpha">version 0.2.13-alpha</a> of the poly tool, which includes the interactive shell command and a few more issues:</p>
<ul>
<li>Shell command with history and auto-complete, issue <a href="https://github.com/polyfy/polylith/issues/106">#106</a></li>
<li>Show Indirect changes for projects, Issue <a href="https://github.com/polyfy/polylith/issues/124">#124</a></li>
<li>Move the poly documentation to gitbook, issue <a href="https://github.com/polyfy/polylith/issues/128">#128</a></li>
<li>Ignore top level data readers, issue <a href="https://github.com/polyfy/polylith/issues/129">129</a></li>
<li>Polylith should manage its own brew tap, issue <a href="https://github.com/polyfy/polylith/issues/131">#131</a></li>
<li>Use tools.build, issue <a href="https://github.com/polyfy/polylith/issues/134">#134</a></li>
<li>Restrict naming of bricks, issue <a href="https://github.com/polyfy/polylith/issues/135">#135</a></li>
<li>Use deps and paths in development when running tests, issue <a href="https://github.com/polyfy/polylith/issues/137">#137</a></li>
<li>Symbolic links to non-existing source files throws exception, issue <a href="https://github.com/polyfy/polylith/issues/138">#138</a></li>
</ul>
<h1 id="holy-lambda">Holy Lambda</h1>
<p>I&rsquo;ve successfully refactored the holy-lambda core. Handlers can now be defined via regular <code>defn</code> and composed freely before passing to the <code>entrypoint</code> macro. The only functionality exposed from the core is <code>entrypoint</code> that now accepts additional parameter <code>init-hook</code> for side effect initialization of dependencies before the runtime loop executes. The following addition is handy if you want to initialize dependencies only once.</p>
<p>I&rsquo;ve also decoupled holy-lambda from AWS SAM. As a result, tasks are faster, less error-prone, and minimal. My plans for the next few months are to remove problematic tasks: <code>hl:sync</code> &amp; <code>hl:compile</code> and focus almost entirely on runtime. However, I plan no changes around native compilation and native configuration generation.</p>
<p>I&rsquo;ve also published a brand new documentation, which is available <a href="https://fierycod.github.io/">here</a>. Documentation is almost complete, but additional explanations for the native backend regarding the java agent are required.</p>
<p><strong>Some other changes</strong>:</p>
<ul>
<li>Bump of the docker images:</li>
<li>:ce - GraalVM CE 21.2.0</li>
<li>:dev - GraalVM DEV 21.3.0-dev-20210910_2147</li>
<li>Babashka backend now supports bb 0.6.1</li>
<li>I&rsquo;ve submitted the <a href="https://github.com/metosin/jsonista/pull/58">patch</a> to <code>jsonista</code> to make the library compatibile with GraalVM &gt;= 22.0, and got accepted. This is important, because HL will remain compatibile with future GraalVM versions and no additional configurations for native-image will be required.</li>
</ul>
<p>I&rsquo;m also finishing the benchmarks for the new release. I hope the new release to be a much faster one, especially for the subsequent handler calls. The results will be published in the next month of funding.</p>
<p>Next month I&rsquo;m also planning to release an Ring adapter for HL. The significant progress has been done in that area, so stay tuned.</p>
<h1 id="typed-clojure">Typed Clojure</h1>
<p>The goal of <a href="https://www.clojuriststogether.org/news/q3-2021-funding-announcement/">this project funded by Clojurists Together</a> is to
improve static type error messages in <a href="https://github.com/typedclojure/typedclojure">Typed Clojure</a>,
specifically to replace expanded code in error messages with surface-level syntax.</p>
<p>In the first half of the project, I have concentrated on three main areas:</p>
<ol>
<li>Increase direct support for problematic clojure.core macros</li>
<li>Improve error messages for inlining functions</li>
<li>Identify classes of implementation quirks in core Clojure macros to prepare for potential typing rules</li>
</ol>
<h3 id="increase-direct-support-for-problematic-clojurecore-macros">Increase direct support for problematic clojure.core macros</h3>
<p><strong>Problem</strong>: Typed Clojure expands macros that it does not have special rules for. This
works well when the expansion is simple (eg., <code>binding</code>, <code>future</code>, or <code>delay</code>), but this strategy
backfires horribly for complex macros like <code>doseq</code>.</p>
<p>For example, <code>doseq</code> does not have direct support in Typed Clojure <code>1.0.17</code> and any usage of it results
in an incomprehensible error message (note: <code>t/cf</code> type [c]hecks a [f]orm):</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj -Sdeps <span style="color:#f92672">&#39;</span>{<span style="color:#e6db74">:deps</span> {org.typedclojure/typed.clj.checker {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.17&#34;</span>}}}}<span style="color:#f92672">&#39;</span>
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[clojure.core.typed <span style="color:#e6db74">:as</span> t])
nil
user=&gt; (<span style="color:#a6e22e">t/cf</span> (doseq [a [nil <span style="color:#e6db74">:a</span> <span style="color:#ae81ff">3</span>]] (inc a)))
Type Error (<span style="color:#a6e22e">NO_SOURCE_PATH</span><span style="color:#e6db74">:1:7</span>)
Loop requires more annotations


in<span style="color:#960050;background-color:#1e0010">:</span>
(<span style="color:#a6e22e">loop*</span>
 [seq_30744
  (<span style="color:#a6e22e">clojure.core/seq</span> [nil <span style="color:#e6db74">:a</span> <span style="color:#ae81ff">3</span>])
  chunk_30745
  nil
  count_30746
  <span style="color:#ae81ff">0</span>
  i_30747
  <span style="color:#ae81ff">0</span>]
 (<span style="color:#a6e22e">if</span>
  (<span style="color:#a6e22e">clojure.core/&lt;</span> i_30747 count_30746)
  (<span style="color:#a6e22e">clojure.core/let</span>
   [a (<span style="color:#a6e22e">.nth</span> chunk_30745 i_30747)]
   (<span style="color:#66d9ef">do </span>(inc a))
   (<span style="color:#a6e22e">recur</span>
    seq_30744
    chunk_30745
    count_30746
    (<span style="color:#a6e22e">clojure.core/unchecked-inc</span> i_30747)))
  (<span style="color:#a6e22e">clojure.core/when-let</span>
   [seq_30744 (<span style="color:#a6e22e">clojure.core/seq</span> seq_30744)]
   (<span style="color:#a6e22e">if</span>
    (<span style="color:#a6e22e">clojure.core/chunked-seq?</span> seq_30744)
    (<span style="color:#a6e22e">clojure.core/let</span>
     [c__6014__auto__ (<span style="color:#a6e22e">clojure.core/chunk-first</span> seq_30744)]
     (<span style="color:#a6e22e">recur</span>
      (<span style="color:#a6e22e">clojure.core/chunk-rest</span> seq_30744)
      c__6014__auto__
      (<span style="color:#a6e22e">clojure.core/int</span> (<span style="color:#a6e22e">clojure.core/count</span> c__6014__auto__))
      (<span style="color:#a6e22e">clojure.core/int</span> <span style="color:#ae81ff">0</span>)))
    (<span style="color:#a6e22e">clojure.core/let</span>
     [a (<span style="color:#a6e22e">clojure.core/first</span> seq_30744)]
     (<span style="color:#66d9ef">do </span>(inc a))
     (<span style="color:#a6e22e">recur</span> (<span style="color:#a6e22e">clojure.core/next</span> seq_30744) nil <span style="color:#ae81ff">0</span> <span style="color:#ae81ff">0</span>))))))



Execution error (<span style="color:#a6e22e">ExceptionInfo</span>) at clojure.core.typed.errors/print-errors! (<span style="color:#a6e22e">errors.cljc</span><span style="color:#e6db74">:274</span>).
Type Checker<span style="color:#960050;background-color:#1e0010">:</span> Found <span style="color:#ae81ff">1</span> error
</code></pre></div><p>We need explicit support for <code>doseq</code> and similar macros to both improve inference and error messages.</p>
<p><strong>Prior work</strong>: Before custom typing rules were possible in Typed Clojure, an alternative macro <code>clojure.core.typed/doseq</code>
was provided for compatibility with the type checker. For example, instead of <code>(doseq [a [1]] ..)</code> you would write <code>(t/doseq [a :- Int, [1]] ...)</code>.</p>
<p>This macro had some downsides:</p>
<ol>
<li>all bindings required annotations.</li>
<li>it had poor discoverability as <code>doseq</code>&rsquo;s error message makes no mention of this alternative.</li>
</ol>
<p><strong>Approach</strong>: Create typing rule for <code>doseq</code> and create or enhance typing rules for other  problematic <code>clojure.core</code> macros.</p>
<p><strong>Results</strong>:</p>
<p><code>doseq</code> is now supported and error messages are pleasant. Note the error msg for <code>inc</code> is also new&ndash;see next section.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj -Sdeps <span style="color:#f92672">&#39;</span>{<span style="color:#e6db74">:deps</span> {org.typedclojure/typed.clj.checker {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.19&#34;</span>}}}}<span style="color:#f92672">&#39;</span>
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[clojure.core.typed <span style="color:#e6db74">:as</span> t])
nil
user=&gt; (<span style="color:#a6e22e">t/cf</span> (doseq [a [nil <span style="color:#e6db74">:a</span> <span style="color:#ae81ff">3</span>]] (inc a)))
Type Error (<span style="color:#a6e22e">NO_SOURCE_PATH</span><span style="color:#e6db74">:1:29</span>)
Function inc could not be applied to arguments<span style="color:#960050;background-color:#1e0010">:</span>


Domains<span style="color:#960050;background-color:#1e0010">:</span>
        Number

Arguments<span style="color:#960050;background-color:#1e0010">:</span>
        (<span style="color:#a6e22e">t/U</span> (<span style="color:#a6e22e">t/Val</span> <span style="color:#ae81ff">3</span>) (<span style="color:#a6e22e">t/Val</span> <span style="color:#e6db74">:a</span>) nil)

Ranges<span style="color:#960050;background-color:#1e0010">:</span>
        Number




in<span style="color:#960050;background-color:#1e0010">:</span>
(inc a)



Execution error (<span style="color:#a6e22e">ExceptionInfo</span>) at clojure.core.typed.errors/print-errors! (<span style="color:#a6e22e">errors.cljc</span><span style="color:#e6db74">:276</span>).
Type Checker<span style="color:#960050;background-color:#1e0010">:</span> Found <span style="color:#ae81ff">1</span> error
</code></pre></div><p><strong>Commits</strong>:</p>
<ul>
<li><a href="https://github.com/typedclojure/typedclojure/commit/c2ee870edfd76a98d4f0d763aae4814b9f9250ef">doseq rule + tests</a></li>
<li><a href="https://github.com/typedclojure/typedclojure/commit/886fdcc6c182a39bae7926362cf118206d16f8e1">support clojure.core/for :when/:while/:let</a></li>
<li><a href="https://github.com/typedclojure/typedclojure/commit/f550286c2e39cc711c9da2b738fd60b4b8451cfa">defmethod rule</a></li>
<li><a href="https://github.com/typedclojure/typedclojure/compare/c2ee870edfd76a98d4f0d763aae4814b9f9250ef...b1c07def655e132a460aab324dac44f6f1df3b97">defn rule</a></li>
</ul>
<h3 id="improve-error-messages-for-inlining-functions">Improve error messages for inlining functions</h3>
<p><strong>Problem</strong>: inline functions are an experimental Clojure feature that enables the compiler to treat
a var as a macro in operator position and a function in higher-order contexts. Typed Clojure
expands inline functions for <code>:tag</code> inference purposes, but if a type error occurs in the inlined expansion, the original form is lost and the expansion
is blamed. This results in an unhelpful error message.</p>
<p>For example, <code>inc</code> blames its expansion <code>clojure.lang.Numbers/inc</code>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj -Sdeps <span style="color:#f92672">&#39;</span>{<span style="color:#e6db74">:deps</span> {org.typedclojure/typed.clj.checker {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.17&#34;</span>}}}}<span style="color:#f92672">&#39;</span>
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[clojure.core.typed <span style="color:#e6db74">:as</span> t])
nil
user=&gt; (<span style="color:#a6e22e">t/cf</span> (inc nil))
Type Error (<span style="color:#a6e22e">NO_SOURCE_PATH</span><span style="color:#e6db74">:1:7</span>)
Static method clojure.lang.Numbers/inc could not be applied to arguments<span style="color:#960050;background-color:#1e0010">:</span>


Domains<span style="color:#960050;background-color:#1e0010">:</span>
        Number

Arguments<span style="color:#960050;background-color:#1e0010">:</span>
        nil

Ranges<span style="color:#960050;background-color:#1e0010">:</span>
        Number




in<span style="color:#960050;background-color:#1e0010">:</span>
(<span style="color:#a6e22e">clojure.lang.Numbers/inc</span> nil)



Execution error (<span style="color:#a6e22e">ExceptionInfo</span>) at clojure.core.typed.errors/print-errors! (<span style="color:#a6e22e">errors.cljc</span><span style="color:#e6db74">:274</span>).
Type Checker<span style="color:#960050;background-color:#1e0010">:</span> Found <span style="color:#ae81ff">1</span> error
</code></pre></div><p><strong>Prior work</strong>: There is a similar problem in ClojureScript&rsquo;s compiler via the <code>js*</code> form. The ClojureScript analyzer added
<code>:js-op</code> metadata to the analyzed form so linters like Typed Clojure can infer better error messages. However this only
helped marginally as the expanded code was still checked, and the inlining was not always easy to infer (eg., different order
of arguments).</p>
<p>A briefly considered approach in fixing this problem was to define a custom typing rule for each of the ~80 clojure.core inline functions. This was
discarded in favor of the following once-and-for-all solution.</p>
<p><strong>Approach</strong>: Check inlining <em>before</em> expansion, and propagate tag information after type checking. This is not possible
if using tools.analyzer (as Typed Clojure did pre-2019), but is relatively straightforward with <a href="https://github.com/typedclojure/typedclojure/blob/main/typed/clj.analyzer/README.md">typed.clj.analyzer</a> (see <a href="https://github.com/typedclojure/typedclojure/commit/2b3ba3bbfcf615b5d4e92b4e7bae7a356100c772#diff-a4006cf0fe797e50023948e873f147c6f37a8af7b354509709fdf29377c8954fR289">maybe-check-inlineable</a> for the required juggling).</p>
<p><strong>Results</strong>
This change improved error messages for <a href="https://github.com/typedclojure/typedclojure/commit/2b3ba3bbfcf615b5d4e92b4e7bae7a356100c772#diff-c32ff2e4f53b6e6da9e2a1b3f79e1f3f6cf7d080d7b59f9b1b682116c47c0e9dR205">around 78 functions</a> in <code>clojure.core</code>. Now inline functions never blame their expansions and unsupported inline functions consistently throw type errors in first- and higher-order contexts
(instead of expanding in inline contexts and erroring in higher-order ones).</p>
<p>For example, <code>inc</code> now blames its form instead of its expansion (see <code>in: (inc nil)</code>).</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj -Sdeps <span style="color:#f92672">&#39;</span>{<span style="color:#e6db74">:deps</span> {org.typedclojure/typed.clj.checker {<span style="color:#e6db74">:mvn/version</span> <span style="color:#e6db74">&#34;1.0.19&#34;</span>}}}}<span style="color:#f92672">&#39;</span>
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[clojure.core.typed <span style="color:#e6db74">:as</span> t])
nil
user=&gt; (<span style="color:#a6e22e">t/cf</span> (inc nil))
Type Error (<span style="color:#a6e22e">NO_SOURCE_PATH</span><span style="color:#e6db74">:1:7</span>)
Function inc could not be applied to arguments<span style="color:#960050;background-color:#1e0010">:</span>


Domains<span style="color:#960050;background-color:#1e0010">:</span>
        Number

Arguments<span style="color:#960050;background-color:#1e0010">:</span>
        nil

Ranges<span style="color:#960050;background-color:#1e0010">:</span>
        Number




in<span style="color:#960050;background-color:#1e0010">:</span>
(inc nil)



Execution error (<span style="color:#a6e22e">ExceptionInfo</span>) at clojure.core.typed.errors/print-errors! (<span style="color:#a6e22e">errors.cljc</span><span style="color:#e6db74">:276</span>).
Type Checker<span style="color:#960050;background-color:#1e0010">:</span> Found <span style="color:#ae81ff">1</span> error
</code></pre></div><p><strong>Commits</strong></p>
<ul>
<li><a href="https://github.com/typedclojure/typedclojure/commit/2b3ba3bbfcf615b5d4e92b4e7bae7a356100c772">check inlines before expansion to improve error msg</a></li>
</ul>
<h3 id="identify-classes-of-implementation-quirks-in-core-clojure-macros-to-prepare-for-potential-typing-rules">Identify classes of implementation quirks in core Clojure macros to prepare for potential typing rules</h3>
<p><strong>Problem</strong>: To improve static type error messages for a macro, a custom typing rule is needed.
However, typing rules for macros need to simulate the macro expansion of the original macro accurately in order to be sound.
Some macros in clojure.core are known to <a href="https://clojure.atlassian.net/browse/CLJ-2573">leak implementation details</a>&ndash;this would
influence how typing rules are written, so we need to investigate similar issues for other macros.</p>
<p><strong>Prior work</strong>:</p>
<ul>
<li><a href="https://clojure.atlassian.net/browse/CLJ-2573">https://clojure.atlassian.net/browse/CLJ-2573</a></li>
</ul>
<p><strong>Approach</strong>: Study the definition of macros and try and break them.</p>
<p><strong>Results</strong>: I found 5 classes of implementation leakage in core Clojure macros.</p>
<ol>
<li>In macros that wrap try/finally around a body, <code>catch</code> syntax is leaked to the user.
The following macros expand to <code>(try (catch Exception e :foo) (finally ...))</code>. In all
of these cases, <code>catch</code> is not bound so we might expect an error instead of the below behavior.</li>
</ol>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (binding [] (<span style="color:#a6e22e">catch</span> Exception e <span style="color:#e6db74">:foo</span>))
nil
user=&gt; (locking <span style="color:#ae81ff">1</span> (<span style="color:#a6e22e">catch</span> Exception e <span style="color:#e6db74">:foo</span>))
nil
user=&gt; (<span style="color:#a6e22e">with-in-str</span> <span style="color:#e6db74">&#34;a&#34;</span> (<span style="color:#a6e22e">catch</span> Exception e <span style="color:#e6db74">:foo</span>)) 
nil
</code></pre></div><ol start="2">
<li>In macros that wrap <code>fn</code> around a body, a <code>recur</code> target is available. In all of these
cases, a compilation error might be more appropriate. (also plays poorly with <code>:once</code> fns).</li>
</ol>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">delay</span> (<span style="color:#a6e22e">recur</span>))
<span style="color:#f92672">#</span>object[clojure.lang.Delay <span style="color:#ae81ff">0</span>x3d7fa3ae {<span style="color:#e6db74">:status</span> <span style="color:#e6db74">:pending</span>, <span style="color:#e6db74">:val</span> nil}]
user=&gt; (<span style="color:#a6e22e">future</span> (<span style="color:#a6e22e">recur</span>))
<span style="color:#f92672">#</span>object[clojure.core$future_call$reify__8477 <span style="color:#ae81ff">0</span>x5f462e3b {<span style="color:#e6db74">:status</span> <span style="color:#e6db74">:pending</span>, <span style="color:#e6db74">:val</span> nil}]
user=&gt; (<span style="color:#66d9ef">do </span>(<span style="color:#a6e22e">lazy-seq</span> (<span style="color:#a6e22e">recur</span>)) nil)
nil
user=&gt; (<span style="color:#66d9ef">let </span>[a (<span style="color:#a6e22e">Object.</span>)] <span style="color:#f92672">@</span>(<span style="color:#a6e22e">delay</span> (when a (<span style="color:#a6e22e">recur</span>)))) <span style="color:#75715e">;; infinite loop? no: `^:once fn*` clears bindings.</span>
nil
user=&gt; (<span style="color:#66d9ef">let </span>[a (<span style="color:#a6e22e">Object.</span>)] (<span style="color:#a6e22e">lazy-seq</span> (when a (<span style="color:#a6e22e">recur</span>))))
()
</code></pre></div><ol start="3">
<li>In macros that wrap <code>fn</code> around a body, <code>:pre</code>/<code>:post</code> syntax is leaked to the user.</li>
</ol>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">with-bindings</span> [] {<span style="color:#e6db74">:pre</span> [false]} <span style="color:#ae81ff">1</span>)
Execution error (<span style="color:#a6e22e">AssertionError</span>) at user/eval164$fn (<span style="color:#a6e22e">REPL</span><span style="color:#e6db74">:1</span>).
Assert failed<span style="color:#960050;background-color:#1e0010">:</span> false
</code></pre></div><ol start="4">
<li>Double macro expansion and evaluation.</li>
</ol>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">vswap!</span> (<span style="color:#66d9ef">do </span>(prn <span style="color:#e6db74">&#34;created&#34;</span>) (<span style="color:#a6e22e">volatile!</span> <span style="color:#ae81ff">0</span>)) inc)
<span style="color:#e6db74">&#34;created&#34;</span>
<span style="color:#e6db74">&#34;created&#34;</span>
<span style="color:#ae81ff">1</span>
</code></pre></div><ol start="5">
<li>Unreliable <code>:tag</code> propagation.</li>
</ol>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">$ clj
Clojure <span style="color:#ae81ff">1.10</span>.3
user=&gt; (<span style="color:#a6e22e">set!</span> *warn-on-reflection* true)
true
user=&gt; (<span style="color:#66d9ef">defmacro </span>id [a] a)
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;user/id</span>
user=&gt; (<span style="color:#a6e22e">vswap!</span> (<span style="color:#a6e22e">id</span> (identity (<span style="color:#a6e22e">volatile!</span> <span style="color:#ae81ff">0</span>))) inc)
Reflection warning, NO_SOURCE_PATH<span style="color:#e6db74">:1:1</span> - reference to field deref can<span style="color:#e6db74">&#39;t</span> be resolved.
Reflection warning, NO_SOURCE_PATH<span style="color:#e6db74">:1:1</span> - call to method reset can<span style="color:#e6db74">&#39;t</span> be resolved (<span style="color:#a6e22e">target</span> class is unknown).
<span style="color:#ae81ff">1</span>
</code></pre></div><p>As a result of this (and some prior) work, the following macros are now known to leak implementation details in some combination of the aforementioned ways and need special
handling in potential typing rules:</p>
<ul>
<li><code>locking</code> (<a href="https://clojure.atlassian.net/browse/CLJ-2573">upstream report</a>), <code>binding</code>, <code>with-bindings</code>, <code>sync</code>, <code>with-local-vars</code>, <code>with-in-str</code>, <code>dosync</code>, <code>with-precision</code>, <code>with-loading-context</code>, <code>with-redefs</code>, <code>delay</code>, <code>vswap!</code>, <code>lazy-seq</code>, <code>lazy-cat</code>, <code>future</code>, <code>pvalues</code>, <code>clojure.test/{deftest,deftest-,testing,with-test,with-test-out}</code>, <code>clojure.java.shell/with-sh-{dir,env}</code>, <code>clojure.test.tap/with-tap-output</code>, <code>clojure.pprint/with-pprint-dispatch</code>, <code>clojure.core.async/thread</code>, <code>clojure.core.logic.pldb/with-{db,dbs}</code>, <code>clojure.tools.trace/dotrace</code>, <code>clojure.test.check.properties/for-all</code>, <code>clojure.test.check.generators/let</code>, <code>clojure.java.jmx/with-connection</code>, <code>clojure.core.match.debug/with-recur</code></li>
</ul>
<p><strong>Reference</strong>:</p>
<ul>
<li><a href="https://frenchy64.github.io/fully-satisfies/latest/io.github.frenchy64.fully-satisfies.non-leaky-macros.clojure.core.html">non-leaky clojure.core macros</a></li>
<li><a href="https://frenchy64.github.io/fully-satisfies/latest/io.github.frenchy64.fully-satisfies.non-leaky-macros.clojure.test.html">non-leaky clojure.test macros</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2021 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2021-funding-announcement/</link>
      <pubDate>Wed, 01 Sep 2021 02:00:00 +0200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2021-funding-announcement/</guid>
      <description>Clojurists Together is funding 9 projects for Q3 2021: shadow-cljs, clojure-lsp and Malli with $9,000, clojurians-log-v2, PCP and Holy Lambda with $2,000, and Dependabot Core, Typed Clojure and Polylith with $1,000.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is very happy to announce that in Q3 of 2021 we have selected a total of 9 projects to fund:</p>
<p><strong>$9,000</strong></p>
<ul>
<li><a href="http://shadow-cljs.org/">Shadow CLJS</a> - Thomas Heller</li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp">clojure-lsp</a> - Eric Dallo</li>
<li><a href="https://github.com/metosin/malli">Malli</a> - Tommi Reiman</li>
</ul>
<p><strong>$2,000</strong></p>
<ul>
<li><a href="https://github.com/oxalorg/clojurians-log-v2">Clojurians-log-v2</a> - Mitesh Shah</li>
<li><a href="https://github.com/alekcz/pcp">PCP</a> - Alexander Oloo</li>
<li><a href="https://github.com/FieryCod/holy-lambda">Holy Lambda</a> - Karol Wójcik</li>
</ul>
<p><strong>$1,000</strong></p>
<ul>
<li><a href="https://github.com/dependabot/dependabot-core">Dependabot Core</a> - Othman Azil</li>
<li><a href="https://github.com/clojure/core.typed">Typed Clojure</a> - Ambrose Bonnaire-Sergeant</li>
<li><a href="https://github.com/polyfy/polylith">Polylith</a> - Joakim Tengstrand</li>
</ul>
<p>Thanks to the <a href="/news/the-next-phase-of-clojurists-together/">feedback</a> we received from developers and our members, we now offer a range of funding levels for our quarterly grant and more flexibility for grantees accepting the funds. In addition to postponing the funding start by 2 months, grantees of the $9,000 funding can also choose to take the funding over a variable time, from one month to twelve months.</p>
<p>Together with the <a href="/news/long-term-funding-selections/">6 long-term fundings</a>, this puts us at a total of 15 projects which we are funding at the moment and amounts to $144,000 USD.</p>
<p>Each project&rsquo;s plans are detailed below:</p>
<h3 id="shadow-cljs">Shadow CLJS</h3>
<p><strong>Funding period:</strong> 01 Sep 2021 - 01 Sep 2022</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>shadow-cljs is a replacement for figwheel+cljsbuild with additional features on top. It integrates nicely with npm and fixes several other CLJS tooling concerns. figwheel is only a glimpse of what CLJS tooling could be.</p>
<p>My goal is a to build a complete standalone solution for ClojureScript so no knowledge of other Clojure tools is required to get started with ClojureScript. It still plays nice with Clojure though.</p>
<p>It does cover everything from the first steps in a REPL to full blown <code>:advanced</code> optimized code-splitting release builds today and could do so much more &hellip;</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>shadow-cljs still is a bit of an underdog since it is still relatively unknown. I&rsquo;ve been constantly working on it for the past few years whenever I find the time to do so. With funding I could do more in less time. More docs, more Examples, more Guides, more Features, &hellip;</p>
<p>The project is already gaining users steadily and I expect that to continue as people like it.</p>
<h3 id="clojure-lsp">clojure-lsp</h3>
<p><strong>Funding period:</strong> 01 Sep 2021 - 01 Dec 2021</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It&rsquo;s an implementation of the <a href="https://microsoft.github.io/language-server-protocol/">Language Server Protocol spec</a>. This lets users write Clojure in any editor with an LSP plugin (VS Code, Ecliipse, emacs, vim, Sublime Text, etc.).</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I&rsquo;d like to add more features following the LSP spec like: call hierarchy, semantic-tokens, batch file renaming.</p>
<p>I&rsquo;d also like to spend more time improving clojure-lsp performance, that would help us use clojure-lsp in almost any editor without any problems.</p>
<h3 id="malli">Malli</h3>
<p><strong>Funding period:</strong> 01 Sep 2021 - 01 Mar 2022</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Malli is an effort to build a complete and coherent schema/spec library for Clojure/Script - targeting design, runtime and development time tooling. It takes the best parts of existing solutions including clojure.spec, Plumatic Schema and JSON Schema. All design decisions are discussed in github &amp;/ slack. Active community in slack with 400+ members, 789 stars on github, 497k downloads in clojars and despite in alpha, used in production all around. &ldquo;let&rsquo;s make a tool that other programming communities will be jealous&rdquo; - a happy user comment.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Goal is to release Malli 1.0.0 within a year. This requires a lot of work, including (re-)design of missing &amp; bad parts, adding new features, writing proper documentation, working with other contributors, helping users and getting feedback from the community. The full development backlog is in <a href="https://github.com/metosin/malli/issues">https://github.com/metosin/malli/issues</a>. Besides normal development &amp; support, funding would allow to work with bigger things like:</p>
<ol>
<li>
<p>First-class Schema inferring and effective schema types. Related issues: <a href="https://github.com/metosin/malli/issues/74">#74</a>, <a href="https://github.com/metosin/malli/issues/181">#181</a>, <a href="https://github.com/metosin/malli/issues/191">#191</a>, <a href="https://github.com/metosin/malli/issues/264">#264</a>, <a href="https://github.com/metosin/malli/issues/327">#327</a> and a draft: <a href="https://github.com/metosin/malli/pull/440">#440</a></p>
</li>
<li>
<p>Re-visit Schema registries, lifecycle, caching and contexts. Related issues: <a href="https://github.com/metosin/malli/issues/228">#228</a>, <a href="https://github.com/metosin/malli/issues/236">#236</a>, <a href="https://github.com/metosin/malli/issues/326">#326</a>, <a href="https://github.com/metosin/malli/issues/331">#331</a>, <a href="https://github.com/metosin/malli/issues/450">#450</a>, <a href="https://github.com/metosin/malli/issues/451">#451</a>, <a href="https://github.com/metosin/malli/issues/461">#461</a>, <a href="https://github.com/metosin/malli/issues/463">#463</a>, <a href="https://github.com/metosin/malli/issues/488">#488</a> and <a href="https://github.com/metosin/malli/issues/498">#498</a>.</p>
</li>
<li>
<p>Error messages and tooling integration: pretty-printing of schema creation <a href="https://github.com/metosin/malli/issues/18">#18</a> and validation errors <a href="https://github.com/metosin/malli/issues/19">#19</a>. Investigate how to enable smooth developer experience with tools like <a href="https://github.com/clojure-lsp/clojure-lsp">clojure-lsp</a>.</p>
</li>
</ol>
<h3 id="clojurians-log-v2">Clojurians-log-v2</h3>
<p><strong>Funding period:</strong> 20 Sep 2021 - 20 Dec 2021</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>I feel the amount of knowledge being shared on the clojurians slack server is immense. Conserving and making this discourse complete, easily accessible, and searchable should greatly benefit the community as a whole.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>The current clojurians-log-app (v1) has aged a bit. There are lots of operational issues cropping up and there is a huge scope of improvement which I can see (being one of it&rsquo;s current maintainers).</p>
<p>I have already started work on clojurians-log-v2 (standing on top of the great work done in v1) which will revamp the way we archive and access the information from clojurians slack.  It will make sure we can idempotently backfill all history from the beginning of time without losing any data (even if the server ever goes down), log in real time, and make it all searchable (indexed).</p>
<p>I have written detailed feature set and documentation as to why and what the v2 will encompass in the <a href="https://github.com/oxalorg/clojurians-log-v2">README</a>.</p>
<p>Back-filling entire history, full text searching, mobile responsive, recovering history despite downtimes, real-time logging with perma-links to threads &amp; conversations, improved SEO for better google indexing, custom slack bot commands, using emojis to save important threads, ability to view most popular conversations/content of the week, etc are some of the features which will make clojurians logs more accessible and help disperse the knowledge more easily.</p>
<h3 id="pcp-clojure-processor----a-clojure-replacement-for-php">PCP (Clojure Processor &ndash; A Clojure replacement for PHP)</h3>
<p><strong>Funding period:</strong> 01 Oct 2021 - 01 Jan 2022</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It would make deploying Clojure website simpler for newbies. And cheaper for all.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I would like to get PCP to a point where deployments can be done from the CLI or automatically via Github. And to allow users to do a 1-click deployment from the readme to a cloud platform.</p>
<h3 id="holy-lambda">Holy Lambda</h3>
<p><strong>Funding period:</strong> 01 Sep 2021 - 01 Dec 2021</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Holy Lambda allows Clojurians to write Lambda functions in Clojure that start fast and have low memory requirements. Holy Lambda proves that Clojure is not a slow language. From now on, Clojure is a viable choice for Serverless computing.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>The fund would let me spend some more time on the essential aspects of the successful projects: simplicity and complete documentation. Before the fund, I could triage only the most severe bugs and left minor inconsistencies in the code and documentation.</p>
<p>Plan:</p>
<ol>
<li>Refactor</li>
</ol>
<p>Finish the refactor of the Holy Lambda. Most of the stuff described in the following discussion I did last week. However, some more attention is needed to test the new release, do benchmarks, close the issues, write a detailed rationale post on the slack #news-and-articles channel, and on mentioned above discussion to notify all the active users.</p>
<p>1.1 Expectations</p>
<ul>
<li>performance improvements around runtime,</li>
<li>performance improvements around tasks,</li>
<li>much simpler api, only one macro <code>entrypoint</code> exposed,</li>
<li>much faster pure Clojure runtime compared to official AWS Java runtime,</li>
<li>reduced configuration, environment variables options, easier way to combine HL with CI/CD, and various deployment tools,</li>
<li>no more changes to the core api, stable and performant core!</li>
</ul>
<ol start="2">
<li>Documentation</li>
</ol>
<p>Now it&rsquo;s difficult for the new users to understand how Holy Lambda operates, especially for native runtime. I was trying to make the project too &ldquo;easy&rdquo; and failed. I believe that &ldquo;good&rdquo; documentation, fewer features, stable and performant core are the key to project success.</p>
<p>2.1. Expectations</p>
<ul>
<li>beautiful documentation covering the project written in AsciiDoc</li>
</ul>
<h3 id="dependabot-core">Dependabot Core</h3>
<p><strong>Funding period:</strong> 01 Nov 2021 - 01 Feb 2022</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>This is important since most (F)OSS projects are hosted on GitHub.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I would like to add features to dependabot that would allow it to bump the dependencies of any Clojure project. It currently does that by making PRs to all the projects automatically. Since dependabot has been acquired by GitHub and is available automatically and free of charge to all, it would improve the Clojure community as a whole and make the ecosystem more secure.</p>
<h3 id="typed-clojure">Typed Clojure</h3>
<p><strong>Funding period:</strong> 01 Sep 2021 - 01 Dec 2021</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>It is an effort to bring static type checking to Clojure and hence be another tool for Clojure program verification.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>Make Typed Clojure easier to use by improving error messages. Instead of seeing gensyms and expanded code in your static type error messages (which is the current state of things), I want to see surface syntax with helpful explanations in plain language.</p>
<h3 id="polylith">Polylith</h3>
<p><strong>Funding period:</strong> 01 Sep 2021 - 01 Dec 2021</p>
<p><strong>Why is this project important to the Clojure community?</strong></p>
<p>Polylith helps the community organising codebases/projects in a way that they become easier to understand, reuse, and test. It makes you more productive.</p>
<p><strong>What are you wanting to achieve with this funding?</strong></p>
<p>I want to add support for generating documentation, compiling a native version of the poly command and/or improve the prompt command to support <code>&lt;arrow up&gt;</code> for history.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Long-term funding selections</title>
      <link>https://www.clojuriststogether.org/news/long-term-funding-selections/</link>
      <pubDate>Thu, 26 Aug 2021 21:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/long-term-funding-selections/</guid>
      <description>Clojurists Together and our members have selected six developers to receive long-term funding.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce that our members have selected six developers to each receive $1,500 USD/month for 12 months ($108,000 in total):</p>
<ul>
<li>Bozhidar Batsov</li>
<li>Michiel Borkent</li>
<li>Dragan Djuric</li>
<li>Thomas Heller</li>
<li>David Nolen</li>
<li>Nikita Prokopov</li>
</ul>
<h2 id="background">Background</h2>
<p>Recently, we <a href="/news/long-term-funding-update/">talked to developers</a> to understand how Clojurists Together could better serve them. One of the things we heard was that developers were looking for more flexibility and stability in funding, and that they appreciated <a href="https://www.cognitect.com/blog/2020/12/15/sponsoring-open-source-developers">Cognitect&rsquo;s funding model</a>.</p>
<p>In response, we have created a new long-term funding program alongside our existing project grants - giving funded developers $1.5k/month for 12 months. We think that giving developers flexible, long-term funding will give them the space to do high impact work. This might be continuing maintenance on existing projects, new feature development, or perhaps a brand new project. We&rsquo;re excited to see what they come up with!</p>
<p>The recipients of the long-term funding were <a href="/news/long-term-funding-update/">voted on</a> by Clojurists Together <a href="/members/">members</a>. These new selections join our existing support for Toby Crawley <a href="/news/clojurists-together-is-funding-clojars/">working on Clojars</a>.</p>
<h2 id="possible-projects">Possible projects</h2>
<p>We asked the selected developers about what they might do over the next 12 months with this funding:</p>
<p><strong>Bozhidar Batsov</strong> - I plan to work on bringing <a href="https://nrepl.org">nREPL</a> to version 1.0 and on adding support for newer nREPL functionality to <a href="https://cider.mx">CIDER</a>. Apart from that - I want to improve working with Java sources and javadoc, simplify session management and extend the documentation. There are many other things that are bound to happen along the way, but those are some of the ideas that I&rsquo;m thinking more about lately.</p>
<p><strong>Michiel Borkent</strong> - With the funding I&rsquo;ll keep improving <a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>, <a href="https://github.com/babashka/babashka">babashka</a> and <a href="https://github.com/borkdude/sci">SCI</a>, <a href="https://github.com/borkdude/scittle">scittle</a>, <a href="https://github.com/borkdude/nbb">nbb</a> and various other OSS projects.</p>
<p><strong>Dragan Djuric</strong> - My first project will be a Recurrent Neural Networks (RNN) implementation for <a href="https://github.com/uncomplicate/deep-diamond">Deep Diamond</a>. The next thing would be sparse matrix support for <a href="https://github.com/uncomplicate/neanderthal">Neanderthal</a>. After that, I&rsquo;d love to support JavaCPP-provided libraries as an additional backend for MKL and CUDA in Neanderthal, (which would also enable arm64 support). There are numerous improvements that could (and would) be done along the way, but this would also be a nice opportunity to get the community more involved and motivate people to suggest ideas.</p>
<p><strong>Thomas Heller</strong> - I&rsquo;ll continue doing the ongoing maintenance and support I&rsquo;m already doing on <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a> and hopefully get some more documentation stuff done (eg. restore the homepage).</p>
<p><strong>David Nolen</strong> - I maintain <a href="https://clojurescript.org">ClojureScript</a> and various official ClojureScript libraries. Maintaining ClojureScript includes managing reported issues (bugs, changes, enhancements), staying up-to-date with <a href="https://developers.google.com/closure/compiler">Google Closure Compiler</a> and Library changes, maintaining the release process (the ClojureScript build on <a href="https://build.clojure.org">build.clojure.org</a>), communicating with tooling developers to decrease churn, helping new developers contribute, maintaining the website, and actively evangelizing the project.</p>
<p><strong>Nikita Prokopov</strong> - I have a Clojure UI framework planned for the next year, this would be a perfect fit.</p>
<h2 id="thanks">Thanks</h2>
<p>We couldn&rsquo;t have done this without the support of our members. We are very grateful to everyone who has supported us over the years and helped us build up Clojurists Together to the point that we could make this commitment to developers. When we first announced this program we had income to support three developers, but thanks to new members <a href="https://whimsical.com">Whimsical</a> and <a href="https://www.appsflyer.com">AppsFlyer</a>, we have been able to extend this to six developers!</p>
<blockquote>
<p>The power of Clojure and quality tools have allowed Whimsical to thrive. We&rsquo;re excited to contribute back to the language and community that has helped make all of this possible.<br>
&ndash; <strong>Jānis Peisenieks, Head of Engineering, Whimsical</strong></p>
</blockquote>
<blockquote>
<p>AppsFlyer has been using Clojure for over 8 years, since we were just two developers strong, till now, when we&rsquo;re more than 300. We felt it would only be appropriate to give back to the community not just via code, but by financially enabling amazing people and projects from various locations around the globe who have one main goal in sight - making Clojure better for all of us. We&rsquo;re proud to support this wonderful community and are looking forward to seeing what developments are in store!<br>
&ndash; <strong>Nir Rubinstein, Chief Architect, AppsFlyer</strong></p>
</blockquote>
<p>We also want to thank our other major members: <a href="https://www.latacora.com/">Latacora</a>, <a href="https://roamresearch.com/">Roam</a>, <a href="https://pitch.io/">Pitch</a>, <a href="https://nubank.com.br/">Nubank</a>, <a href="https://www.cisco.com/">Cisco</a>, <a href="https://juxt.pro">JUXT</a>, <a href="https://www.metosin.fi/">Metosin</a>, <a href="http://www.solita.fi/en">Solita</a>, <a href="http://www.adgoji.com/">Adgoji</a>, <a href="https://nextjournal.com/">Nextjournal</a>, <a href="https://flexiana.com/">Flexiana</a>, <a href="https://toyokumo.co.jp/">Toyokumo</a>, <a href="https://www.griffin.sh/">Griffin</a>, and <a href="https://parkside.app">Parkside</a>, along with all of our other company and developer members who have funded this work, and voted on the recipients.</p>
<p>We couldn&rsquo;t be more excited about the next phase of Clojurists Together, and seeing what these developers will create.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Long-term funding update</title>
      <link>https://www.clojuriststogether.org/news/long-term-funding-update/</link>
      <pubDate>Fri, 20 Aug 2021 15:30:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/long-term-funding-update/</guid>
      <description>Updates on voting for long-term funding</description>
      <content:encoded><![CDATA[<p>We recently sent out an email to our members with voting ballots for long-term funding. We&rsquo;ve had some feedback and questions, so we wanted to send an update with some more information.</p>
<h2 id="goals-for-long-term-funding">Goals for long-term funding</h2>
<p>To recap, our members will be voting for 6 developers to receive $1.5k USD/month for 12 months. This is a new funding program alongside our existing project based grants. After talking to members and developers we realised there was the opportunity for a new kind of funding. Our goals were:</p>
<ul>
<li>Give developers a predictable base of long-term funding to let them continue the great open source work they&rsquo;ve already been doing.</li>
<li>Give developers money with less &ldquo;strings attached&rdquo;. The grant is not tied to a particular project, we think developers can do great things when they are <a href="https://mobile.twitter.com/patrickc/status/1428166730426191877">free to work on whatever seems most promising to them</a>, especially over a long period of time.</li>
<li>Give members direct influence over who gets funded.</li>
</ul>
<p>You can read more in <a href="/news/the-next-phase-of-clojurists-together/">The next phase of Clojurists Together</a>.</p>
<p>We are also in the late processes of finalising our project grants. There will be 3 grants for $1k, 3 for $2k, and 3 for $9k.</p>
<h2 id="voting-system">Voting system</h2>
<p>We previously used <a href="https://civs1.civs.us">CIVS</a> for member voting. CIVS have changed their policy and now require opt-in from each email before they will send survey emails. Each Clojurists Together member would need to opt-in to CIVS before they could vote. They changed it right around the time we were doing board member voting and it was very messy even doing a handful of people; it would be very difficult for 200+ members.</p>
<p>We&rsquo;ve chosen a new voting system which lets us distribute the voter keys by email, but the interface doesn&rsquo;t work as well when voting on a lot of candidates. We&rsquo;ll look at different options for our next member survey.</p>
<p>You need to rank the candidates in preference order. You don&rsquo;t need to rank all 60 candidates, just your top 10 or so should be enough for the voting algorithm.</p>
<p>If you&rsquo;re a current member, you should have received an email with details on how to vote. If you didn&rsquo;t get an email or are having trouble voting, please <a href="/contact/">contact us</a>.</p>
<h2 id="candidate-info">Candidate info</h2>
<p>One other thing that we heard was that it could be hard to connect the names on the ballot to the projects those people work on. We&rsquo;ve added more information below on each candidate and some of what they&rsquo;re known for. These projects are not necessarily the projects they would work on if funded, just ones that you might be using today.</p>
<ul>
<li><strong>Alan Thompson</strong>/<a href="https://github.com/cloojure">@cloojure</a> - <a href="https://github.com/cloojure/tupelo">tupelo</a>, <a href="https://github.com/cloojure/tupelo-datomic">tupelo-datomic</a></li>
<li><strong>Alexander Yakushev</strong>/<a href="https://github.com/alexander-yakushev">@alexander-yakushev</a> - <a href="https://github.com/clojure-emacs/cider">CIDER</a>, <a href="https://github.com/alexander-yakushev/compliment">Compliment</a>, <a href="http://clojure-goes-fast.com">Clojure Goes Fast</a>, Many <a href="https://github.com/clojure-goes-fast/">clojure-goes-fast libraries</a></li>
<li><strong>Ambrose Bonnaire-Sergeant</strong>/<a href="https://github.com/frenchy64">@frency64</a> - <a href="https://github.com/typedclojure/typedclojure">Typed Clojure</a></li>
<li><strong>Arne Brasseur</strong>/<a href="https://github.com/plexus">@plexus</a> - <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://github.com/lambdaisland/deep-diff2">deep-diff2</a>, <a href="https://heartofclojure.eu">Heart of Clojure conference</a>, <a href="https://lambdaisland.com">Lambda Island</a></li>
<li><strong>Ashima Panjwani</strong>/<a href="https://github.com/ashimapanjwani">@ashimapanjwani</a> - <a href="https://github.com/scicloj/viz.clj">viz.clj</a>, <a href="https://github.com/scicloj/clojisr">clojisr</a></li>
<li><strong>Baptiste Dupuch</strong>/<a href="https://github.com/dupuchba">@dupuchba</a> - <a href="https://twitter.com/BaptisteDupuch/status/1419938293827964928">Clojuredart</a></li>
<li><strong>Ben Brinckerhoff</strong>/<a href="https://github.com/bhb">@bhb</a> - <a href="https://github.com/bhb/expound">expound</a></li>
<li><strong>Bobby Towers</strong>/<a href="https://github.com/porkostomus">@porkostomus</a> - <a href="https://github.com/porkostomus/4bb">4bb</a>, <a href="https://github.com/exercism/clojure">excercism/clojure</a></li>
<li><strong>Bozhidar Batsov</strong>/<a href="https://github.com/bbatsov">@bbatsov</a> - <a href="https://github.com/clojure-emacs/cider">CIDER</a>, <a href="https://github.com/nrepl/nrepl">nREPL</a>, <a href="https://github.com/bbatsov/clojure-style-guide">clojure-style-guide</a>, <a href="https://github.com/clojure-emacs/orchard">orchard</a>, <a href="https://github.com/clojure-emacs/clojure-mode">clojure-mode</a></li>
<li><strong>Brandon Ringe</strong>/<a href="https://github.com/bpringe">@bpringe</a> - <a href="https://github.com/BetterThanTomorrow/calva">Calva</a></li>
<li><strong>Bruce Hauman</strong>/<a href="https://github.com/bhauman">@bhauman</a> - <a href="https://github.com/bhauman/lein-figwheel">figwheel</a>, <a href="https://github.com/bhauman/devcards">devcards</a>, <a href="https://github.com/bhauman/rebel-readline">rebel-readline</a>.</li>
<li><strong>Cam Saul</strong>/<a href="https://github.com/camsaul">@camsaul</a> - <a href="https://github.com/camsaul/methodical">methodical</a>, <a href="https://github.com/camsaul/whitespace-linter">whitespace-linter</a></li>
<li><strong>Carmen La</strong>/<a href="https://github.com/lacarmen">@lacarmen</a> - <a href="https://github.com/cryogen-project/cryogen">cryogen</a></li>
<li><strong>Chris Oakman</strong>/<a href="https://github.com/oakmac">@oakmac</a> - <a href="https://github.com/oakmac/cuttle">cuttle</a>, <a href="https://github.com/oakmac/atom-parinfer">atom-parinfer</a>, <a href="https://github.com/oakmac/vscode-parinfer">vscode-parinfer</a>, <a href="https://github.com/oakmac/parinfer-elisp">parinfer-elisp</a></li>
<li><strong>Christophe Grand</strong>/<a href="https://github.com/cgrand">@cgrand</a> - <a href="https://github.com/cgrand/enlive">enlive</a>, <a href="https://twitter.com/cgrand/status/1350063059864346624?lang=en">Clojuredart</a>, <a href="https://github.com/cgrand/moustache">mustache</a>, <a href="https://github.com/cgrand/xforms">xforms</a></li>
<li><strong>Christopher Small</strong>/<a href="https://github.com/metasoarous">@metasoarous</a> - <a href="https://github.com/metasoarous/oz">oz</a>, <a href="https://github.com/metasoarous/semantic-csv">semantic-csv</a>, <a href="https://github.com/metasoarous/datsync">datsync</a>, <a href="https://github.com/metasoarous/datsys">datsys</a></li>
<li><strong>David Nolen</strong>/<a href="https://github.com/swannodette">@swannodette</a> - <a href="https://github.com/clojure/clojurescript">ClojureScript</a>, <a href="https://github.com/omcljs/om">Om</a>, <a href="https://github.com/cognitect/transit-cljs">transit-cljs</a></li>
<li><strong>Dmitri Sotnikov</strong>/<a href="https://github.com/yogthos">@yogthos</a> - <a href="https://github.com/yogthos/Selmer">Selmer</a>, <a href="https://github.com/luminus-framework/luminus-template">Luminus</a>, <a href="https://github.com/yogthos/markdown-clj">markdown-clj</a>, <a href="https://github.com/yogthos/migratus">migratus</a></li>
<li><strong>Dragan Djuric</strong>/<a href="https://github.com/blueberry">@blueberry</a> - <a href="https://github.com/uncomplicate/neanderthal">neanderthal</a>, <a href="https://github.com/uncomplicate/clojurecuda">clojurecuda</a>, <a href="https://github.com/uncomplicate/deep-diamond">deep-diamond</a></li>
<li><strong>Eric Dallo</strong>/<a href="https://github.com/ericdallo">@ericdallo</a> - <a href="https://github.com/clojure-lsp/clojure-lsp">clojure-lsp</a>, <a href="https://github.com/ericdallo/deps-bin">deps-bin</a>, <a href="https://github.com/emacs-lsp/lsp-mode">emacs-lsp/lsp-mode</a></li>
<li><strong>Erik Assum</strong>/<a href="https://github.com/slipset">@slipset</a> - <a href="https://github.com/slipset/deps-deploy">deps-deploy</a>, <a href="https://github.com/clojure/data.json">clojure/data.json</a>, <a href="https://github.com/clj-commons">CLJ Commons repositories</a></li>
<li><strong>Ethan Miller</strong>/<a href="https://github.com/ezmiller">@ezmiller</a> - <a href="https://github.com/scicloj/tablecloth.time">tablecloth.time</a></li>
<li><strong>Iizuka Masashi</strong>/<a href="https://github.com/liquidz">@liquidz</a> - <a href="https://github.com/liquidz/vim-iced">vim-iced</a>, <a href="https://github.com/liquidz/antq">antq</a>, <a href="https://github.com/liquidz/merr">merr</a></li>
<li><strong>Isaac Johnston</strong>/<a href="https://github.com/superstructor">@superstructor</a> - <a href="https://github.com/day8/re-frame">re-frame</a>, <a href="https://github.com/day8/re-com">re-com</a>, <a href="https://github.com/day8/re-frame-10x">re-frame-10x</a></li>
<li><strong>James Reeves</strong>/<a href="https://github.com/weavejester">@weavejester</a> - <a href="https://github.com/weavejester/compojure">compojure</a>, <a href="https://github.com/ring-clojure/ring">ring</a>, <a href="https://github.com/weavejester/hiccup">hiccup</a>, <a href="https://github.com/weavejester/cljfmt">cljfmt</a></li>
<li><strong>Joel Holdbrooks</strong>/<a href="https://github.com/noprompt">@noprompt</a> - <a href="https://github.com/noprompt/meander">meander</a>, <a href="https://github.com/noprompt/garden">garden</a>, <a href="https://github.com/noprompt/frak">frak</a></li>
<li><strong>John Stevenson</strong>/<a href="https://github.com/practicalli-john">@practicalli-john</a> - <a href="https://practical.li">Practicalli</a></li>
<li><strong>Jordan Miller</strong>/<a href="https://github.com/lambduhh">@lambduhh</a> - <a href="https://anchor.fm/lostinlambduhhs">Lost in Lambduhhs</a>, <a href="https://github.com/athensresearch/athens">athens</a></li>
<li><strong>Juho Teperi</strong>/<a href="https://github.com/Deraen">@Deraen</a> - <a href="https://github.com/reagent-project/reagent">reagent</a>, <a href="https://github.com/metosin/compojure-api">compojure-api</a>, <a href="https://github.com/Deraen/sass4clj">sass4clj</a>, <a href="https://github.com/Deraen/less4clj">less4clj</a></li>
<li><strong>Konrad Kühne</strong>/<a href="https://github.com/kordano">@kordano</a> - <a href="https://github.com/replikativ/datahike">datahike</a>, <a href="https://github.com/replikativ/konserve">konserve</a>, <a href="https://github.com/replikativ/replikativ">replikative</a></li>
<li><strong>Lee Hinman</strong>/<a href="https://github.com/dakrone">@dakrone</a> - <a href="https://github.com/dakrone/clj-http">clj-http</a>, <a href="https://github.com/dakrone/cheshire">cheshire</a>, <a href="https://github.com/dakrone/clojure-opennlp">clojure-opennlp</a></li>
<li><strong>Lee Read</strong>/<a href="https://github.com/lread">@lread</a> - <a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>, <a href="https://github.com/lread/clj-graal-docs">clj-graal-docs</a></li>
<li><strong>Martin Klepsch</strong>/<a href="https://github.com/martinklepsch">@martinklepsch</a> - <a href="https://github.com/cljdoc/cljdoc">cljdoc</a>, <a href="https://github.com/confetti-clj/confetti">confetti</a>, <a href="https://github.com/martinklepsch/derivatives">derivatives</a></li>
<li><strong>Matthew Ratzke</strong>/<a href="https://github.com/flyboarder">@flyboarder</a> - <a href="https://github.com/boot-clj/boot">boot</a>, <a href="https://github.com/degree9/firebase-cljs">firebase-cljs</a></li>
<li><strong>Maurício Szabo</strong>/<a href="https://github.com/mauricioszabo">@mauricioszabo</a> - <a href="https://github.com/mauricioszabo/atom-chlorine">atom-chlorine</a>, <a href="https://github.com/mauricioszabo/clover">clover</a>, <a href="https://github.com/mauricioszabo/repl-tooling">repl-tooling</a></li>
<li><strong>Michiel Borkent</strong>/<a href="https://github.com/borkdude">@borkdude</a> - <a href="https://github.com/babashka/babashka">babashka</a>, <a href="https://github.com/clj-kondo/clj-kondo">clj-kondo</a>, <a href="https://github.com/borkdude/sci">sci</a>, <a href="https://github.com/borkdude/jet">jet</a>, <a href="https://github.com/borkdude/nbb">nbb</a></li>
<li><strong>Miikka Koskinen</strong>/<a href="https://github.com/miikka">@miikka</a> - <a href="https://github.com/metosin/reitit">reitit</a>, <a href="https://github.com/metosin/muuntaja">muuntaja</a></li>
<li><strong>Mike Fikes</strong>/<a href="https://github.com/mfikes">@mifikes</a> - <a href="https://github.com/clojure/clojurescript">ClojureScript</a>, <a href="https://github.com/planck-repl/planck">planck</a>, <a href="https://github.com/mfikes/cljs-bean">cljs-bean</a></li>
<li><strong>Mike Thompson</strong>/<a href="https://github.com/mike-thompson-day8">@mike-thompson-day8</a> - <a href="https://github.com/day8/re-frame">re-frame</a>, <a href="https://github.com/day8/re-com">re-com</a>, <a href="https://github.com/day8/re-frame-10x">re-frame-10x</a></li>
<li><strong>Nicola Mometto</strong>/<a href="https://github.com/Bronsa">@Bronsa</a> - <a href="https://github.com/clojure/tools.reader">tools.reader</a>, <a href="https://github.com/clojure/clojure">clojure</a>, <a href="https://github.com/clojure/tools.analyzer">tools.analyzer</a></li>
<li><strong>Nicolas Modrzyk</strong>/<a href="https://github.com/hellonico">@hellonico</a> - <a href="https://github.com/hellonico/origami">origami</a>, <a href="https://github.com/hellonico/zebra">zebra</a></li>
<li><strong>Nikita Prokopov</strong>/<a href="https://github.com/tonsky">@tonsky</a> - <a href="https://github.com/tonsky/FiraCode">FiraCode</a>, <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/tonsky/uberdeps">uberdeps</a>, <a href="https://github.com/tonsky/tongue">tongue</a></li>
<li><strong>Oleksii Kachaiev</strong>/<a href="https://github.com/kachayev">@kachayev</a> - <a href="https://github.com/clj-commons/aleph">aleph</a>, <a href="https://github.com/netty/netty">netty</a></li>
<li><strong>Oliver Caldwell</strong>/<a href="https://github.com/Olical">@Olical</a> - <a href="https://github.com/Olical/conjure">conjure</a>, <a href="https://github.com/Olical/cljs-test-runner">cljs-test-runner</a>, <a href="https://github.com/Olical/depot">depot</a></li>
<li><strong>Paula Gearon</strong>/<a href="https://github.com/quoll">@quoll</a> - <a href="https://github.com/threatgrid/asami">asami</a></li>
<li><strong>Peter Strömberg</strong>/<a href="https://github.com/PEZ">@PEZ</a> - <a href="https://github.com/BetterThanTomorrow/calva">Calva</a>, <a href="https://calva.io/get-started-with-clojure/">Zero-install Get Started with Clojure</a>, <a href="https://github.com/PEZ/rich4clojure">Rich 4Clojure</a>, <a href="https://github.com/BetterThanTomorrow/dram">Dram</a>, <a href="https://github.com/PEZ/rn-rf-shadow">rn-rf-shadow</a></li>
<li><strong>Peter Taoussanis</strong>/<a href="https://github.com/ptaoussanis">@ptaoussanis</a> - <a href="https://github.com/ptaoussanis/sente">sente</a>, <a href="https://github.com/ptaoussanis/timbre">timbre</a>, <a href="https://github.com/ptaoussanis/carmine">carmine</a>, <a href="https://github.com/ptaoussanis/nippy">nippy</a>, <a href="https://github.com/ptaoussanis/tufte">tufte</a></li>
<li><strong>Phil Hagelberg</strong>/<a href="https://github.com/technomancy">@technomancy</a> - <a href="https://github.com/technomancy/leiningen">leiningen</a></li>
<li><strong>Roman Liutikov</strong>/<a href="https://github.com/roman01la">@roman01la</a> - <a href="https://github.com/roman01la/uix">uix</a>, <a href="https://github.com/tonsky/rum">rum</a>, <a href="https://github.com/clj-commons/citrus">citrus</a></li>
<li><strong>Sam Ritchie</strong>/<a href="https://github.com/sritchie">@sritchie</a> - <a href="https://github.com/sicmutils/sicmutils">sicmutils</a>, <a href="https://github.com/sicmutils/functional-numerics">functional-numerics</a>, <a href="https://github.com/nathanmarz/cascalog">cascalog</a></li>
<li><strong>Sean Corfield</strong>/<a href="https://github.com/seancorfield">@seancorfield</a> - <a href="https://github.com/seancorfield/next-jdbc">next-jdbc</a>, <a href="https://github.com/seancorfield/honeysql">honeysql</a>, <a href="https://github.com/seancorfield/depstar">depstar</a>, <a href="https://github.com/seancorfield/dot-clojure">dot-clojure</a></li>
<li><strong>Sven Richter</strong>/<a href="https://github.com/sveri">@sveri</a> - <a href="https://github.com/sveri/closp">closp</a></li>
<li><strong>Thomas Heller</strong>/<a href="https://github.com/thheller">@thheller</a> - <a href="https://github.com/thheller/shadow-cljs">shadow-cljs</a></li>
<li><strong>Tim Pope</strong>/<a href="https://github.com/tpope">@tpope</a> - <a href="https://github.com/tpope/vim-fireplace">vim-fireplace</a></li>
<li><strong>Tommi Reiman</strong>/<a href="https://github.com/ikitommi">@ikitommi</a> - <a href="https://github.com/metosin/compojure-api">compojure-api</a>, <a href="https://github.com/metosin/reitit">reitit</a>, <a href="https://github.com/metosin/malli">mallli</a>, <a href="https://github.com/metosin/spec-tools">spec-tools</a></li>
<li><strong>Tony Kay</strong>/<a href="https://github.com/awkay">@awkay</a> - <a href="https://github.com/fulcrologic/fulcro">fulcro</a></li>
<li><strong>Vlad Proczenko</strong>/<a href="https://github.com/vlaaad/">@vlaaad</a> - <a href="https://github.com/cljfx/cljfx">cljfx</a>, <a href="https://github.com/vlaaad/reveal">reveal</a></li>
<li><strong>Ivan Grishaev</strong>/<a href="https://github.com/igrishaev">@igrishaev</a> - <a href="https://github.com/igrishaev/etaoin">etaoin</a>, <a href="https://github.com/igrishaev/mockery">mockery</a></li>
<li><strong>Wilker Lucio</strong>/<a href="https://github.com/wilkerlucio">@wilkerlucio</a> - <a href="https://github.com/wilkerlucio/pathom3">pathom3</a>, <a href="https://github.com/wilkerlucio/pathom">pathom</a>, <a href="https://github.com/edn-query-language/eql">eql</a>, <a href="https://github.com/wilkerlucio/spec-coerce">spec-coerce</a></li>
<li><strong>Yannick Scherer</strong>/<a href="https://github.com/xsc">@xsc</a> - <a href="https://github.com/xsc/lein-ancient">lein-ancient</a>, <a href="https://github.com/clj-commons/rewrite-clj">rewrite-clj</a>, <a href="https://github.com/alumbra/alumbra">alumbra</a>, <a href="https://github.com/xsc/claro">claro</a></li>
<li><strong>Yehonathan Sharvit</strong>/<a href="https://github.com/viebel">@viebel</a> - <a href="https://github.com/viebel/klipse">klipse</a></li>
<li><strong>Zach Oakes</strong>/<a href="https://github.com/oakes">@oakes</a> - <a href="https://github.com/oakes/odoyle-rules">odoyle-rules</a>, <a href="https://github.com/oakes/play-cljc">play-cljc</a>, <a href="https://github.com/oakes/Paravim">Paravim</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2021 Survey Results</title>
      <link>https://www.clojuriststogether.org/news/q3-2021-survey-results/</link>
      <pubDate>Fri, 23 Jul 2021 21:30:58 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2021-survey-results/</guid>
      <description>Applications for our next funding round are open until the 6th of August.</description>
      <content:encoded><![CDATA[<p><strong>Clojurists Together is starting our next funding round for Q3 2021. Applications are open until the 6th of August. <a href="/open-source/">Apply</a> today!</strong></p>
<p>We&rsquo;ve recently announced some <a href="/news/the-next-phase-of-clojurists-together/">large changes</a> to how we run the program. You can read the announcement for the full details, but briefly, there will now be three types of funding:</p>
<ul>
<li>$1k/$2k fellowships for smaller/more experimental projects. These can last up to three months.</li>
<li>$9k fellowships for larger projects. The work for these fellowships can now be done over 1-12 months, rather than needing to do them in a fixed 3-month period.</li>
<li>$1.5k/month for 12 months. Recipients of these long-term fellowships don&rsquo;t need to submit a proposal, we just fund them to continue the great work they&rsquo;re already doing. Clojurists Together members will vote on which developers receive these fellowships.</li>
</ul>
<p>Another change is that fellowship recipients can delay starting for up to two months. This will give them more flexibility in when they start working on the project and make it more available to people who can&rsquo;t easily take time out of their daily life to work on their open source projects.</p>
<p>We&rsquo;re still finalising our funding but our current plan is to fund:</p>
<ul>
<li>4-8 experimental projects $1k-$2k =&gt; $8k</li>
<li>2 standard projects $9k =&gt; $18k</li>
<li>3 long-term * 1.5k/month =&gt; $13.5k</li>
<li>Clojars =&gt; $4.5k</li>
</ul>
<p>We would like to fund 6 developers for long-term fellowships instead of 3. However to do so we&rsquo;ll need new developer and company members to help support this. If you&rsquo;re a company that relies on Clojure, please consider joining Clojurists Together.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>As part of our recent changes, we surveyed our developer and company members to find out what they wanted us to focus on:</p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things our members were interested in:</p>
<ul>
<li>Developer Experience Tools</li>
<li>Build tooling</li>
<li>IDE support</li>
<li>Documentation</li>
<li>Test tooling</li>
<li>Error Messages</li>
<li>Debuggers</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>Clojure LSP</li>
<li>CIDER</li>
<li>ClojureScript compiler</li>
<li>clj-kondo</li>
<li>Shadow CLJS</li>
<li>Babashka</li>
</ul>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The next phase of Clojurists Together</title>
      <link>https://www.clojuriststogether.org/news/the-next-phase-of-clojurists-together/</link>
      <pubDate>Mon, 28 Jun 2021 14:13:58 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/the-next-phase-of-clojurists-together/</guid>
      <description>Expanding Clojurists Together to three new funding types</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce changes to better serve the Clojure community. Today we&rsquo;re announcing three new funding tiers, additional flexibility for maintainers in how they take the funding, more connection between members and funded projects, and our intention to seek out impactful projects to fund directly.</p>
<p>Earlier this year we surveyed open source Clojure maintainers and our members to understand how our current funding program worked. We learnt several things:</p>
<h3 id="more-flexible-funding">More flexible funding</h3>
<p>Maintainers wanted more advance notice on funding, more flexible funding periods, and more options for funding amounts. Our previous model of funding was $3k/month for 3 months. This amount was good for established projects, but was sometimes too much for smaller and more experimental projects. Additionally, we often didn&rsquo;t have much time between projects being selected and projects starting which made it hard to plan. Some maintainers wanted to take time off work and do it all in a month, but found it tricky to spread the work over 3 months.</p>
<p>Q: What would be the ideal funding structure for you to work on your open source projects?</p>
<blockquote>
<p>A certain monthly amount for longer periods of time I can plan around. Like Github Sponsors. The current short notice and then huge funding for 3 months is very difficult to integrate into my schedule.</p>
</blockquote>
<p>We&rsquo;ve now split our single funding tier into two:</p>
<ul>
<li><strong>$1k-$2k funding amounts</strong>, designed for experimental/smaller project proposals. Making smaller grants derisks the process, letting us make a larger number of selections, and accelerate develpment on promising experiments.</li>
<li><strong>$9k funding amounts</strong>, designed for more established/larger project proposals. These funds can now be taken over a variable time, from 1 to 12 months.</li>
</ul>
<p>Additionally, all recipients will have two months notice before their funding starts so they can better plan around the funding.</p>
<h3 id="long-term-funding">Long-term funding</h3>
<p>A need we heard from our members and maintainers was longer-term support to maintainers. Cognitect&rsquo;s <a href="https://www.cognitect.com/blog/2020/12/15/sponsoring-open-source-developers">sponsorship of developers</a> through GitHub Sponsors was a good fit for developers, providing stable, long-term funding for people to continue doing the work they were already doing, but better.</p>
<p>In response to this, we&rsquo;re adding a third tier of funding <strong>$1.5k/month for 12 months</strong>. Our members will nominate and vote on who receives these funds.</p>
<p>We have already been doing some work in this area, funding Clojars $1.5k/month and we&rsquo;re excited to expand this further to other projects.</p>
<h3 id="more-interaction-between-members-and-selections">More interaction between members and selections</h3>
<p>Members expressed a desire to provide more input to the project selections, and some maintainers didn&rsquo;t always know what members thought was valuable. We are now going to encourage projects to present a short lightning talk or blog post after their selection. Members can then give feedback on the proposal and any parts that they find particularly interesting.</p>
<p>Projects will continue to have freedom to make their own decisions, but will have the benefit of more understanding of which parts our members find most valuable.</p>
<h3 id="clojurists-together-making-direct-selections">Clojurists Together making direct selections</h3>
<p>Clojurists Together is going to reserve some money to seek out impactful projects to fund directly. We will be looking for opportunities to fund existing or potential projects that would provide a wide benefit to Clojure developers.</p>
<p>These projects would be ones which are large or challenging to take on, and may not happen without the catalyst of funding. An example would be providing patches to make browsers work better with ClojureScript.</p>
<h3 id="funding-plans-and-fundraising">Funding Plans and fundraising</h3>
<p>Clojurists Together currently receives $17,100 per month from our <a href="/members">members</a>. After Stripe fees and operating expenses, we have a safe withdrawal rate of about $15,000 per month or $45,000 per quarter.</p>
<p>Our current plan is to fund:</p>
<ul>
<li>4-8 experimental projects $1k-$2k =&gt; $8k</li>
<li>2 standard projects $9k =&gt; $18k</li>
<li>3 long-term * 1.5k/month =&gt; $13.5k</li>
<li>Clojars =&gt; $4.5k</li>
</ul>
<p>Total =&gt; $44k over 3 months.</p>
<p><strong>We would like to add an additional one or two long-term payments to support Clojure developers, but to do so we&rsquo;ll need to expand our membership.</strong> If you work for a company that uses Clojure, please consider talking to your engineering leadership about signing up for a Clojurists Together membership.</p>
<h3 id="thanks">Thanks</h3>
<p>Clojurists Together has grown from a small organisation giving $3,600/month to open source Clojure projects to today where we&rsquo;re looking to pay out $15,000/month or more. We couldn&rsquo;t have done it without our incredible developer and company members who support us. Thanks to everyone who has given money, both now and in the past to build tools and libraries for the Clojure community.</p>
<p>We want to say a special thanks to our company members <a href="latacora-cljtog">Latacora</a>, <a href="roam-cljtog">Roam</a>, <a href="pitch-cljtog">Pitch</a>, <a href="nubank-cljtog">Nubank</a>, <a href="cisco-cljtog">Cisco</a>, <a href="https://juxt.pro">JUXT</a>, <a href="https://www.metosin.fi/">Metosin</a>, <a href="solita-cljtog">Solita</a>, <a href="http://www.adgoji.com/">Adgoji</a>, <a href="https://nextjournal.com/">Nextjournal</a>, <a href="https://flexiana.com/">Flexiana</a>, <a href="https://toyokumo.co.jp/">Toyokumo</a>, <a href="https://www.griffin.sh/">Griffin</a>, <a href="https://parkside.app/">Parkside</a>, and <a href="https://jacekschae.com/">Jacek Schae</a>. They&rsquo;ve given significant amounts of money to Clojurists Together over the years, and we couldn&rsquo;t have done it without them.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2021 Board Election Results</title>
      <link>https://www.clojuriststogether.org/news/2021-board-election-results/</link>
      <pubDate>Thu, 22 Apr 2021 21:51:45 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2021-board-election-results/</guid>
      <description>Clojurists Together members have elected Chris Nuernberger, Heather Moore-Farley, Ikuru Kyogoku, and Daniel Compton.</description>
      <content:encoded><![CDATA[<p>The Clojurists Together board is happy to announce the results of our <a href="/news/announcing-board-nominations/">elections</a>. We have three new board members and one returning board member:</p>
<ul>
<li>Heather Moore-Farley</li>
<li>Ikuru Kyogoku</li>
<li>Chris Nuernberger</li>
<li>Daniel Compton (returning)</li>
</ul>
<p>Thanks to everyone who stood for election, it was an incredibly strong slate of candidates.</p>
<p>We also want to thank the outgoing board members Daniel Solano Gómez and Larry Staton Jr for their years of service to the board and the Clojure community. Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Announcing Board Nominations</title>
      <link>https://www.clojuriststogether.org/news/announcing-board-nominations/</link>
      <pubDate>Thu, 08 Apr 2021 14:09:25 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/announcing-board-nominations/</guid>
      <description>Clojurists Together members can now vote for the next board members.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is in the process of <a href="/news/clojurists-together-board-nominations-and-annual-members-meeting/">electing new board members</a> as half of our existing board members finish their term.</p>
<p>After accepting applications for nominations, we received 16 applications from candidates. These candidates were all talented Clojurists that we would love to have on the board.</p>
<p>Our bylaws state:</p>
<blockquote>
<p>The Board shall nominate no more than 12 candidates seeking board membership in any given election. In nominating candidates for Director positions and in choosing the number of candidates to nominate overall, the Board shall use reasonable efforts to maintain a Board composition consisting of at least: (1) 25% female Directors, (2) 25% non-Caucasian Directors, and (3) 35% from any category(ies) of persons (e.g., race, gender, ability) commonly considered to have suffered from discrimination at some time and then-currently under-represented in the technology industry, in each case as determined by the Board in its reasonable discretion.</p>
</blockquote>
<p>The board has nominated the following 12 candidates for the current board election:</p>
<ul>
<li>Alan Thompson</li>
<li>Ashima Panjwani</li>
<li>Chris Nuernberger</li>
<li>Dan Sutton</li>
<li>Daniel Compton</li>
<li>Daniel Slutsky</li>
<li>Erik Assum</li>
<li>Heather Moore-Farley</li>
<li>Ikuru Kyogoku</li>
<li>Kenny Williams</li>
<li>Kira McLean</li>
<li>Shriphani Palakodety</li>
</ul>
<h3 id="next-steps">Next Steps</h3>
<p>All current Clojurists Together members will be shortly receiving their ballot to vote. If you haven&rsquo;t received a ballot by Monday, 12th April, please contact <a href="mailto:hi@clojuriststogether.org">hi@clojuriststogether.org</a>.</p>
<p>Voting will close on Monday 19th April, 2021 at midnight Pacific Time. The top four candidates, as voted on by members will win. We will announce the winners shortly afterwards and you&rsquo;ll be able to meet them at the Annual members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+annual+members+meeting&amp;iso=20210429T16&amp;p1=%3A&amp;ah=1">9am Pacific time, April 29th, 2021</a>.</p>
<h2 id="candidate-profiles">Candidate Profiles</h2>
<p>Below we have published the candidates applications:</p>
<h3 id="alan-thompson---looking-glass">Alan Thompson - Looking Glass</h3>
<ul>
<li>GitHub: <a href="https://github.com/cloojure/tupelo">@cloojure</a></li>
</ul>
<h4 id="why-theyd-like-to-join">Why they&rsquo;d like to join</h4>
<p>I have been committed to improving software engineering for over 25 years. As part of this effort, I have presented at Clojure/Conj on 4 occasions and am one of the top 20 contributors on StackOverflow for Clojure questions.</p>
<h4 id="bio">Bio</h4>
<p>Alan Thompson is an Electrical Engineer and Software Developer with experience in numerous DoD and commercial projects.  He has been addicted to Clojure since 2013 and is the maintainer of the Tupelo Clojure library, among others. He has seen many (if not most) ways for software development to fail, and is a deep believer in iterative development, automated testing, and good design.</p>
<h3 id="ashima-panjwani">Ashima Panjwani</h3>
<h4 id="why-theyd-like-to-join-1">Why they&rsquo;d like to join</h4>
<p>I have previously received funding from the Clojurists Together to work on Clojisr during Q4 of 2020. I’m extremely grateful for this opportunity and would like to give back to the community by helping out wherever possible.</p>
<h4 id="bio-1">Bio</h4>
<p>Ashima Panjwani is a self-taught programmer working at Blackhawk Network (Bangalore Center), delivering branded payment solutions. In her free time, she contributes to various open-source projects (ClojisR, Tablecloth, etc.) in the Clojure Data Science ecosystem.</p>
<h3 id="chris-nuernberger---techascent">Chris Nuernberger - TechAscent</h3>
<ul>
<li>GitHub: <a href="https://github.com/cnuernber">@cnuernber</a></li>
</ul>
<h4 id="why-theyd-like-to-join-2">Why they&rsquo;d like to join</h4>
<p>I think Clojure has a lot of potential in places where it hasn&rsquo;t seen much success and I would like to drive it that direction.</p>
<h4 id="bio-2">Bio</h4>
<p>Chris has a strong background in high performance computing and machine learning and has built many opensource libraries such as libpython-clj and tech.ml.dataset that support moving Clojure more towards data analytics and cutting edge machine learning.</p>
<h3 id="dan-sutton---metabase">Dan Sutton - Metabase</h3>
<ul>
<li>GitHub: <a href="https://github.com/dpsutton">@dpsutton</a></li>
<li>Twitter: <a href="twitter.com/dan_sutton">@dan_sutton</a></li>
</ul>
<h4 id="why-theyd-like-to-join-3">Why they&rsquo;d like to join</h4>
<p>I&rsquo;ve been involved with the Clojure community for five years now. I love helping new people and supporting developers. I&rsquo;ve helped with CIDER and answering questions and adding features for that same amount of time. I&rsquo;m quite invested in the long term stability of the Clojure community and would enjoy helping in this capacity.</p>
<h4 id="bio-3">Bio</h4>
<p>My name is Dan Sutton. I&rsquo;ve been involved in the Clojure community for about six years now. I originally purchased a copy of Brave and True and got my .NET company to send me to Seattle for Clojure West. My language of choice has been Clojure ever since and I&rsquo;ve greatly enjoyed this community. It&rsquo;s contemplative, innovative, and welcoming. I love the effort of this endeavor and would love to contribute as I can.</p>
<h3 id="daniel-compton---github">Daniel Compton - GitHub</h3>
<ul>
<li>GitHub: <a href="https://github.com/danielcompton">@danielcompton</a></li>
<li>Twitter: <a href="https://twitter.com/danielwithmusic">@danielwithmusic</a></li>
<li><a href="https://therepl.net">The REPL</a></li>
</ul>
<h4 id="why-theyd-like-to-join-4">Why they&rsquo;d like to join</h4>
<p>I was a founder of Clojurists Together and for many years was the primary driver of our funding activities. Last year, together with lvh, we formed the 501(c)6 Clojurists Together Foundation. I’ve spoken at conferences about Clojurists Together and open source sustainability.</p>
<p>I have a deep understanding of how the organisation runs and the open source Clojure community. If re-elected, I will work with the rest of the board to continue strengthening open-source Clojure.</p>
<h4 id="bio-4">Bio</h4>
<p>Daniel Compton is a founder of Clojurists Together and has been serving first as project leader and then Treasurer. He has contributed widely to open source Clojure code. He works at GitHub on GitHub Sponsors, helping companies and developers fund their dependencies.</p>
<h3 id="daniel-slutsky---localize">Daniel Slutsky - Localize</h3>
<ul>
<li>GitHub: <a href="https://github.com/daslu">@daslu</a></li>
<li>Twitter: <a href="https://twitter.com/daslu_">@daslu_</a></li>
</ul>
<h4 id="why-theyd-like-to-join-5">Why they&rsquo;d like to join</h4>
<p>I think CT has an important role in nurturing the Clojure ecosystem.</p>
<p>CT&rsquo;s support has already affected numerous important projects, and in some situations, it can be really transformative. It may allow the extra attention that some projects need for maturing well. For new contributors, it may give the substantial push that is needed for getting involved in the details and becoming comfortable as maintainers.</p>
<p>Clojure has a hopeful prospect of becoming friendlier, well-known, and widely used by broader audiences. A few of us are discussing that continuously at Scicloj and planning some possible paths to get there. It will be difficult but doable, I think. CT&rsquo;s support will surely serve an important role in that, and I want to help in making that happen.</p>
<p>In the last two years, I have been involved in building some parts of the Clojure ecosystem, mainly through community building and library maintenance at Scicloj. I have also worked closely with two developers during their CT projects.</p>
<p>Hopefully, my experience as an organiser &ndash; in open source communities as well as in local grassroots communities throughout the years &ndash; can serve CT well in thinking about projects and the human dynamics around them.</p>
<h4 id="bio-5">Bio</h4>
<p>Daniel Slutsky is a mathematician and a programmer. Currently, his main activity is in the organising team of the Scicloj community, which is building some parts of the Clojure ecosystem for data science. He has been one of the main developers of the Clojisr library and Notespace tool and has supported a few community members in becoming active contributors to libraries such as Tablecloth and tech.ml.dataset.
Alongside his work as a software developer and a data scientist throughout the years, Daniel has been a political activist and a community organiser in local social movements.
Daniel works part-time at Localize in a data-science team in the field of urban geography. He is also beginning his path as a yoga teacher.</p>
<h3 id="erik-assum---ardoq-as">Erik Assum - Ardoq AS</h3>
<ul>
<li>GitHub: <a href="https://github.com/slipset">@slipset</a></li>
<li>Twitter: <a href="https://twitter.com/slipset">@slipset</a></li>
<li><a href="https://slipset.github.io">slipset.github.io</a></li>
</ul>
<h4 id="why-theyd-like-to-join-6">Why they&rsquo;d like to join</h4>
<p>I am an active member of the Clojure community, both as a speaker and maintainer of several project, especially through my work with clj-commons. I believe that there is room for other ways than the three months grants of sponsoring important Clojure OSS projects, and would like to work with exploring different options in this area.</p>
<h4 id="bio-6">Bio</h4>
<p>Erik Assum is a tech lead at Ardoq, he&rsquo;s been programming in a variety of languages over the last 25 years. He&rsquo;s enthusiastic about programming, project management, and problem solving in general. Through his work with clj-commons, he&rsquo;s been able to use his love for maintenance programming for the greater good of the Clojure community.</p>
<h3 id="heather-moore-farley">Heather Moore-Farley</h3>
<ul>
<li>GitHub: <a href="https://github.com/tophat8855">@tophat8855</a></li>
</ul>
<h4 id="why-theyd-like-to-join-7">Why they&rsquo;d like to join</h4>
<p>I’m interested in joining the Clojurists Together Committee because I’ve really benefitted from some of the projects that Clojurists Together has supported in the past and I’d love to have a part in supporting more projects. I’m at a point in my life where I want to contribute more to the community around me and this feels like a good way to do that. I’ve been on non-profit boards before and I know the work of  board meetings and prep and followups isn’t glamorous, but is really important for organizations to feel like they are going somewhere, and for increasing a feeling of community. I think it can be easy to feel like a lone developer working on a project, but knowing groups like CT are supporting projects can alleviate that a bit. And CT can’t support projects without a committee.</p>
<h4 id="bio-7">Bio</h4>
<p>Heather is a software engineer, knitter, and bicyclist. She has been coding with Clojure and Clojurescript full-time for 3 years at Mayvenn. In her 6 years of professional software development, she has both benefitted from and contributed to open source projects.</p>
<h3 id="ikuru-kyogoku---parkside">Ikuru Kyogoku - Parkside</h3>
<ul>
<li>GitHub: <a href="https://github.com/iku000888">@iku000888</a></li>
<li>Twitter: <a href="https://twitter.com/iku000888">@iku000888</a></li>
</ul>
<h4 id="why-theyd-like-to-join-8">Why they&rsquo;d like to join</h4>
<p>In short, I want the following to happen with Clojurists Together:</p>
<ul>
<li>Advance transparency around the project selection process. i.e. public meeting minutes</li>
<li>Support ambitious long shot projects that are potentially game changing, such as <a href="https://twitter.com/cgrand/status/1350063059864346624">https://twitter.com/cgrand/status/1350063059864346624</a></li>
<li>Strengthen support for community initiatives; funding a remote beginner workshop comes to mind, but the point is looking at areas that have not been funded in the past.</li>
</ul>
<p>I believe I am a good fit because beyond my professional Clojure experience, I can contribute to the diversity of the community by reaching the Clojure community in Japanese.</p>
<h4 id="bio-8">Bio</h4>
<p>Ikuru Kyogoku is a U.S. based Software Engineer working at Parkside developing a trading platform on Kafka and Datomic.</p>
<p>Before that he has been a Clojure developer by trade in Japan since 2016 at various places developing webapps (frontend &amp; backend) and a little bit on a react native app(re-natal).</p>
<h3 id="kenny-williams---compute-software">Kenny Williams - Compute Software</h3>
<ul>
<li>GitHub: <a href="https://github.com/kennyjwilli">@kennyjwilli</a></li>
<li>Twitter: <a href="https://twitter.com/kennyjwilli">@kennyjwilli</a></li>
</ul>
<h4 id="why-theyd-like-to-join-9">Why they&rsquo;d like to join</h4>
<p>As a Clojurists Together Committee member, I hope to represent small companies built on Clojure and its ecosystem. I co-founded Compute Software in 2017, and we rely heavily on open source libraries (e.g., re-frame, shadow-cljs, reitit, &amp; more). I owe much our ability to deliver product quickly to Clojure and the rich ecosystem of open source Clojure(Script) libraries.</p>
<h4 id="bio-9">Bio</h4>
<p>Kenny Williams is a software engineer and co-founder at Compute Software. He has a background in designing, building, and operating SaaS B2B products. He has built several products from the ground up entirely using Clojure. At Compute Software, he leads the engineering team in building their cloud optimization platform.</p>
<h3 id="kira-mclean---self-employed-contract-with-swirrl">Kira McLean - Self employed, contract with Swirrl</h3>
<ul>
<li>Twitter: <a href="https://twitter.com/kiraemclean">@kiramclean</a></li>
<li>GitHub: <a href="https://github.com/kiramclean">@kiramclean</a></li>
<li>Personal website: [kiramclean.com(https://kiramclean.com)</li>
</ul>
<h4 id="why-theyd-like-to-join-10">Why they&rsquo;d like to join</h4>
<p>I&rsquo;ve been working with Clojure full time for about 2 years now and am pretty keen to stick with it as my primary language. I love the language and the community, and am looking for ways to give back. I think I would be a good fit because I have big hopes and dreams for Clojure. I want to see the language and community thrive and think I could help. Admittedly some of this is selfish because I would really love to be able to keep getting paid to write Clojure forever, but I&rsquo;m more motivated by the possibility of helping to teach more new Clojure programmers and introduce it to people who might not otherwise consider it. I think I could also offer a useful, maybe different perspective as a young(ish), less experienced Clojurian.</p>
<h4 id="bio-10">Bio</h4>
<p>Kira is a software developer from Montreal, Canada, currently working with Swirrl building tools for publishing open data on the web. She&rsquo;s passionate about open data and open standards, and dreams of an internet that mostly works.</p>
<h3 id="shriphani-palakodety---onai">Shriphani Palakodety - Onai</h3>
<ul>
<li>Personal website: <a href="http://shriphani.com">sriphani.com</a></li>
<li>GitHub: <a href="https://github.com/shriphani">@sriphani</a></li>
<li>Twitter: <a href="https://twitter.com/shriphani">@sriphani</a></li>
</ul>
<h4 id="why-theyd-like-to-join-11">Why they&rsquo;d like to join</h4>
<p>I&rsquo;ve used clojure in a variety of academic and professional settings. I used clojure for a first of its kind scraping and machine learning use-case at Kimono labs (acquired by Palantir). Subsequently, I used Clojure for a variety of state of the art natural language processing and program-synthesis problems at Onai. A couple of these resulted in publications at top computer science venues. I have experience managing clojure codebases, helping teams adopt and successfully deploy clojure in the domains of AI, frontend and other additional use-cases like formal methods, and model checking. Besides engineering work, I have a successful track record of AI research, and formal methods research (organizing workshops at NASA in formal methods and cryptography).</p>
<h4 id="bio-11">Bio</h4>
<p>Shriphani Palakodety (Onai) is a software engineer, sculptor and cartographer. His primary research focus is low resource natural language processing, formal methods, and cryptography. He organized the first workshop on formal methods for cryptography at the NASA Formal Methods conference in 2020. His work on low-resource NLP with applications to refugee crises was covered in international press outlets. Shriphani&rsquo;s maps and cartography have been covered in major news outlets in India and his geospatial work and resources are widely used by GIS practitioners. His sculptures have been displayed at galleries in the Bay Area, California and Vancouver, British Columbia.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Listening to maintainers for the next phase of Clojurists Together</title>
      <link>https://www.clojuriststogether.org/news/listening-to-maintainers-for-the-next-phase-of-clojurists-together/</link>
      <pubDate>Wed, 24 Mar 2021 14:20:00 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/listening-to-maintainers-for-the-next-phase-of-clojurists-together/</guid>
      <description>Help us understand the best way we can fund the Clojure community.</description>
      <content:encoded><![CDATA[<p>Clojurists Together wants to hear from you, the open source Clojure community about how we can better serve you. You can fill out the <a href="https://docs.google.com/forms/d/e/1FAIpQLSdIha0JX1nmjZRTsrdG7g8vAvxjTgO6VQpnVsEgOPH664KLMg/viewform">survey</a> today.</p>
<h3 id="background">Background</h3>
<p>Now that we&rsquo;ve been operating as a 501(c)6 for almost a year, we&rsquo;re wanting to talk to our members and the Clojure open source community about ideas for alternative funding structures.</p>
<p>For most of our life, Clojurists Together has funded projects in 3 month cycles. First for $1,800/month ($5,400/cycle), and then for $3,000 month ($9,000/cycle).</p>
<p>This has been a successful model but we&rsquo;ve heard from both maintainers and members that they&rsquo;d like to see us experiment with other funding models. Last year as part of the <a href="/news/announcing-summer-of-bugs/">Summer of Bugs</a> where we funded 7 projects with micro-grants of $500 or $1,000. We&rsquo;ve also been funding <a href="/news/clojurists-together-is-funding-clojars/">Clojars</a> for $1,500/month.</p>
<p>These experiements have been successful. We&rsquo;ve improved our processes to make contracts and payments run more smoothly.</p>
<h3 id="ideas">Ideas</h3>
<p>Some ideas to get you thinking:</p>
<ul>
<li>Pay one person $5,000/month for 12 months.</li>
<li>Pay 10 people $200 each for documentation patches.</li>
<li>Run a mentoring program where the mentor and mentee each get paid to work on an open source project.</li>
<li>Let projects choose the intensity of their program, e.g. work full time for one month, or work very part-time for 12 months but still receive the same amount.</li>
<li>Have Clojurists Together commission work that they (and their members) think is valuable, rather than waiting for projects to apply for funding.</li>
</ul>
<h3 id="next-steps">Next steps</h3>
<p>If you&rsquo;re an open source Clojure developer, we want to hear from you in <a href="https://docs.google.com/forms/d/e/1FAIpQLSdIha0JX1nmjZRTsrdG7g8vAvxjTgO6VQpnVsEgOPH664KLMg/viewform">this survey</a>.</p>
<p>If you&rsquo;re a Clojurists Together member, we also have a private survey that you&rsquo;ll receive shortly to hear more about what you&rsquo;d like to see as a member.</p>
<p>If you have thoughts or suggestions and don&rsquo;t fall into either of those groups, feel free to send them through our <a href="/contact">contact</a> page. Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>February 2021 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/february-2021-monthly-update/</link>
      <pubDate>Fri, 05 Mar 2021 09:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/february-2021-monthly-update/</guid>
      <description>Read more updates from Clj-kondo/babashka/sci, ClojisR, O’Doyle Rules, and Calva</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s the final updates from the projects in February. This is the 2nd month of ClojisR. They will have their final update next month.</p>
<h1 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h1>
<h3 id="february-1-14"><strong>February 1-14</strong></h3>
<p>I spent some time improving Calva&rsquo;s publishing process to automate the steps we were doing manually before, like updating the changelog and some git tasks. This allows us to spend a bit less time publishing new versions, and makes it less error-prone.</p>
<p>I also added a command for copying the jack-in command to the clipboard, so users that want to start a repl themselves but still have Calva&rsquo;s required repl dependencies can do so more easily.</p>
<p>I&rsquo;ve started experimenting with using ClojureScript for more of Calva&rsquo;s code base by porting the clojure-lsp integration over to ClojureScript. In doing so I&rsquo;ve come across some issues, which Thomas Heller and others are assisting with. I think using ClojureScript more going forward, incrementally translating existing features from Typescript and adding new features in ClojureScript, will improve Calva by way of all known benefits of Clojure (smaller code base, fewer bugs, repl-driven development, etc.) as well as by potentially increasing the number of contributors to Calva.</p>
<p>Some other changes:</p>
<ul>
<li>Fixed the load file command for Windows, on which it was not loading changes since the last file save</li>
<li>Updated the clojure-lsp version used by Calva to fix an issue with completions and an issue with when the clj-kondo config is respected. These updates also brought in other new features of clojure-lsp.</li>
</ul>
<h2 id="recent-calva-changes">Recent Calva Changes</h2>
<h3 id="20171---2021-02-10">[2.0.171] - 2021-02-10</h3>
<ul>
<li>Update clojure-lsp to version 2021.02.09-18.28.06 (Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/996#issuecomment-776148282">Auto completion does not work in clojure-lsp only mode (no repl connection)</a>)</li>
<li>Update clojure-lsp to version 2021.02.10-03.01.19 (Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/1026">Project clj-kondo config file not being considered</a>)</li>
</ul>
<h3 id="20170---2021-02-09">[2.0.170] - 2021-02-09</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/529">Paredit drag backward/forward should drag bindings as pairs</a></li>
</ul>
<h3 id="20169---2021-02-09">[2.0.169] - 2021-02-09</h3>
<ul>
<li>Update clojure-lsp to version 2021.02.07-22.51.26 (fix previous attempt)</li>
</ul>
<h3 id="20168---2021-02-08">[2.0.168] - 2021-02-08</h3>
<ul>
<li>Update clojure-lsp to version 2021.02.07-22.51.26</li>
</ul>
<h3 id="20164---2021-02-06">[2.0.164] - 2021-02-06</h3>
<ul>
<li>Really fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/1018">Demo gifs 404 on VisualStudio Marketplace</a></li>
</ul>
<h3 id="20163---2021-02-06">[2.0.163] - 2021-02-06</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/1018">Demo gifs 404 on VisualStudio Marketplace</a></li>
</ul>
<h3 id="20162---2021-02-06">[2.0.162] - 2021-02-06</h3>
<ul>
<li>Fix for fix of: <a href="https://github.com/BetterThanTomorrow/calva/issues/1016">Fix Paredit raise sexpr doesn&rsquo;t work when cursor is behind the current form</a></li>
</ul>
<h3 id="20161---2021-02-05">[2.0.161] - 2021-02-05</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/860">Automate more of the release process and document it (including rationale)</a></li>
</ul>
<h3 id="20160---2021-02-05">[2.0.160] - 2021-02-05</h3>
<ul>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/releases/tag/2021.02.05-03.05.34">Upgrade clojure-lsp to 2021.02.05-03.05.34</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/1016">Fix Paredit raise sexpr doesn&rsquo;t work when cursor is behind the current form</a></li>
</ul>
<h3 id="20159---2021-02-05">[2.0.159] - 2021-02-05</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/1011">Enable keyboard shortcuts for custom REPL commands</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/1008">Add commands for tapping current and top-level forms</a></li>
</ul>
<h3 id="20158---2021-02-03">[2.0.158] - 2021-02-03</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/1005">Add setting to use only static parts of Calva</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/975">Load file command not loading changes since last file save on Windows</a></li>
<li>Update clojure-lsp to 2021.02.02-14.02.23</li>
</ul>
<h3 id="20157---2021-02-01">[2.0.157] - 2021-02-01</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/995">Add command for copying jack-in command to clipboard</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/950">Change default shortcuts for Paredit forward/backward sexp, expand/shrink selection, and for slurping and barfing</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/986">Add Custom Commands variables for current form and more</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/1000">Jack-in fails to launch deps.edn projects for some Windows users</a></li>
</ul>
<h3 id="february-15-28"><strong>February 15-28</strong></h3>
<p>I&rsquo;ve continued exploring our options for using more ClojureScript in Calva, that interops with the Typescript we already have. I translated the clojure-lsp integration code from Typescript to ClojureScript. While what I was doing worked in dev, I realized there was an issue caused by the way we bundle code for releases. There&rsquo;s a bit more for me to try, but I think we can reach a solution that works in a way that&rsquo;s satisfactory.</p>
<p>Once I get past the above, I plan to make Calva download the clojure-lsp native binary and use that, instead of packaging the clojure-lsp jar with Calva. The native binaries come with improved memory usage and startup time of clojure-lsp.</p>
<p>Also, thanks to a contributor, Calva now has an option to disable diagnostics from clojure-lsp.</p>
<h2 id="recent-calva-changes-1">Recent Calva Changes</h2>
<h3 id="20176---2021-02-24">[2.0.176] - 2021-02-24</h3>
<ul>
<li>Revert switch to cljs for lsp, until <a href="https://github.com/BetterThanTomorrow/calva/issues/1044">the issue with released cljs/js interop</a> has been fixed</li>
</ul>
<h3 id="20174---2021-02-24">[2.0.174] - 2021-02-24</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/1025">Translate clojure-lsp integration to cljs</a></li>
</ul>
<h3 id="20173---2021-02-21">[2.0.173] - 2021-02-21</h3>
<ul>
<li>Fix <a href="https://github.com/BetterThanTomorrow/calva/issues/814">Connect ”not in project” glitches</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/1003">Add a ”Start Standalone REPL” commands</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/981">Add a configuration option to disable diagnostics</a></li>
</ul>
<h1 id="odoyle-rules">O’Doyle Rules</h1>
<h3 id="february-1-14-1"><strong>February 1-14</strong></h3>
<p>I released version 0.7.0 which smooths down something that I think is the sharpest edge of O&rsquo;Doyle: infinite loops. They are easy to create, and before this release, all you were greeted with was a long <code>StackOverflowException</code> with no useful info whatsoever.</p>
<p>In this release, O&rsquo;Doyle detects these infinite loops and tells you exactly what rule(s) are being called in that loop. See <a href="https://github.com/oakes/odoyle-rules/releases/tag/0.7.0">the release notes</a> for examples of what these error messages look like now. They&rsquo;re so beautiful you might start making infinite loops on purpose just to see them.</p>
<p>I also recorded a talk for the Bay Area Clojure meetup on O&rsquo;Doyle, which will now serve as a nice intro to the library for people. You can see it here: <a href="https://www.youtube.com/watch?v=XONRaJJAhpA">https://www.youtube.com/watch?v=XONRaJJAhpA</a></p>
<h3 id="february-15-28-1"><strong>February 15-28</strong></h3>
<p>I released 0.8.0 which includes:</p>
<ul>
<li><a href="https://github.com/oakes/odoyle-rules/pull/5">PR #5</a> - Improve cljs require support. Add cljs tests</li>
<li><a href="https://github.com/oakes/odoyle-rules/issues/6">Issue #6</a> - Nondeterministic behavior?</li>
</ul>
<p>The last three months added far more polish to O&rsquo;Doyle than I ever intended. The addition of <code>:then-finally</code> made it far better for creating derived facts, and the <code>{:then not=}</code> feature made it possible to derive all kinds of hierarchical data without any query language. With the recursion limit and cycle detector, O&rsquo;Doyle is now far easier to debug when infinite loops happen in your rules. Detecting the opposite (why a rule <em>didn&rsquo;t</em> fire) is still an interesting design question that I plan on working on. O&rsquo;Doyle rules :D</p>
<h1 id="calva">Calva</h1>
<h3 id="february-1-14-2"><strong>February 1-14</strong></h3>
<p>Here is an overview of the work I did per project.</p>
<h2 id="babashka">Babashka</h2>
<ul>
<li><a href="https://github.com/babashka/fs">babashka.fs</a>: utility library for dealing with files (based on java.nio)</li>
<li>babashka 0.2.9 released</li>
<li>upgrade to graalvm 21.0.0</li>
<li><a href="https://github.com/babashka/babashka/issues/728">https://github.com/babashka/babashka/issues/728</a></li>
<li><a href="https://github.com/borkdude/spartan.spec/issues/16">https://github.com/borkdude/spartan.spec/issues/16</a></li>
<li>babashka.nrepl: fix printing in lazy value <a href="https://github.com/babashka/babashka.nrepl/issues/36">#36</a></li>
</ul>
<h2 id="sci">Sci</h2>
<ul>
<li>
<p>Optimize if <a href="https://github.com/borkdude/sci/issues/514">#514</a></p>
</li>
<li>
<p>Include namepace in invalid arity msg and fix fn name <a href="https://github.com/borkdude/sci/issues/518">#518</a></p>
</li>
<li>
<p>Fix ns-publics to not include refers <a href="https://github.com/borkdude/sci/issues/520">#520, #523</a></p>
</li>
<li>
<p>Add <code>refer-clojure</code> macro <a href="https://github.com/borkdude/sci/issues/519">#519</a></p>
</li>
<li>
<p>Syntax quote resolves referred var incorrectly <a href="https://github.com/borkdude/sci/issues/526">#526</a></p>
</li>
<li>
<p>Priorize referred vars over vars in current ns <a href="https://github.com/borkdude/sci/issues/527">#527</a></p>
</li>
<li>
<p>if with falsy literal returns nil <a href="https://github.com/borkdude/sci/issues/529">#529</a></p>
</li>
</ul>
<h2 id="clj-kondo">Clj-kondo</h2>
<ul>
<li>Fix crash when linting kitchen-async <a href="https://github.com/clj-kondo/clj-kondo/issues/1148">#1148</a></li>
<li>Core.match support <a href="https://github.com/clj-kondo/clj-kondo/issues/496">#496</a></li>
<li>memory optimizations for clojure-lsp <a href="https://github.com/clj-kondo/clj-kondo/commit/175c48839299c445f6684fa15e5692b03c9bcb5a0">commit</a></li>
<li>Upgrade to GraalVM 21.0.0 <a href="https://github.com/clj-kondo/clj-kondo/issues/1163">#1163</a></li>
<li>Fix analysis of case dispatch vals <a href="https://github.com/clj-kondo/clj-kondo/issues/1169">#1169</a></li>
<li>Don&rsquo;t use lint-as for hooks <a href="https://github.com/clj-kondo/clj-kondo/issues/1170">#1170</a></li>
<li>Exported config fix for git deps <a href="https://github.com/clj-kondo/clj-kondo/issues/1171">#1171</a></li>
<li>Potemkin improvement with regards to unresolved var <a href="https://github.com/clj-kondo/clj-kondo/issues/1167">#1167</a></li>
<li>Fix unresolved var <code>clojure.spec.gen.alpha/fmap</code> <a href="https://github.com/clj-kondo/clj-kondo/issues/1157">#1157</a></li>
</ul>
<h2 id="edamame">Edamame</h2>
<ul>
<li>Return array-based map when c &lt;= 16 <a href="https://github.com/borkdude/edamame/issues/78">#78</a></li>
</ul>
<h2 id="misc">Misc</h2>
<ul>
<li>Carve <a href="https://github.com/borkdude/carve/releases/tag/v0.0.2">0.0.2</a></li>
</ul>
<h3 id="february-15-28-2"><strong>February 15-28</strong></h3>
<p>Here is my &ldquo;thank you&rdquo; video message to Clojurists Together which gives an
overview of the most important new features implemented in this funding round:</p>
<p><a href="https://youtu.be/P09GZVqiDdM">https://youtu.be/P09GZVqiDdM</a></p>
<p>Here is an overview of the work I did per project in the last two weeks.</p>
<h2 id="babashka-1">Babashka</h2>
<ul>
<li>move sqlite pod to -go name</li>
<li>Update link in nREPL server message <a href="https://github.com/babashka/babashka.nrepl/issues/37">#37</a></li>
<li>Upgrade httpkit to 2.5.3 <a href="https://github.com/babashka/babashka/issues/738">#738</a></li>
<li>Add several classes to be used with <code>defprotocol</code> (<code>PersistentVector</code>, <code>PersistentHashSet</code>, &hellip;)</li>
<li>Release v0.2.11</li>
</ul>
<p>Spartan.spec:</p>
<ul>
<li>Fix <code>&amp;</code> with predicate <a href="https://github.com/borkdude/spartan.spec/issues/19">#19</a></li>
</ul>
<h2 id="sci-1">Sci</h2>
<ul>
<li>Detect cyclic load dependencies <a href="https://github.com/babashka/babashka/issues/531">#531</a></li>
<li><code>(instance? clojure.lang.IAtom 1)</code> returns <code>true</code> <a href="https://github.com/borkdude/sci/issues/537">#537</a></li>
<li>Pick fn arity independent of written order <a href="https://github.com/babashka/babashka/issues/532">#532</a></li>
<li>Fix <code>ns-unmap</code> on referred var <a href="https://github.com/borkdude/sci/issues/539">#539</a></li>
<li>Release v0.2.4</li>
</ul>
<h2 id="clj-kondo-1">Clj-kondo</h2>
<ul>
<li>Lint nested function literal <a href="https://github.com/clj-kondo/clj-kondo/issues/636">#636</a></li>
<li>Continue analyzing on invalid symbol <a href="https://github.com/clj-kondo/clj-kondo/issues/1146">#1146</a></li>
<li>Redundant expression linter <a href="https://github.com/clj-kondo/clj-kondo/issues/298">#298</a></li>
<li>Add <code>:exclude</code> config to :refer linter <a href="https://github.com/clj-kondo/clj-kondo/issues/1172">#1172</a></li>
<li>Warn on non-existent var in <code>:refer</code> <a href="https://github.com/clj-kondo/clj-kondo/issues/546">#546</a></li>
<li>Support <code>clojure.data.xml/alias-uri</code><a href="https://github.com/clj-kondo/clj-kondo/issues/1180">#1180</a></li>
<li>Standalone require should be emitted to analysis <a href="https://github.com/clj-kondo/clj-kondo/issues/1177">#1177</a></li>
<li>Release v2021.02.28</li>
</ul>
<h2 id="misc-1">Misc</h2>
<ul>
<li>Run tools-deps as native binary: <a href="https://github.com/borkdude/tools-deps-native-experiment">https://github.com/borkdude/tools-deps-native-experiment</a></li>
<li>Infer dependencies from sources: <a href="https://github.com/borkdude/deps-infer">https://github.com/borkdude/deps-infer</a></li>
</ul>
<h1 id="clojisr">ClojisR</h1>
<h3 id="february-1-14-3"><strong>February 1-14</strong></h3>
<p>Currently, our main focus is to help different Clojure data science libraries to bring R like functionality by filling in the missing gaps.</p>
<h2 id="completed-tasks">Completed tasks:</h2>
<ul>
<li><a href="https://github.com/ashimapanjwani/clojisr-template">ClojisR Docker template + documentation</a>: Created a template containing a Dockerfile with all the ClojisR dependencies + user-guide. This will enable users to quickly get started with using the library without worrying about the environment setup. (Inspired by Carsten Behring&rsquo;s <a href="https://cljdoc.org/d/clj-py-r-template/clj-template/1.1.0/doc/readme">Template for creating Clojure DS projects with  R + Python</a>)</li>
<li>Performed testing on the <a href="https://github.com/scicloj/clojisr">ClojisR</a> library and conveyed the issues discovered to the main authors. These discussions helped fix a few problems in the library.</li>
</ul>
<h2 id="ongoing-tasks">Ongoing tasks:</h2>
<ul>
<li><a href="https://github.com/scicloj/tablecloth/pull/22">Tablecloth: Cloning functionality</a>: Implementing cloning by default for all instances of reader in Tablecloth. This is a part of our effort to create better ergonomics for array programming in Clojure.</li>
<li>Adapting the Tablecloth API so that more functions will have options map for future configurability, while respecting backward compatibility.</li>
</ul>
<h2 id="upcoming-tasks">Upcoming tasks:</h2>
<ul>
<li>Complete the ongoing tasks in Tablecloth.</li>
<li>Implement the relevant sections of <a href="https://r4ds.had.co.nz/explore-intro.html">R4DS</a> using ClojisR.</li>
</ul>
<h3 id="february-15-28-3"><strong>February 15-28</strong></h3>
<p>Currently, our main focus is to help different Clojure data science libraries to bring R like functionality by filling in the missing gaps.</p>
<h2 id="completed-tasks-1">Completed tasks:</h2>
<ul>
<li><a href="https://github.com/scicloj/tablecloth/pull/22">Tablecloth</a>:
<ul>
<li>Cloning functionality - Implemented cloning by default for computation-intensive functions involving readers in Tablecloth. This is a part of our effort to create better ergonomics for array programming in Clojure.</li>
<li>Adapted the Tablecloth API so that more functions will have options map for future configurability, while respecting backward compatibility.</li>
<li>Added Midje unit tests for the functions which were updated while adding the above functionalities.</li>
</ul>
</li>
<li><a href="https://github.com/ashimapanjwani/r-for-data-science-in-clojure/pull/3">ClojisR tutorials</a>:
Translated the code samples from the following chapters of <a href="https://r4ds.had.co.nz/index.html">R4DS</a> using <a href="https://github.com/scicloj/clojisr">ClojisR</a>.
<ul>
<li>Data visualisation</li>
<li>Data transformation</li>
<li>Exploratory Data Analysis</li>
</ul>
</li>
<li>Tested the usage of <a href="https://github.com/scicloj/notespace">Notespace</a> from Docker and discussed the issues encountered with the library authors.</li>
<li>Added the functionality to <a href="https://github.com/scicloj/tablecloth/pull/26">specify the datatype while adding column</a> in Tablecloth.</li>
</ul>
<h2 id="upcoming-tasks-1">Upcoming tasks:</h2>
<ul>
<li>Translate the Predictive Machine Learning Models section of R4DS using libraries such as <a href="https://github.com/techascent/tech.ml">tech.ml</a> and <a href="https://github.com/scicloj/metamorph.ml">metamorph.ml</a>.</li>
<li>Implement the <a href="https://r4ds.had.co.nz/wrangle-intro.html">data wrangling</a> section of R4DS using ClojisR.</li>
<li>Open github issues for any problems encountered during the above translation, discuss with the library maintainers, and try to come up with fixes.</li>
<li>Continue our effort to create better ergonomics for array programming in Clojure.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together board nominations and annual members meeting</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-board-nominations-and-annual-members-meeting/</link>
      <pubDate>Wed, 03 Mar 2021 07:00:00 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-board-nominations-and-annual-members-meeting/</guid>
      <description>Stand for the upcoming Clojurists Together board elections</description>
      <content:encoded><![CDATA[<p>Clojurists Together is having our first board elections <a href="/news/2020/announcing-clojurists-together-foundation">since we formed</a> a standalone 501(c)6 organisation, and our first annual members meeting.</p>
<h3 id="key-dates">Key dates</h3>
<ul>
<li>Board nominations close: March 31st, 2021</li>
<li>Voting opens: a few days after submissions close and the board has nominated candidates</li>
<li>Voting closes: April 18th, 2021</li>
<li>Annual members meeting: <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+annual+members+meeting&amp;iso=20210429T16&amp;p1=%3A&amp;ah=1">9am Pacific time, April 29th, 2021</a></li>
</ul>
<h3 id="board-elections">Board Elections</h3>
<p>As part of our commitment to <a href="/transparency/">transparency</a> and community governance, Clojurists Together holds elections for board members. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors.</p>
<p>Committee members are elected for a two-year term. Each election cycle, half of our board seats come up for re-election. This year there are four seats available.</p>
<p>If you are interested in standing for election, please fill out this <a href="https://docs.google.com/forms/d/e/1FAIpQLSd08O4XVHiDl2P2ZsZKvigFj4wwSKRRS7970h69ED9rSozKsQ/viewform">form</a> by <strong>midnight end-of-day March 31st, 2021 Pacific Time</strong>. If you can&rsquo;t access the form, <a href="/contact/">contact us</a>, and we can accept your nomination by email. Nominations are open to anyone, you don&rsquo;t have to be a Clojurists Together member to stand for election. Our bylaws do require you to be a member if elected to the board, though we provide a stipend which offsets the cost of your membership.</p>
<p>You don&rsquo;t have to have lots of experience with Clojure to apply. We want a committee made up of a cross-section of the Clojure community so that we have a wide range of perspectives when making decisions on which projects to fund.</p>
<p>As part of the nomination, if we get more than 12 candidates for board membership, the board will nominate no more than 12 candidates. Our bylaws state:</p>
<blockquote>
<p>The Board shall nominate no more than 12 candidates seeking board membership in any given election. In nominating candidates for Director positions and in choosing the number of candidates to nominate overall, the Board shall use reasonable efforts to maintain a Board composition consisting of at least: (1) 25% female Directors, (2) 25% non-Caucasian Directors, and (3) 35% from any category(ies) of persons (e.g., race, gender, ability) commonly considered to have suffered from discrimination at some time and then-currently under-represented in the technology industry, in each case as determined by the Board in its reasonable discretion.</p>
</blockquote>
<p>The main responsibilites of a committee member are:</p>
<ul>
<li>Participate in the general discussions of the month-to-month running of the program</li>
<li>Evaluate and vote on which open source projects to fund</li>
<li>Help in decision making for the future plans of Clojurists Together</li>
</ul>
<p>These responsibilities take roughly one hour/month, though there are peaks and troughs of activity as we go through our quarterly funding cycle. If you have more time to offer, there are lots more things that need developing, automating, designing, e.t.c. It would be great to have you help out with those things, but we don&rsquo;t want to exclude people from standing because they don&rsquo;t have a lot of spare time.</p>
<p>Our bylaws requires that we do not have more than two committee members from any one company. More than two people from a company can stand for election, but if more than two of these people were to be elected, only the top two ranked candidates would be elected and the other seats would go to the next most highly ranked candidates from other companies. If you have any questions about this, please get in touch.</p>
<p>Elections will be held once the candidates are announced, and all Clojurists Together members will be eligible to vote.</p>
<h3 id="annual-members-meeting">Annual Members Meeting</h3>
<p>We are also holding our first ever members meeting at <a href="https://www.timeanddate.com/worldclock/fixedtime.html?msg=Clojurists+Together+annual+members+meeting&amp;iso=20210429T16&amp;p1=%3A&amp;ah=1">9am Pacific time, April 29th, 2021</a>. This will be an opportunity for Clojurists Together to talk about how things have been going, share information on our future plans, present the new board members, and most importantly take questions from members.</p>
<p>More details on this will follow including a videoconferencing link.</p>
<p>Please share this with anyone you think would be able to represent the interests of the Clojure community and Clojurists Together members. Thanks for your support of Clojurists Together, we appreciate it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>January 2021 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/january-2021-monthly-update/</link>
      <pubDate>Sun, 28 Feb 2021 08:40:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/january-2021-monthly-update/</guid>
      <description>Read more updates from Clj-kondo/babashka/sci, ClojisR, O’Doyle Rules, and Calva</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s the latest updates from the projects in January. This was the first month for ClojisR.</p>
<h1 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h1>
<h3 id="january-1-15"><strong>January 1-15</strong></h3>
<p>Here is an overview of the work I did per project.</p>
<h2 id="babashka">Babashka</h2>
<ul>
<li>Only build static binary on non-SNAPSHOT release <a href="https://github.com/babashka/babashka/issues/695">#695</a></li>
<li>Migration from borkdude/babashka to babashka/babashka</li>
<li>Babashka pods: write to output before delivering result <a href="https://github.com/babashka/pods/commit/0bffce3573d0361cf2592d65cefc8a4048454ff9">commit</a></li>
<li><a href="https://github.com/babashka/pod-babashka-aws">pod-babashka aws</a>: a new pod to interact with AWS</li>
<li>Add <code>pp</code> macro from <code>clojure.pprint</code> <a href="https://github.com/babashka/babashka/issues/707">#707</a></li>
<li>Add <code>--download-dir</code> option to install script <a href="https://github.com/babashka/babashka/issues/688">#688</a></li>
</ul>
<h2 id="sci">Sci</h2>
<ul>
<li>defrecord <code>type</code> improvements <a href="https://github.com/borkdude/sci/issues/492">#492</a></li>
<li>conditionally defined vars should not have metadata <a href="https://github.com/borkdude/sci/issues/496">#496</a></li>
<li>experiment with using sci and pgx to create postgres extension <a href="https://github.com/borkdude/sci/issues/373">#373</a>. Also see the <a href="https://github.com/borkdude/plsci">repo</a>.</li>
<li>Fix shadow warnings #499</li>
<li>Several performance improvements</li>
</ul>
<h2 id="clj-kondo">Clj-kondo</h2>
<ul>
<li>Review PR <a href="https://github.com/borkdude/clj-kondo/pull/1108#issuecomment-753454914">#1108</a>: add local analysis to clj-kondo</li>
<li>Move to clj-kondo/clj-kondo organisation</li>
<li>Fix local analysis name <a href="https://github.com/clj-kondo/clj-kondo/issues/1112">#1112</a></li>
<li>Research for clj-kondo resolve from other namespace, work in progress.</li>
<li>Fix finding without location info <a href="https://github.com/clj-kondo/clj-kondo/issues/1101">#1101</a></li>
<li>Alpine Docker build <a href="https://github.com/clj-kondo/clj-kondo/issues/1111">#1111</a></li>
<li>Review several PRs</li>
</ul>
<h2 id="misc">Misc</h2>
<ul>
<li>First release (0.0.1-0.0.3) of the <a href="https://github.com/borkdude/puget-cli">puget</a> CLI, a binary to pipe EDN to and get pprinted and colorize output.</li>
<li>First release of <a href="https://github.com/borkdude/carve/issues/35">Carve</a> as a binary.</li>
</ul>
<h3 id="january-16-31"><strong>January 16-31</strong></h3>
<h2 id="babashka-1">Babashka</h2>
<ul>
<li>spartan.spec: fix compatibility with expound. See <a href="https://github.com/borkdude/spartan.spec#example">example</a>.</li>
<li>spartan.spec: fix compatibility with cli-matic. See <a href="https://github.com/borkdude/spartan.spec/issues/13">issue</a>.</li>
<li>interop on map returns nil. <a href="https://github.com/babashka/babashka/issues/711">#711</a></li>
<li><code>(instance? clojure.lang.Fn x)</code> now works</li>
<li>Release 0.2.7</li>
<li>pod-babashka-aws: fix problem with <code>nil</code> in response <a href="https://github.com/babashka/pod-babashka-aws/issues/27">#27</a></li>
<li>babashka-sql-pods: upgrade to newest next.jdbc version <a href="https://github.com/babashka/babashka-sql-pods/issues/18">#18</a></li>
<li>spartan.spec: fix s/and + s/cat <a href="https://github.com/borkdude/spartan.spec/issues/15">#15</a></li>
<li>Include <a href="https://github.com/clojure/core.match">clojure.core.match</a> <a href="https://github.com/babashka/babashka/issues/594">#594</a></li>
<li>Include <a href="https://github.com/weavejester/hiccup">hiccup</a> <a href="https://github.com/babashka/babashka/issues/646">#646</a></li>
<li>Include <a href="https://github.com/clojure/test.check">clojure.test.check</a> <a href="https://github.com/babashka/babashka/issues/487">#487</a>. Included namespaces:
<ul>
<li>clojure.test.check</li>
<li>clojure.test.check.generators</li>
<li>clojure.test.check.properties</li>
</ul>
</li>
</ul>
<h2 id="sci-1">Sci</h2>
<ul>
<li>Unroll local binding calls <a href="https://github.com/borkdude/sci/issues/502">#502</a></li>
<li>Unroll local binding ref <a href="https://github.com/borkdude/sci/issues/504">#504</a></li>
<li><code>alength</code> doesn&rsquo;t work with GraalVM <a href="https://github.com/borkdude/sci/issues/507">#507</a></li>
<li>Release <a href="https://github.com/borkdude/sci/blob/master/CHANGELOG.md#v021">0.2.1</a></li>
<li>Prioritize current namespace in syntax quote <a href="https://github.com/borkdude/sci/issues/509">#509</a></li>
<li>Faster processing of colls <a href="https://github.com/borkdude/sci/issues/482">#482</a></li>
<li>Fix destructuring of destructuring in protocol method of record <a href="https://github.com/borkdude/sci/issues/512">#512</a></li>
<li>Fix shadowing of record field in protocol method <a href="https://github.com/borkdude/sci/issues/513">#513</a></li>
</ul>
<h2 id="clj-kondo-1">Clj-kondo</h2>
<ul>
<li>New linter: <code>:unresolved-var</code>. This detects unresolved vars in other namespaces, like <code>set/onion</code>. See <a href="https://github.com/clj-kondo/clj-kondo/blob/master/doc/linters.md#unresolved-var">docs</a>. <a href="https://github.com/clj-kondo/clj-kondo/issues/635">#635</a></li>
<li>Derive file path from only file linted <a href="https://github.com/clj-kondo/clj-kondo/issues/1135">#1135</a></li>
<li>Fix finding without location info <a href="https://github.com/clj-kondo/clj-kondo/issues/1101">#1101</a></li>
<li>Derive config dir from only file path linted <a href="https://github.com/clj-kondo/clj-kondo/issues/1135">#1135</a></li>
<li>Support name in defmethod fn-tail <a href="https://github.com/clj-kondo/clj-kondo/issues/1115">#1115</a></li>
<li>Avoid crash when using <code>:refer-clojure</code> + <code>:only</code> <a href="https://github.com/clj-kondo/clj-kondo/issues/957">#957</a></li>
<li>Release v2021.01.20</li>
</ul>
<h1 id="odoyle-rules">O’Doyle Rules</h1>
<h3 id="january-1-15-1"><strong>January 1-15</strong></h3>
<p>In the past few weeks I tried finding the low-hanging fruit to improve performance. I did this with the help of the excellent <a href="https://github.com/clojure-goes-fast/clj-async-profiler">clj-async-profiler</a>. I also tried a few ideas that ultimately didn&rsquo;t pan out:</p>
<ol>
<li>Running <code>:when</code> conditions earlier in the network. In theory, this could reduce unnecessary work by discarding invalid facts sooner. In practice, it didn&rsquo;t affect the benchmarks at all, and the code was really convoluted. So much for that.</li>
<li>Storing matches as records instead of hash maps. In theory, this could boost performance because records have faster field access than hash maps. In practice, the benchmarks actually got a bit slower! I still haven&rsquo;t figured out exactly why, but it at least indicates that field access isn&rsquo;t a bottleneck.</li>
</ol>
<p>With the micro-optimizations out of the way, the next few weeks will be all about improving perf with the RETE algorithm itself. GOTTA GO FAST.</p>
<h3 id="january-16-31-1"><strong>January 16-31</strong></h3>
<p>I shed a lot of blood, sweat, and parenthesis to implement a common optimization called &ldquo;node sharing&rdquo;. Rules that pulled in similar data now could share nodes internally, avoiding duplicated effort. Then, just as I was about to cut a release, I had an epiphany: &ldquo;derived facts&rdquo; give us the same benefits as node sharing!</p>
<p>I wrote a <a href="https://github.com/oakes/odoyle-rules#performance">section in the README</a> about how to use derived facts in this way. When I applied this technique to the &ldquo;dungeon&rdquo; benchmark, it went from ~1700 ms to ~1100 ms &ndash; an even better improvement than from node sharing. The <a href="https://github.com/oakes/play-cljc-examples/tree/master/dungeon-crawler">dungeon crawler game</a> improved by 5 FPS with the same technique.</p>
<p>I ended up deleting a few hundred lines of fresh code &ndash; no need to complicate the codebase if we can just leverage an existing feature instead. I&rsquo;m now going to focus on debugging and inspecting sessions. Can we do better than the almighty <code>println</code>? Probably not, but no harm in trying&hellip;</p>
<h1 id="calva">Calva</h1>
<h3 id="january-1-15-2"><strong>January 1-15</strong></h3>
<p>I&rsquo;ve done some work in both Calva and Clojure-lsp.</p>
<h2 id="calva-work">Calva Work</h2>
<p>Calva now uses clj-kondo via clojure-lsp, and no longer bundles the clj-kondo extension. This reduces Calva&rsquo;s indirect memory footprint as opposed to the previous setup of using clojure-lsp and the clj-kondo extension, since the clj-kondo extension runs its own LSP server, which is no longer necessary.</p>
<p>My co-maintainer Peter also did quite a bit of work recently. Below is a list of Calva changes in the last couple weeks.</p>
<h3 id="20151---2021-01-15">[2.0.151] - 2021-01-15</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/947">Debugger is broken on Windows</a></li>
</ul>
<h3 id="20150---2021-01-13">[2.0.150] - 2021-01-13</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/868">Stop bundling clj-kondo in favor of using it through clojure-lsp</a></li>
</ul>
<h3 id="20149---2021-01-12">[2.0.149] - 2021-01-12</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/933">calva.jackInEnv does not resolve <code>${env:...}</code></a></li>
<li>Update clojure-lsp to version 2021.01.12-02.18.26. Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/906">clojure-lsp processes left running/orphaned if VS Code is closed while the lsp server is starting</a></li>
</ul>
<h3 id="20148---2021-01-07">[2.0.148] - 2021-01-07</h3>
<ul>
<li>Update clojure-lsp to version 2021.01.07-20.02.02</li>
</ul>
<h3 id="20147---2021-01-07">[2.0.147] - 2021-01-07</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/908">Dimming ignored forms does not work correctly with metadata</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/913">Improve clojure-lsp jar integration</a></li>
<li>Update clojure-lsp to version 2021.01.07-12.28.44</li>
</ul>
<h3 id="20146---2021-01-04">[2.0.146] - 2021-01-04</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/883">Slurp forward sometimes joins forms to one</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/906">clojure-lsp processes left running/orphaned if VS Code is closed while the lsp server is starting</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/884">go to definition jumps to inc instead of inc'</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/888">Error when start a REPL with jdk15</a></li>
</ul>
<h3 id="20145---2021-01-03">[2.0.145] - 2021-01-03</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/920">Add command for opening the file for the output/repl window namespace</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/922">Add setting for auto opening the repl window on Jack-in/Connect</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/923">Add setting for auto opening the Jack-in Terminal</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/923">Replace opening Calva says on start w/ info message box</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/923">Add command for opening Calva documentation</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/923">Change default keyboard shortcut for syncing the repl window ns to <code>ctrl+alt+c n</code></a></li>
</ul>
<h3 id="20144---2021-01-01">[2.0.144] - 2021-01-01</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/915">Reactivate definitions/navigation in core and library files</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/910">Make load-file available in the output window</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/904">Make the ns in the repl prompt a peekable symbol</a></li>
</ul>
<h2 id="clojure-lsp-work">Clojure-lsp Work</h2>
<p>I added a change to Clojure-lsp to prevent the process from being orphaned. If VS Code was killed in a certain time window while Clojure-lsp was initializing, the process would be left running. Now Clojure-lsp periodically checks if the parent process is alive and will exit if not. This is a suggested feature of servers by the language server protocol.</p>
<p>I also fixed an issue with the default classpath lookup for Windows.</p>
<ul>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/pull/241">Fix classpath-cmd modification for Windows</a></li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/pull/251">Prevent orphaned server processes</a></li>
</ul>
<h3 id="january-16-31-2"><strong>January 16-31</strong></h3>
<p>For decorating functions instrumented for debugging, I&rsquo;ve replaced the usage of clj-kondo with clojure-lsp, as well as restructured the code to make the feature work a bit better. This allowed us to remove clj-kondo as an injected jack-in dependency.</p>
<p>I&rsquo;ve also changed the way clojure-lsp initialization progress is shown. Instead of a popup progress indicator, progress is now shown in the bottom status bar, and disappears when initialization is complete.</p>
<p>I&rsquo;ve also helped with finding and debugging issues and testing fixes in Clojure-lsp after some significant changes were released. Much thanks to Eric Dallo for being very active, responding to and fixing issues that arise.</p>
<h2 id="calva-changes">Calva Changes</h2>
<h3 id="20156---2021-01-28">[2.0.156] - 2021-01-28</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/969">Debug instrumentation decoration not working correctly anymore on Windows</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/976">Debugger decorations issues</a></li>
</ul>
<h3 id="20155---2021-01-27">[2.0.155] - 2021-01-27</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/989">Make command palette show alt+enter shortcut variant instead of enter for evaluating top level form</a></li>
<li>Update clojure-lsp to 2021.01.28-03.03.16</li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/901">nrepl port detection race condition</a></li>
</ul>
<h3 id="20154---2021-01-27">[2.0.154] - 2021-01-27</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/971">Calva uses ; for comments instead of ;;</a></li>
<li>Update cider-nrepl to 0.25.8</li>
<li>Update clojure-lsp to 2021.01.26-22.35.27</li>
</ul>
<h3 id="20153---2021-01-19">[2.0.153] - 2021-01-19</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/974">Use status bar message instead of withProgress message for clojure-lsp initialization</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/973">Update cider-nrepl: 0.25.6 -&gt; 0.25.7</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/958">&ldquo;Extract function&rdquo; refactoring doesn&rsquo;t work as expected with selections</a></li>
</ul>
<h3 id="20152---2021-01-19">[2.0.152] - 2021-01-19</h3>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/959">Jack-In env with non-string variables fails</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/931">Use clojure-lsp for usages for debug instrumentation decorations, and stop injecting clj-kondo at jack-in</a></li>
</ul>
<h1 id="clojisr">ClojisR</h1>
<h3 id="january-1-15-3"><strong>January 1-15</strong></h3>
<h2 id="project-goals">Project Goals:</h2>
<ul>
<li>Creating good documentation and beginner-friendly tutorials for <a href="https://github.com/scicloj/clojisr">ClojisR</a> (a wrapper library exposing APIs for calling R functions on R objects in Clojure), thereby allowing us to expose the Clojure data science ecosystem to a diverse group of users, especially data scientists studying R as their main language.</li>
<li>Comparing R and Clojure ecosystems to push the Clojure data science stack forward.
<ul>
<li>figuring out the differences and helping bring the missing functionalities to Clojure</li>
<li>creating documentation that explains how R functionality and idioms can be achieved in Clojure</li>
</ul>
</li>
<li>Bringing the ClojisR library to a more complete and stable state.</li>
</ul>
<h2 id="completed-tasks">Completed tasks:</h2>
<ul>
<li><a href="https://github.com/ashimapanjwani/r-for-data-science-in-clojure/pull/1">#1</a> Used a wide range of Clojure data science libraries (mainly Tablecloth, tech.ml.dataset, dtype-next, ClojisR, Vega+Hanami, Fastmath, Notespace) to translate code samples under the Data Wrangling section of <a href="https://r4ds.had.co.nz/wrangle-intro.html">R4DS</a> covering the following topics:
<ul>
<li>Tibbles (Dataframes)</li>
<li>Data import</li>
<li>Tidy data</li>
<li>Relational data</li>
<li>Strings</li>
<li>Dates and times</li>
</ul>
</li>
<li>The above translation allowed us to compare the current Clojure data science ecosystem with the R ecosystem and helped us figure out the functionality which was missing and the features which could be made more user-friendly. These points were discussed with the relevant library authors (mainly Tablecloth, ClojisR, Notespace, dtype-next) and various GitHub issues were opened for feature requests as well as bug fixes.
<ul>
<li><a href="https://github.com/cnuernber/dtype-next/issues/9">dtype-next : human readable datetime</a></li>
<li><a href="https://github.com/scicloj/tablecloth/issues/12">tablecloth: view each column&rsquo;s datatype below the column name</a></li>
<li><a href="https://github.com/scicloj/tablecloth/issues/13">tablecloth: Simplify access to row values in adjacent columns</a></li>
<li><a href="https://github.com/scicloj/tablecloth/issues/14">tablecloth: Update documentation</a></li>
<li><a href="https://github.com/scicloj/tablecloth/issues/15">tablecloth: (repeatedly rand) is running indefinitely despite other columns being finite in a dataset</a></li>
<li><a href="https://github.com/scicloj/notespace/issues/54">notespace: Ability to view the entire dataset in a scrollable format</a></li>
</ul>
</li>
</ul>
<h2 id="upcoming-tasks">Upcoming tasks:</h2>
<ul>
<li>Translate the Data Visualization, Data Transformation, and Exploratory Data Analysis sections of R4DS to Clojure using libraries such as Tablecloth, Vega+Hanami, Fastmath, and dtype-next.</li>
<li>Implement the relevant sections of R4DS using ClojisR in order to compare Clojure-R interop vs native Clojure functionality.</li>
<li>Maybe translate the Predictive Machine Learning Models section of R4DS. (Note: Throughout my work, I’m maintaining a continuous dialogue with some of the relevant library authors. The order in which I approach these tasks may depend upon related developments in other libraries such as <a href="">tech.ml</a> (for machine learning))</li>
</ul>
<h3 id="january-16-31-3"><strong>January 16-31</strong></h3>
<p>Currently, our main focus is to help different Clojure data science libraries to bring R like functionality by filling in the missing gaps.</p>
<h2 id="completed-tasks-1">Completed tasks:</h2>
<ul>
<li><a href="https://github.com/ashimapanjwani/r-for-data-science-in-clojure/pull/2">#2</a> Used a wide range of Clojure data science libraries (mainly Vega+Hanami, Tablecloth, tech.ml.dataset, dtype-next, Fastmath, Notespace) to translate code samples under the Data Exploration section of <a href="https://r4ds.had.co.nz/explore-intro.html">R4DS</a> covering the following topics:
<ul>
<li>Data Visualization</li>
<li>Data Transformation</li>
<li>Exploratory Data Analysis</li>
</ul>
</li>
<li>Raised the following PRs to add functionality/fix issues:
<ul>
<li>tech.ml.dataset: <a href="https://github.com/ashimapanjwani/tech.ml.dataset/pull/1">show or hide column&rsquo;s datatype in a dataset</a></li>
<li>tech.ml.dataset: <a href="https://github.com/ashimapanjwani/tech.ml.dataset/pull/2">functionality to print all the rows of a dataset</a></li>
<li>tech.ml.dataset: <a href="https://github.com/ashimapanjwani/tech.ml.dataset/pull/3">created convenience functions for varying printing behavior</a></li>
<li>tablecloth: <a href="https://github.com/ashimapanjwani/tablecloth/pull/1">updated documentation</a></li>
<li>tablecloth: <a href="https://github.com/ashimapanjwani/tablecloth/pull/2">renamed functions used to add/replace columns</a></li>
<li>dtype-next: <a href="https://github.com/ashimapanjwani/dtype-next/pull/1">cleanup column printing</a></li>
</ul>
</li>
</ul>
<h2 id="upcoming-tasks-1">Upcoming tasks:</h2>
<ul>
<li>Implement the relevant sections of R4DS using ClojisR.</li>
<li>Figure out how to bring some of R&rsquo;s main ideas of working with vectors to Clojure by creating better ergonomics for array programming.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>December 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/december-2020-monthly-update/</link>
      <pubDate>Sun, 28 Feb 2021 08:30:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/december-2020-monthly-update/</guid>
      <description>Read more updates from Clj-kondo/babashka/sci, ClojisR, O’Doyle Rules, and Calva</description>
      <content:encoded><![CDATA[<p>Happy (belated) New Year everyone! Here are the updates from our <a href="https://www.clojuriststogether.org/news/q4-2020-funding-announcement">new projects</a>.</p>
<h1 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h1>
<h3 id="december-1-15"><strong>December 1-15</strong></h3>
<h3 id="babashka">Babashka</h3>
<ul>
<li>Babashka <a href="https://github.com/borkdude/babashka/blob/master/doc/news.md">news</a> page</li>
<li>Released <a href="https://github.com/babashka/process">babashka/process</a> to clojars: <a href="https://clojars.org/babashka/process">https://clojars.org/babashka/process</a></li>
<li>Released <a href="https://github.com/borkdude/babashka.curl">babashka/babashka.curl</a> to clojars <a href="https://clojars.org/babashka/babashka.curl">https://clojars.org/babashka/babashka.curl</a></li>
<li>Held talk on <a href="https://youtu.be/pgNp4Lk3gf0">babashka and sci internals</a></li>
<li>Made 3 week survey and made data <a href="https://nl.surveymonkey.com/results/SM-8W8V36DZ7/">available</a></li>
<li>Moved most of README docs to <a href="https://book.babashka.org/">book.babashka.org</a></li>
<li>Expose <code>get-classpath</code> and <code>split-classpath</code> fns in <code>babashka.classpath</code> <a href="https://github.com/borkdude/babashka/issues/670">#670</a></li>
<li>Expose <code>add-deps</code> in <code>babashka.deps</code> <a href="https://github.com/borkdude/babashka/issues/677">#677</a>. See <a href="https://book.babashka.org/master.html#_add_deps">docs</a>.</li>
<li>Expose <code>clojure</code> in <code>babashka.deps</code> <a href="https://github.com/borkdude/babashka/issues/678">#678</a>. See <a href="https://book.babashka.org/master.html#_clojure">docs</a>.</li>
<li>Implement <code>--clojure</code> option to invoke a JVM clojure process similar to the official Clojure CLI.</li>
<li>Upgrade to GraalVM 20.3.0 <a href="https://github.com/borkdude/babashka/issues/653">#653</a></li>
</ul>
<h3 id="sci">Sci</h3>
<ul>
<li>Add syntax checks to sci binding macro <a href="https://github.com/borkdude/sci/issues/458">#458</a></li>
<li>Add option to disable arity checks <a href="https://github.com/borkdude/sci/issues/460">#460</a></li>
</ul>
<h3 id="clj-kondo">Clj-kondo</h3>
<ul>
<li>Documentation: a list of all available <a href="https://github.com/borkdude/clj-kondo/blob/master/doc/linters.md">linters</a> <a href="https://github.com/borkdude/clj-kondo/issues/936">#936</a></li>
<li>Lint protocol and interface implementations in <code>deftype</code> and <code>defrecord</code> <a href="https://github.com/borkdude/clj-kondo/issues/140">#140</a>s</li>
<li>Upgrade to GraalVM 20.3.0 <a href="https://github.com/borkdude/clj-kondo/issues/1085">#1085</a></li>
<li>Fix analysis for cljs.core simple-benchmark <a href="https://github.com/borkdude/clj-kondo/issues/1079">#1079</a></li>
<li>Support babashka.process $ macro syntax <a href="https://github.com/borkdude/clj-kondo/issues/1089">#1089</a></li>
<li>Fix recur arity in doysync <a href="https://github.com/borkdude/clj-kondo/issues/1081">#1081</a></li>
<li>Alias linter doesn&rsquo;t recognize (quote alias) form <a href="https://github.com/borkdude/clj-kondo/issues/1074">#1074</a></li>
<li>Fix retries for refer :all when linting in parallel <a href="https://github.com/borkdude/clj-kondo/issues/1068">#1068</a></li>
<li>Improve analyzing syntax of <code>amap</code> <a href="https://github.com/borkdude/clj-kondo/issues/1069">#1069</a></li>
<li>Namespaced map in deps.edn causes false positive <a href="https://github.com/borkdude/clj-kondo/issues/1093">#1093</a></li>
<li>Support ignore hints in <code>deps.edn</code> <a href="https://github.com/borkdude/clj-kondo/issues/1094">#1094</a></li>
<li>Fix unsorted namespaces linter for nested libspecs <a href="https://github.com/borkdude/clj-kondo/issues/1097">#1097</a></li>
<li>Fix recur arity in doysync <a href="https://github.com/borkdude/clj-kondo/issues/1081">#1081</a></li>
<li>Released v2020.12.12</li>
</ul>
<h3 id="misc">Misc</h3>
<ul>
<li>deps.clj 0.0.11 <a href="https://github.com/borkdude/deps.clj/releases/tag/v0.0.11">released</a>: catching up with clojure 1.10.1.763</li>
</ul>
<h3 id="december-16-31"><strong>December 16-31</strong></h3>
<h3 id="babashka-1">Babashka</h3>
<ul>
<li>Buddy pod <a href="https://github.com/babashka/pod-babashka-buddy">https://github.com/babashka/pod-babashka-buddy</a></li>
<li>Etaoin pod 0.0.1 release <a href="https://github.com/babashka/pod-babashka-etaoin">https://github.com/babashka/pod-babashka-etaoin</a></li>
<li>Pod registry <a href="https://github.com/babashka/pod-registry">https://github.com/babashka/pod-registry</a></li>
<li>Fswatcher pod <a href="https://github.com/babashka/pod-babashka-fswatcher">https://github.com/babashka/pod-babashka-fswatcher</a></li>
<li>Fix issue with unzipping nested directory <a href="https://github.com/babashka/pod-registry/issues/4">babashka/pod-registry#4</a></li>
<li>Sqlite3 pod <a href="https://github.com/babashka/pod-babashka-sqlite3">https://github.com/babashka/pod-babashka-sqlite3</a></li>
</ul>
<h3 id="sci-1">Sci</h3>
<ul>
<li>Detect macro var as val at analysis time <a href="https://github.com/borkdude/sci/issues/467">#467</a></li>
<li>Restructure namespace for #417-related refactoring <a href="https://github.com/borkdude/sci/issues/468">#468</a></li>
<li>Optimization for <code>let</code> <a href="https://github.com/borkdude/sci/issues/470">#470</a>, <a href="https://github.com/borkdude/sci/issues/478">#478</a></li>
<li>Optimization for <code>if</code> <a href="https://github.com/borkdude/sci/issues/472">#472</a></li>
<li>Excluded clojure var in macro still gets resolved to in syntax quote <a href="https://github.com/borkdude/sci/issues/466">#466</a></li>
<li>Optimization for ctx <a href="https://github.com/borkdude/sci/pull/473">#473</a></li>
<li>Optimization for fns <a href="https://github.com/borkdude/sci/issues/475">#475</a></li>
<li>Add <code>with-local-vars</code> <a href="https://github.com/borkdude/sci/issues/383">#383</a></li>
<li>Release 0.2.0: <a href="https://github.com/borkdude/sci/blob/master/CHANGELOG.md#v020">https://github.com/borkdude/sci/blob/master/CHANGELOG.md#v020</a></li>
<li>Optimization for vars that are inlined in clojure <a href="https://github.com/borkdude/sci/issues/483">#483</a></li>
<li>Only add location metadata to seqs and symbols <a href="https://github.com/borkdude/sci/issues/488">#488</a></li>
<li>Inline edamame opts / get rid of end-line and end-column <a href="https://github.com/borkdude/sci/issues/490">#490</a></li>
</ul>
<h3 id="clj-kondo-1">Clj-kondo</h3>
<ul>
<li>Fix NPE in VSCode plugin <a href="https://github.com/borkdude/clj-kondo.lsp/issues/12">#12</a></li>
</ul>
<h3 id="misc-1">Misc</h3>
<ul>
<li>Edamame (parser lib for sci): handle whitespace after read-cond splice <a href="https://github.com/borkdude/edamame/issues/71">#71</a></li>
<li>Edamame: add <code>location?</code> predicate <a href="https://github.com/borkdude/edamame/issues/72">#72</a></li>
<li>Edamame: fix for auto-resolved map and current namespace <a href="https://github.com/borkdude/edamame/issues/74">#74</a></li>
<li>Report number of arguments used in <code>assoc</code> over a large body of source code <a href="https://gist.github.com/borkdude/e6f0b12f9352f3375e5f3277d2aba6c9">https://gist.github.com/borkdude/e6f0b12f9352f3375e5f3277d2aba6c9</a> as investigation for <a href="https://clojure.atlassian.net/browse/CLJ-1656">https://clojure.atlassian.net/browse/CLJ-1656</a>.</li>
<li>Edamame: make end locations optional <a href="https://github.com/borkdude/edamame/issues/75">#75</a></li>
<li>Depstar: fix for Windows <a href="https://github.com/seancorfield/depstar/issues/57">#57</a></li>
</ul>
<h1 id="odoyle-rules">O’Doyle Rules</h1>
<h3 id="december-1-15-1"><strong>December 1-15</strong></h3>
<p>I released version 0.5.0 of O&rsquo;Doyle Rules with two new features that make it rule even more:</p>
<ul>
<li>An easy way to request all facts in a session via <code>(query-all session)</code>, mainly intended for serialization. You can parse them later and re-insert them into your session.</li>
<li>A new block type called <code>:then-finally</code>, which lets you react to insertions <em>and</em> retractions that affect a rule&rsquo;s matches. This is vital for creating &ldquo;derived facts&rdquo; that accumulate other facts &ndash; which is my equivalent to Clara&rsquo;s <a href="https://www.clara-rules.org/docs/accumulators/">accumulators</a>.</li>
</ul>
<p>You can read more in the <a href="https://github.com/oakes/odoyle-rules/releases/tag/0.5.0">release notes</a>.</p>
<p>I also added several benchmarks to the repo. One of them is code extracted from my <a href="https://github.com/oakes/play-cljc-examples/tree/master/dungeon-crawler">dungeon crawler</a> test game. Some of the benchmarks are also implemented with Clara and DataScript to compare performance. I will soon be putting a lot of focus on performance so these will help. GOTTA GO FAST, as Ricky Bobby once said.</p>
<h3 id="december-16-31-1"><strong>December 16-31</strong></h3>
<p>I released version 0.6.0 with a new feature that makes it possible for rules to build recursive data structures similar to what you&rsquo;d get from &ldquo;pull&rdquo; queries in DataScript or Datomic. See the <a href="https://github.com/oakes/odoyle-rules/releases/tag/0.6.0">release notes</a> for more. Using O&rsquo;Doyle in this way is somewhat advanced and hard to explain briefly, so to go along with the release I wrote a more in-depth explanation: <a href="https://github.com/oakes/odoyle-rules/blob/master/bench-src/todos/README.md">Using O&rsquo;Doyle Rules as a poor man&rsquo;s DataScript</a>.</p>
<p>Next month will be focused on performance. There&rsquo;s a lot of low-hanging fruit from the RETE literature that I still need to steal, such as &ldquo;node sharing&rdquo;. When they make a movie about this, there&rsquo;ll be a scene where my character is deep in the stacks of an old library, dusting off CS papers and scrolling through microfilm to find the lost gems of early rules engine research.</p>
<p>It won&rsquo;t be true, but it&rsquo;ll be a cool scene.</p>
<h1 id="calva">Calva</h1>
<h3 id="december-1-15-2"><strong>December 1-15</strong></h3>
<p>This first couple of weeks involved information gathering on the Language Server Protocol in general and clojure-lsp, specifically, and how to integrate it with VS Code and Calva. Fortunately, the initial integration had been started on a branch by Kevin Ahlbrecht and Peter Strömberg.</p>
<p>Below is a list of work that has been done in the last couple of weeks. Some features in clojure-lsp have been disabled in favor of Calva&rsquo;s functionality, at least for now, because Calva&rsquo;s similar functionality is either more mature at this time, or there is work required to make the two feature sets work well together. The initial goal is to publish a release with clojure-lsp early, disabling anything that might cause issues for now, while providing features Calva was lacking. The disabled features may receive work later in order to integrate them.</p>
<ul>
<li>Figured out how to trace LSP messages and added a Calva setting for enabling this.</li>
<li>Submitted a <a href="https://github.com/microsoft/language-server-protocol-inspector/pull/59">PR to Microsoft&rsquo;s language-server-protocol-inspector</a> to fix an issue with running this project locally. The inspector helps more easily sort through LSP messages.</li>
<li>Made a change to clojure-lsp to <a href="https://github.com/snoe/clojure-lsp/pull/197">make references code lens work</a></li>
<li>Added a command to Calva to make references code lens work. When references code lenses are clicked, a peek definitions window opens.</li>
<li>Added a Calva setting to enable references code lens</li>
<li>Disabled Calva&rsquo;s Clojure definition provider in favor of clojure-lsp&rsquo;s</li>
<li>Disabled clojure-lsp&rsquo;s diagnostics in favor of clj-kondo&rsquo;s, which we bundle with Calva</li>
<li>Disabled clojure-lsp&rsquo;s hover provider in favor of Calva&rsquo;s</li>
<li>Disabled clojure-lsp&rsquo;s completion provider in favor of Calva&rsquo;s</li>
<li>Fixed an issue in clojure-lsp to <a href="https://github.com/snoe/clojure-lsp/pull/200">prevent negative numbers in ranges</a></li>
</ul>
<p>A development version (vsix) was sent to the #calva channel of the Clojurians slack for testing of the above changes, and I plan to release the changes soon and then continue work on some things that have been disabled, and/or on <a href="https://github.com/snoe/clojure-lsp#extra-capabilities">extra capabilities</a> clojure-lsp can provide.</p>
<h3 id="version-20134-was-released">Version 2.0.134 Was Released</h3>
<p>This includes a couple of small fixes for things I noticed while developing.</p>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/856">Live share jackout error</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/846">Cannot read property &lsquo;document&rsquo; of undefined</a></li>
</ul>
<h3 id="december-16-31-2"><strong>December 16-31</strong></h3>
<p>Calva&rsquo;s clojure-lsp integration <a href="https://clojureverse.org/t/calva-gets-static-analysis-features-via-clojure-lsp/6939">has been released</a> as of version 2.0.137. See the ClojureVerse post for details.</p>
<h3 id="clojure-lsp-work">Clojure-lsp Work</h3>
<p>Contributing to clojure-lsp is important to improving Calva, and I expect to be doing more of this in the future. Below are changes I made or helped with.</p>
<ul>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/pull/226">Fix jar file URIs to be compatible with both Windows and Unix</a></li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/pull/207">Add initialization options that allow disabling formatting providers</a></li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/pull/212">Fix go id for documentHighlight</a></li>
<li><a href="https://github.com/clojure-lsp/clojure-lsp/pull/211">Fix duplicated usages/references for cljc files</a></li>
</ul>
<h3 id="calva-work">Calva Work</h3>
<p>Peter Strömberg and myself have been quite active lately, and Eric Dallo has been a tremendous help with clojure-lsp fixes, PR reviews, ideas, etc. Peter added refactoring commands that utilize clojure-lsp&rsquo;s refactorings as well as updated the docs to <a href="https://calva.io/clojure-lsp/">explain clojure-lsp in Calva</a> and the <a href="https://calva.io/refactoring/">refactoring commands</a>. Below is a list of recent Calva changes.</p>
<h4 id="20135">2.0.135</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/863">Binding keys to REPL functions, passing the namespace and cursor line (Notespace integration)</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/875">Make REPL prompt submit if the cursor is after the top level form</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/878">Only print stacktrace on demand</a></li>
</ul>
<h4 id="20136">2.0.136</h4>
<ul>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/885">Jack-in/Connect prompts sometimes not showing on Windows</a></li>
</ul>
<h4 id="20137">2.0.137</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/572">Bring in clojure-lsp</a></li>
</ul>
<h4 id="20138">2.0.138</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/890">Bring in refactorings we get access to via clojure-lsp</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/892">Add ”clojure-lsp starting” progress indicator</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/893">Fix step into local dep with debugger</a></li>
</ul>
<h4 id="20139">2.0.139</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/654">Use Pseudo Terminal instead of Task for Jack-in</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/897">Prefer cider-nrepl symbol definitions over clojure-lsp</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/898">Enable clojure-lsp completion items when no nrepl connection</a></li>
</ul>
<h4 id="20140">2.0.140</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/899">Make Jack-in dependency versions configurable (and bump &lsquo;em all with default settings)</a></li>
</ul>
<h4 id="20141">2.0.141</h4>
<ul>
<li>Update clojure-lsp to include <a href="https://github.com/clojure-lsp/clojure-lsp/issues/223">jar dependency navigation fix for Windows</a></li>
<li>Fix: <a href="https://github.com/BetterThanTomorrow/calva/issues/911">clojure-lsp refactorings not working on Windows</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/815">Remove default key binding for toggling Calva key bindings</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/904">Make load-file available in the output window</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/904">Make the ns in the repl prompt a peekable symbol</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>November 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/november-2020-monthly-update/</link>
      <pubDate>Thu, 03 Dec 2020 09:58:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/november-2020-monthly-update/</guid>
      <description>Read more updates from Malli, Practicalli, Clj-kondo/babashka/sci, and Datahike</description>
      <content:encoded><![CDATA[<p>Welcome to the final (half) month of updates from our Q3 projects. Our <a href="/news/q4-2020-funding-announcement/">Q4 projects</a> have started this month and will continue through to February.</p>
<h1 id="malli">Malli</h1>
<h3 id="november-1-15"><strong>November 1-15</strong></h3>
<h3 id="done-stuff">Done stuff</h3>
<ul>
<li><a href="https://github.com/metosin/malli/pull/295">#295</a> - fix set explain</li>
<li><a href="https://github.com/metosin/malli/pull/298">#298</a> - fast schema creation</li>
<li><a href="https://github.com/metosin/malli/pull/303">#303</a> - Schemas know th IntoSchema that created it</li>
</ul>
<h3 id="ongoing">Ongoing</h3>
<ul>
<li>working with Functional Schema Bundle (much bigger than expected):
<ul>
<li>full clj-kondo integration: <a href="https://github.com/metosin/malli/issues/268">https://github.com/metosin/malli/issues/268</a></li>
<li>support schema defn syntax: <a href="https://github.com/metosin/malli/issues/125">https://github.com/metosin/malli/issues/125</a></li>
<li>sequence/regex schemas: <a href="https://github.com/metosin/malli/issues/180">https://github.com/metosin/malli/issues/180</a></li>
</ul>
</li>
</ul>
<img src="https://user-images.githubusercontent.com/567532/99222308-f5869300-27ea-11eb-864c-a70c4e4b017a.png">  
<h4 id="misc">Misc</h4>
<ul>
<li>the three months is over! started bit late, so will continue to work to get the Ongoing (more) done.
Already happy with the results, the main goal was to ship the lib. Couldn&rsquo;t have done that without Clojurists Together funding.</li>
</ul>
<h1 id="practicalli">Practicalli</h1>
<h3 id="november-1-15-1"><strong>November 1-15</strong></h3>
<p>A range of updates, new content and tool reviews and testing.  <a href="https://twitter.com/practical_li/status/1327671242388893697">Reviewed 75 solutions for 44 students on Exercism.io</a> over the last two week, adding that advice and code walk-throughs to the Practicalli Clojure book.</p>
<p>Several high-quality REPL driven development videos will be released soon, awaiting some final editing and post processing.</p>
<h3 id="practicalli-study-group">Practicalli Study Group</h3>
<p>Continued solving Exercism.io challenges for the Live broadcasts, with a request to specifically do the Spiral Matrix challenge</p>
<ul>
<li><a href="https://youtu.be/7-LCVAtkP9o">090 - Code challenges - Exercism.io Space-Age challenge</a></li>
<li><a href="https://youtu.be/Z5C7X1UN8yo">091 - Code challenges - Exercism.io Spiral Matrix challenge</a></li>
</ul>
<h3 id="practicalli-clojure">Practicalli Clojure</h3>
<p>Add <a href="https://spacevim.org/">SpaceVim</a> to Clojure Editors in book now the Clojure command line bug is fixed.  Continued adding REPL driven development approaches to solving Exercism.io challenges.</p>
<p>Launch Portal data navigator with any REPL using <code>:env/dev</code> and <code>:inspect/portal-cli</code> aliases. The REPL automatically evaluates the <code>dev/user.clj</code> source code file to require portal, open the portal window and add portal as a <code>tap&gt;</code> source</p>
<p>+<strong>New sections</strong></p>
<ul>
<li><a href="http://practicalli.github.io/clojure/coding-challenges/exercism/bob.html">Exercism.io bob challenge</a> - walking through two alternative solutions</li>
<li><a href="http://practicalli.github.io/clojure/clojure-editors/editor-install-guides/spacevim-fireplace.html">SpaceVim and vim-fireplace install guide</a> - including clj-kondo</li>
<li><a href="http://practicalli.github.io/clojure/clojure-editors/editor-user-guides/spacevim-fireplace.html">SpaceVim and vim-fireplace user guide</a> - a quick guide to get started.</li>
</ul>
<p><strong>Updated</strong></p>
<ul>
<li><a href="http://practicalli.github.io/clojure/clojure-tools/data-browsers/portal.html#starting-portal-on-repl-startup">Portal - auto-start portal on REPL startup</a></li>
<li><a href="http://practicalli.github.io/clojure/continuous-integration/circle-ci/">Clojure CLI tools version used with CircleCI</a> and updating scripts to use latest Clojure CLI tools release and -M flag with aliases.</li>
<li><a href="https://practicalli.github.io/clojure/clojure-tools/data-browsers/reveal.html">nrepl and cider aliase</a> for the Reveal data visualization tool</li>
</ul>
<h3 id="practicalli-clojure-deps-edn">Practicalli clojure-deps-edn</h3>
<p>Updates and fixes to the user level configuration for Clojure CLI projects.  Added clj-kondo as a GitHub action to lint all pull requests and commits, ensuring aliases are in a good state.</p>
<ul>
<li><a href="https://github.com/practicalli/clojure-deps-edn#alternative-repls">Alternative REPLs</a>: socket server and prepl aliases</li>
<li><code>:inspect/reveal-nrepl</code> to run an nREPL server with Reveal data visualization</li>
<li><code>:inspect/reveal-light-nrepl</code> a light theme version with a 32 point Ubuntu Mono font useful for demos and HiDPI screens</li>
<li><code>:inspect/reveal-nrepl-cider</code> CIDER specific libraries and middleware configuration with <code>:inspect/reveal-light-nrepl-cider</code> as a light version</li>
<li><code>:test/cognitect-precompile</code> alias to compile tests before running Cognitect Labs test runner</li>
<li><a href="https://github.com/practicalli/clojure-deps-edn/blob/live/CHANGELOG.org#2020-11-08">Monthly update of library versions</a> for all aliases using <code>:project/outdated</code> alias</li>
<li><code>community/zulip-event</code> to <a href="https://github.com/practicalli/clojure-deps-edn#community-activities">add community event to zulip chat</a></li>
<li><code>test/cloverage</code> add clojure exec options for cloverage (#8)</li>
<li><code>:inspect/reveal-nrepl</code> and <code>:inspect/reveal-light-nrepl</code> Cider specific aliases for Reveal data browser</li>
</ul>
<h3 id="practicalli-data-science">Practicalli Data Science</h3>
<p>Created a new (alpha state) book to provide practical guides to using Clojure tools and libraries to build applications in a data science context.  Working with the <a href="https://scicloj.github.io/">SciCloj community</a> to raise awareness of what is possible in this space and as I grow my understanding it will be captured in the Practicalli Data Science book.</p>
<ul>
<li><a href="https://practicalli.github.io/data-science/notebooks/notespace/">Notespace section</a> - created <a href="https://github.com/practicalli/scicloj-notespace-simple-demo">a simple demo of the Notespace data science journal tool</a> for Clojure, combined with Portal to help browse large data sets.</li>
</ul>
<h3 id="practicalli-clojurescript">Practicalli ClojureScript</h3>
<p>Updated to new Practicalli theme and put all project content first, moving overview and design content to the reference section.  The book will focus on figwheel-main, reagent and ClojureScript for the next quarter.</p>
<h3 id="practicalli-spacemacs">Practicalli Spacemacs</h3>
<p>Update <a href="https://practicalli.github.io/spacemacs/documentation/cider-doc.html">Clojure documentation section</a> to show Clojure and <a href="https://practicalli.github.io/spacemacs/documentation/javadoc.html">Java documentation</a> functions, including how to navigate to source code and specifications from help.</p>
<h4 id="hacking-cider">Hacking CIDER</h4>
<ul>
<li><a href="https://github.com/clojure-emacs/cider/pull/2926">PR #2926</a> - Tip to evaluate namespace before documentation lookup - added to Practicalli Spacemacs instead.</li>
</ul>
<h1 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h1>
<h3 id="november-1-15-2"><strong>November 1-15</strong></h3>
<h1 id="clojurists-together-project-update-q3-2020-november-1-15">Clojurists Together Project Update Q3 2020 November 1-15</h1>
<p>Here is an overview of the work I did per project.</p>
<h3 id="babashka">Babashka</h3>
<ul>
<li>Can&rsquo;t call symbol literal <a href="https://github.com/borkdude/babashka/issues/622">#622</a></li>
<li>Expose <code>clojure.pprint/simple-dispatch</code> <a href="https://github.com/borkdude/babashka/issues/627">#627</a></li>
<li>Random number stream doesn&rsquo;t work <a href="https://github.com/borkdude/babashka/issues/630">#630</a></li>
<li>:or in destructuring broken for false case <a href="https://github.com/borkdude/babashka/issues/632">#632</a></li>
</ul>
<h3 id="sci">Sci</h3>
<ul>
<li>Support nested libspecs <a href="https://github.com/borkdude/sci/issues/399">#399</a></li>
<li>Allow names of vars when def is allowed <a href="https://github.com/borkdude/sci/issues/434">#434</a></li>
<li>Allow aliases in protocol fn impls <a href="https://github.com/borkdude/sci/issues/440">#440</a></li>
<li>Allow overriding :line metadata <a href="https://github.com/borkdude/sci/issues/443">#443</a></li>
</ul>
<h3 id="clj-kondo">Clj-kondo</h3>
<ul>
<li>Lint deps.edn <a href="https://github.com/borkdude/clj-kondo/issues/945">#945</a></li>
<li>Export and import config via classpath <a href="https://github.com/borkdude/clj-kondo/issues/559">#559</a>, <a href="https://github.com/clj-kondo/config/issues/1">clj-kondo/confi
g#1</a></li>
<li>Cache jar analysis <a href="https://github.com/borkdude/clj-kondo/issues/705">#705</a></li>
<li>Fix index out of bounds exception <a href="https://github.com/borkdude/clj-kondo.lsp/issues/11">clj-kondo.lsp#11</a></li>
<li>Better resolving of vars referred with <code>:all</code> <a href="https://github.com/borkdude/clj-kondo/issues/1010">#1010</a></li>
<li>Implement <code>:include</code> option for shadowed-var linter <a href="https://github.com/borkdude/clj-kondo/issues/1040">#1040</a></li>
<li>Mark generated nodes to avoid redundant dos and lets despite location metadata
<a href="https://github.com/borkdude/clj-kondo/issues/1059">#1059</a></li>
<li>Fix number of retries when linting in parallel <a href="https://github.com/borkdude/clj-kondo/issues/1068">#1068</a></li>
</ul>
<h4 id="misc-1">Misc</h4>
<ul>
<li><a href="https://github.com/borkdude/grasp">Grasp</a>: a new tool to grep Clojure code
using clojure.spec! It uses sci under the hood.</li>
<li><a href="https://github.com/borkdude/edamame/issues/5">https://github.com/borkdude/edamame/issues/5</a></li>
<li><a href="https://github.com/borkdude/edamame/issues/66">https://github.com/borkdude/edamame/issues/66</a></li>
<li><a href="https://clojure.atlassian.net/browse/TRDR-63">https://clojure.atlassian.net/browse/TRDR-63</a></li>
</ul>
<h1 id="datahike">Datahike</h1>
<h3 id="november-1-15-3"><strong>November 1-15</strong></h3>
<p>The last iteration was focused on reviews and testing of the tuple feature as well as the last adjustments for the Datomic compatibility.</p>
<h3 id="datomic-compatibility">Datomic Compatibility</h3>
<p>Datomic API compatibility was finished up with more tests and the <code>listen</code> functionality that allows for callbacks on each transaction. Finally these features were merged with the <a href="https://github.com/replikativ/datahike/pull/240">PR #240</a>.</p>
<h3 id="tuple-support">Tuple Support</h3>
<p>Tests were added for the different tuple types with the open <a href="https://github.com/replikativ/datahike/pull/251">PR #251</a> ready to review.
We planned to finish this up in the upcoming days for the release of 0.3.3 of Datahike.</p>
<h3 id="release-033-candidate">Release 0.3.3 Candidate</h3>
<p>Since Datahike was extended with multiple new features a new release candidate was defined. It will include the following features:</p>
<ul>
<li>Support for tuples (#104)</li>
<li>Switch to Clojure CLI tools (#253)</li>
<li>Adapt API namespace for Datomic compatibility (#196)</li>
<li>Implement query with string (#196)</li>
<li>Implement transact with lazy sequence (#151, #78, #196)</li>
</ul>
<p>After the review of the last PRs a release is planned within the next week.</p>
<h3 id="beyond-clojurists-together-tasks">Beyond Clojurists Together Tasks</h3>
<p>We started working on a <a href="https://github.com/replikativ/datahike-client">remote client</a> for <a href="https://github.com/replikativ/datahike-server">datahike-server</a>. For the server we are now looking into a JSON API that would allow other programming languages to use Datahike.</p>
<p>The ClojureScript port is moving forward focussing on the transactor and query engine.</p>
<p>The <a href="https://github.com/replikativ/datahike/pull/201">upsert feature</a> had to be adjusted and is now benchmarked in order to see which functions take most of the performance.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q4 2020 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q4-2020-funding-announcement/</link>
      <pubDate>Mon, 30 Nov 2020 19:29:54 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q4-2020-funding-announcement/</guid>
      <description>Clojurists Together is funding clj-kondo, ClojisR, O&amp;rsquo;Doyle Rules, and Calva $9,000 each.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q4 of 2020 (December-February) we are funding four projects for $9,000 each:</p>
<ul>
<li><a href="https://github.com/borkdude/clj-kondo">clj-kondo</a>/<a href="https://github.com/borkdude/babashka">babashka</a>/<a href="https://github.com/borkdude/sci">sci</a> with Michiel Borkent</li>
<li><a href="https://github.com/scicloj/clojisr">ClojisR</a> with Ashima Panjwani</li>
<li><a href="https://github.com/oakes/odoyle-rules">O&rsquo;Doyle Rules</a> with Zach Oakes</li>
<li><a href="https://github.com/BetterThanTomorrow/calva">Calva</a> with Brandon Ringe</li>
</ul>
<h2 id="clj-kondo">Clj-kondo</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding">What are you wanting to achieve with this funding?</h3>
<p><strong>Clj-kondo</strong></p>
<ul>
<li>Documentation of all available linters and options</li>
<li>Warn on usage of non-existing vars in required namespaces</li>
<li>Skip already linted gitlibs</li>
<li>Type warning improvements</li>
<li>Dozens of small enhancements: warn on nested function literals, discarded constants/pure expressions, &hellip;</li>
<li>Binary release of carve, a project based on clj-kondo for removing unused vars</li>
</ul>
<p><strong>Babashka</strong></p>
<ul>
<li>babashka.edn project file: a file that describes paths, deps and possible pods that are used in a babashka project</li>
<li>easier installation of pods</li>
<li>babashka.fs: utility namespace with file-related functions</li>
<li>Windows test suite</li>
</ul>
<p><strong>Sci</strong></p>
<ul>
<li>Performance improvements (<a href="https://github.com/borkdude/sci/issues?q=is%3Aissue+is%3Aopen+label%3Aperformance">https://github.com/borkdude/sci/issues?q=is%3Aissue+is%3Aopen+label%3Aperformance</a>)</li>
<li>Add support for <em>print-fn</em> (CLJS)</li>
<li>Smaller sci CLJS builds by configuration</li>
</ul>
<h3 id="why-is-this-project-important-to-the-clojure-community">Why is this project important to the Clojure community?</h3>
<p>Clj-kondo is a Clojure linter that is used by a <a href="https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md">wide variety of individual users
and companies</a>.</p>
<p>Babashka is a scripting environment that can execute a significant subset of JVM
Clojure programs with instant startup. It is used by <a href="https://github.com/borkdude/babashka/issues/254">individual users and
companies</a>. It is currently my
project with the most stars on Github.</p>
<p>Sci is the Clojure interpreter <a href="https://github.com/borkdude/sci#projects-using-sci">powering babashka and several other projects</a>.</p>
<h2 id="clojisr">ClojisR</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-1">What are you wanting to achieve with this funding?</h3>
<p>ClojisR library seeks to combine Clojure&rsquo;s unique approach towards data exploration with R&rsquo;s huge collection of data visualization and statistical libraries.</p>
<p>I’ll be working in collaboration with the main authors (Tomasz Sulej and Daniel Slutsky) of this library to contribute to it with the objective of easing the onboarding experience for developers starting out with ClojisR, thereby helping to increase the popularity and adoption of Clojure.</p>
<p>During the project, we plan to focus on the following tasks:</p>
<ul>
<li>So far, the authors of ClojisR have been focused mainly on building the core functionalities of the library, thus leaving a few missing gaps in terms of good documentation and tutorials showcasing demo examples with detailed explanations. Therefore, preparing entry-level documentation for the library, including basic use cases and showing interop with tech.ml.dataset/tablecloth (maybe libpython-clj) + highly developed notebook solutions (saite/hanami, oz, gorilla) are some of the issues that need to be worked on.</li>
<li>Currently, there are minimal test-cases leading to issues related to broken releases. Hence, I’ll be working on building test suites, starting from building test-cases for the most important parts of the library.</li>
<li>There’s a need for comprehensive ML / Stats workflows with code examples and good documentation, especially for newer users to refer to. I’ll be working on that as well.</li>
<li>Enhance the library by wrapping chosen R packages from ML / Stats areas (scope to be defined with the help of the authors)</li>
<li>Assist the core team by helping with bug fixing and development of the library</li>
<li>(optional) Translate select Kaggle ML kernels</li>
</ul>
<p>As guidance, we will be using the R4DS book for which we have already received permission from the authors and publisher.</p>
<h3 id="why-is-this-project-important-to-the-clojure-community-1">Why is this project important to the Clojure community?</h3>
<p>The purpose of this project is to take an active part in improving Clojure&rsquo;s data science stack, especially in aspects of usability, user-facing features, and documentation.</p>
<p>A large part of that effort is happening in the Scicloj community (<a href="https://scicloj.github.io/">https://scicloj.github.io/</a>) with which this project is associated.</p>
<p>The work that we’ll be doing with this funding will enable us to get closer to our goal of making Clojure a beginner-friendly solution for data science, thereby allowing us to expose the Clojure ecosystem to a different culture and to more diverse groups of users/programmers - starting with new developers and data scientists studying R as their main language.</p>
<p>I am a user of ClojisR and previously contributed to the library’s documentation by creating tutorials that introduced first-time users to some of the features offered by this library. I am collaborating with the main authors of Clojisr (Tomasz Sulej and Daniel Slutsky), and we are planning this project together.</p>
<h2 id="odoyle-rules">O&rsquo;Doyle Rules</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-2">What are you wanting to achieve with this funding?</h3>
<p>I have a short term and long term plan.</p>
<p>In the short term, I want to improve o&rsquo;doyle to match the performance and feature set of clara rules. I have a lot of ideas on the perf front, and features i want to add include:</p>
<ol>
<li>Serialization - saving a session (or at least its facts) to a string so it can be read later with edn/read-string</li>
<li>Debugging - adding a mechanism to trace facts and determine why a rule didn&rsquo;t fire</li>
</ol>
<p>My long term plan is completely speculative and not something I&rsquo;ll accomplish in the three months I&rsquo;m funded, but I believe rules engines are the key to creating a &ldquo;generalized React&rdquo; in pure clojure.</p>
<p>By that I mean a library that can completely replace React to drive front end UIs, but also be used in other contexts such as non-browser UIs (e.g. JavaFX), games, or non-UI business logic (where rules engines are mostly used today).</p>
<p>In that way, your entire application can be made out of the same &ldquo;stuff&rdquo; from one end to the other; state on the frontend and backend could be managed with the same rules engine and even share rules/facts.</p>
<h3 id="why-is-this-project-important-to-the-clojure-community-2">Why is this project important to the Clojure community?</h3>
<p>Clojure needs another good rules engine. Clara is great but the lack of ability to update facts makes it difficult to use outside of &ldquo;pure&rdquo; logic problems. O&rsquo;Doyle implements the same RETE algorithm but makes it more useful for general purpose &ldquo;messy&rdquo; use cases like managing the state of a frontend app or a game. And i also have more speculative ideas (see above) that could either be amazing or crash and burn into a pit of failure &ndash; and those are the only ideas i want to try!</p>
<h2 id="calva">Calva</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-3">What are you wanting to achieve with this funding?</h3>
<p>I am looking at adding static analysis via clojure-lsp. This will have a large impact on Calva&rsquo;s users and also lays the foundation for future improvements, if it goes as we expect.</p>
<p>To expand on the above, adding static analysis will hopefully allow us to add features (without repl dependencies) like:</p>
<ul>
<li>Find references/usages</li>
<li>Intellisense</li>
<li>Sorting ns requires</li>
</ul>
<p>In addition to adding static analysis support, I&rsquo;ll be working on bug fixes or documentation as necessary. Also, we think we can reduce our repl dependencies which are injected at Calva&rsquo;s jack-in, resulting in smoother experience for developers and maintainers.</p>
<h3 id="why-is-this-project-important-to-the-clojure-community-3">Why is this project important to the Clojure community?</h3>
<p>We&rsquo;ve seen that Calva helps new Clojurists get up and running with Clojure without having to worry so much about tooling. Perhaps more importantly, VS Code has become such a major platform for developers and it&rsquo;s important to have Clojure(Script) support in the developers' editor of choice.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>October 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/october-2020-monthly-update/</link>
      <pubDate>Wed, 04 Nov 2020 12:00:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2020-monthly-update/</guid>
      <description>Read more updates from Malli, Practicalli, Clj-kondo/babashka/sci, and Datahike</description>
      <content:encoded><![CDATA[<p>Here are the updates from our <a href="/news/q3-2020-funding-announcement/">Q3 projects</a>. They are finishing in the middle of November, so there will be one more short update next month. Don&rsquo;t forget that applications are open for our <a href="/news/q3-2020-survey-results/">next funding round</a>, apply today!.</p>
<h1 id="malli">Malli</h1>
<h3 id="october-1-15"><strong>October 1-15</strong></h3>
<p>Alpha is out, FINALLY: <a href="https://twitter.com/ikitommi/status/1314254607846191104">https://twitter.com/ikitommi/status/1314254607846191104</a></p>
<h3 id="done-stuff">Done stuff</h3>
<ul>
<li><a href="https://github.com/metosin/malli/pull/266">#265</a> - fix sequential explain</li>
<li><a href="https://github.com/metosin/malli/pull/272">#272</a> - big bowl of stuff in, shipping the alpha out</li>
<li><a href="https://github.com/metosin/malli/pull/277">#276</a> - explicitly disabling sci &amp; sci options</li>
<li><a href="https://github.com/metosin/malli/pull/278">#278</a> - better configuration for default-value-transformer</li>
<li>Wrote a blog post: <a href="https://www.metosin.fi/blog/malli/">https://www.metosin.fi/blog/malli/</a></li>
</ul>
<h3 id="ongoing">Ongoing</h3>
<ul>
<li>working on <a href="https://github.com/metosin/malli/issues/217">declarative utils for schemas</a>, fixes also <a href="https://github.com/metosin/malli/issues/281">#281</a></li>
</ul>
<h4 id="misc">Misc</h4>
<p>4 weeks to go. Will focus on solving real-world issues that people face when adopting the library, update the libs using Malli and try to get some of the larger issues solved.</p>
<h3 id="october-16-31"><strong>October 16-31</strong></h3>
<p>Fixing things of the alpha, helping people adopting, small stuff.</p>
<h3 id="done-stuff-1">Done stuff</h3>
<ul>
<li><a href="https://github.com/metosin/malli/pull/282">#282</a> - revisited how references work and how <code>malli.util</code> work with them.</li>
<li><a href="https://github.com/metosin/malli/pull/283">#283</a> - declarative schema transformations</li>
<li><a href="https://github.com/metosin/malli/pull/289">#289</a> - fix :sequential decoding with empty sequence</li>
<li>Adopted <a href="https://github.com/metosin/reitit">reitit</a> to use malli, with 3 patch releases <code>0.5.8</code>, <code>0.5.9</code> &amp; <code>0.5.10</code></li>
</ul>
<h3 id="ongoing-1">Ongoing</h3>
<ul>
<li>helping people adopt malli, small fixes and examples</li>
<li>design and prototyping on the Functional Schema Bundle (much bigger than expected):
<ul>
<li>full clj-kondo integration: <a href="https://github.com/metosin/malli/issues/268">https://github.com/metosin/malli/issues/268</a></li>
<li>support schema defn syntax: <a href="https://github.com/metosin/malli/issues/125">https://github.com/metosin/malli/issues/125</a></li>
<li>sequence/regex schemas: <a href="https://github.com/metosin/malli/issues/180">https://github.com/metosin/malli/issues/180</a></li>
</ul>
</li>
</ul>
<h4 id="misc-1">Misc</h4>
<p>no misc now.</p>
<h1 id="practicalli">Practicalli</h1>
<h3 id="october-1-15-1"><strong>October 1-15</strong></h3>
<p>Creating more <a href="https://www.youtube.com/playlist?list=PLpr9V-R8ZxiB3u90ga_SdxYsF2k2JTag1">recorded video content around REPL driven development</a> of high quality, improving speed of editing with Blender.org as well as better script writing and delivery practice.</p>
<p>Represented Clojure at the JVMWars 2020 online meetup, giving <a href="https://docs.google.com/presentation/d/e/2PACX-1vR3jDNOaYoAQRUQcCm9NccXY-dNxr5JT5LfURqujAVp23dohoYKLH9BHGlFgdQjKrLKnNKkraeRbKzA/pub?start=false&amp;loop=false&amp;delayms=3000">a short presentation</a> which included <a href="https://youtu.be/rQ802kSaip4">a brief demo of REPL driven development</a>.</p>
<h3 id="practicalli-study-group">Practicalli Study Group</h3>
<p>Refactored the data-access code into <code>practicalli.data.*</code> namespaces to make each namespace have a specific aim. Identified generic functions to reduce repetition in the code.</p>
<p>Added unit test fixture (setup/teardown) to create and delete the H2 database on the fly, using functions in the <code>handler-helper</code> namespace.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Ro_h5jt02Q0&amp;list=PLpr9V-R8ZxiDjyU7cQYWOEFBDR1t7t0wv&amp;index=89">086 - Banking On Clojure - Part7 - Refactor data-access namespaces and fix the build on CircleCI</a></li>
</ul>
<h3 id="practicalli-clojure">Practicalli Clojure</h3>
<p>New sections and Pages:</p>
<ul>
<li><a href="https://practicalli.github.io/clojure/testing/unit-testing/test-selectors.html">Unit testing selectors</a></li>
<li><a href="https://practicalli.github.io/clojure/testing/unit-testing/fixtures.html">Unit testing fixtures</a></li>
</ul>
<p>New page on the use of test selectors to organise tests and run test suites more effectively.  Included examples for LambdaIsland kaocha, Spacemacs, Cider and Cognitect labs test runners.</p>
<p>New page on fixtures for unit tests, with example fixture functions and configuration on when to run fixtures for testing.</p>
<h3 id="screencasts">Screencasts</h3>
<ul>
<li><a href="https://www.youtube.com/watch?v=U19TWMsg0s0&amp;list=PLpr9V-R8ZxiB3u90ga_SdxYsF2k2JTag1&amp;index=1">Clojure REPL driven development with Rebel Readline</a></li>
<li><a href="https://www.youtube.com/watch?v=7muHVkxzZcE&amp;list=PLpr9V-R8ZxiB3u90ga_SdxYsF2k2JTag1&amp;index=2">Clojure projects with the REPL</a></li>
<li><a href="https://youtu.be/rQ802kSaip4">Clojure REPL driven development - a simple example</a></li>
</ul>
<p>Updated <a href="https://practicalli.github.io/clojure/alternative-tools/clojure-tools/cognitect-rebl.html">Cognitect REBL install procedure</a>, local maven install no longer required.</p>
<p>Updated <a href="https://gist.github.com/jr0cket/6c475137ee57fbb14f9289bd76889512">Conjure configuration</a> and documentation</p>
<h3 id="screencast-video-editing">Screencast Video Editing</h3>
<p>Learned how to <a href="https://www.youtube.com/playlist?list=PLxdnSsBqCrrG9vYaQMDE0A16c4M52b7vJ">use Blender.org for Video editing</a> which proved to be much more efficient that previous tools used.  This will help produce a higher quality of videos for the new series on Clojure CLI tools and REPL driven development.</p>
<h3 id="practicalli-clojure-depsedn-configuration">Practicalli Clojure deps.edn configuration</h3>
<p>Minor updates to the practicalli/clojure-deps-edn user level configuration for Clojure CLI tools.  This configuration is also recommended by <a href="https://github.com/seancorfield/dot-clojure">seancorfield/dot-clojure</a> personal configuration</p>
<ul>
<li>inspect/rebl - link added to updated install requirements</li>
<li>updated library versions for: clj-new and depstar update</li>
<li>title and alias sub-section in mini table of contents</li>
<li>merge project related aliases into one section</li>
</ul>
<h3 id="practicalli-spacemacs">Practicalli Spacemacs</h3>
<p>Changes to the <a href="https://github.com/practicalli/spacemacs.d/">practicalli/spacemacs.d</a> configuration for Spacemacs.</p>
<ul>
<li>renamed Git branch to <a href="https://github.com/practicalli/spacemacs.d/">live</a> (update your remote urls)</li>
<li>recommending Emacs 27.1 as its the current stable version and it supports ligatures (stylized character pairs).</li>
<li>added unicode ligature support (no need for ligature configuration in dotspacemacs/user-config as it built into the unicode layer)</li>
<li>Switched to using Fira code font as this has ligature support</li>
<li>Updated the doom modeline theme for a  nice minimal look without loosing any important information</li>
<li>Added font rendering optimizations</li>
</ul>
<p>Several custom snippets added to the <a href="https://github.com/practicalli/spacemacs.d/">practicalli/spacemacs.d</a>: deprecated and design journal banners, rich code block with clj-kondo ignore duplicate</p>
<h3 id="october-16-31-1"><strong>October 16-31</strong></h3>
<p>A range of updates, new content and tool reviews and testing.  <a href="https://exercism.io/profiles/Practicalli">Helping lots of students on Exercism</a> in the last week.</p>
<h3 id="practicalli-study-group-1">Practicalli Study Group</h3>
<p>Getting back to some important basics of Clojure, walking through several Exercism.io coding challenges (to support mentoring efforts there).</p>
<ul>
<li><a href="https://youtu.be/QKBZYSITkRc">089 - Code challenges - Regular Expressions to solve Bob challenge on Exercism.io</a></li>
<li><a href="https://youtu.be/91wrchRjdtg">088 - Code challenges - Encoding and decoding</a></li>
<li><a href="https://youtu.be/u5VoFpsntXc">087 - Clojure CLI tools - Practicalli Clojure deps.edn configuration and a tour of community tools</a></li>
</ul>
<h3 id="practicalli-clojure-1">Practicalli Clojure</h3>
<p>Reviewed the Introduction and Getting Started sections, improving the flow and providing a solid introduction to Clojure.</p>
<p>New sections</p>
<ul>
<li><a href="http://practicalli.github.io/clojure/clojure-tools/using-clojure-tools.html">Using Clojure CLI tools - common tasks</a> - with accompanying broadcast</li>
<li><a href="https://practicalli.github.io/clojure/clojure-tools/install/community-tools.html">Community Tools</a> providing a detailed guide to tools built on Clojure CLI.</li>
<li><a href="https://practicalli.github.io/clojure/clojure-tools/install/code-analysis.html">Code Analysis</a> - install and configuring clj-kondo</li>
<li><a href="https://practicalli.github.io/clojure/clojure-editors/editor-install-guides/neovim-conjure.html">Neovim and Conjure install guide</a></li>
<li><a href="https://practicalli.github.io/clojure/clojure-editors/editor-user-guides/neovim-conjure.html">Neovim and Conjure user guide</a></li>
</ul>
<p>Updated <a href="http://practicalli.github.io/clojure/testing/integration-testing/circle-ci/">Clojure CLI tools version used with CircleCI</a> and updating scripts to use -M flag with aliases.</p>
<p>Evaluated <a href="https://spacevim.org/">Spacevim</a> to see if it should be added to the <a href="https://practicalli.github.io/clojure/clojure-editors/">recommended Clojure aware editors</a>.  An issue was found running the Clojure CLI tools REPL on Linux, along with a quick fix.  Although the configuration of vim packages is excellent and a very impressive overall experience. the Clojure environment is very basic and would welcome modernizing.  Ideally adding <a href="https://github.com/Olical/conjure">Conjure</a> to SpaceVim would produce an excellent development experience.</p>
<h3 id="practicalli-clojure-deps-edn">Practicalli clojure-deps-edn</h3>
<p>Updates and fixes to the user level configuration for Clojure CLI projects</p>
<ul>
<li>Add <code>:middleware/cider-clj</code> and <code>:middleware/cider-clj-refactor</code> aliases to allow connections to a running REPL from Cider (and should also work for Calva).</li>
<li>practicalli/live middleware/clojure-clj-refactor: add documentation</li>
<li>Clojure CLI config precedence - added graphic</li>
<li>Added Common development tasks</li>
<li>kaocha test runner: fix for 1.0.700 release</li>
<li>Update group-id of <code>deps-deploy</code> (#3)</li>
</ul>
<h3 id="practicalli-spacemacs-1">Practicalli Spacemacs</h3>
<p>New content:</p>
<ul>
<li><a href="https://practicalli.github.io/spacemacs/testing/unit-testing/running-tests.html#using-test-selectors-to-run-specific-tests">Running specific test groups with test selectors</a></li>
</ul>
<p>Updated content:</p>
<ul>
<li><a href="https://practicalli.github.io/spacemacs/install-spacemacs/line-numbers.html">Line numbers - visual, relative and absolute styles</a></li>
<li><a href="https://practicalli.github.io/spacemacs/spacemacs-basics/working-with-projects/searching-projects.html">Repeating searches and scrolling through search pattern history</a></li>
</ul>
<h4 id="cider-issue">Cider issue</h4>
<p>Investigated bug with Emacs Cider and the new Clojure CLI tools <code>-M</code> alias flag.  Cider modeled Clojure CLI tools support on the approach for Leiningen and this resulted in the -A alias flag occurring out of position.  The clojure command does work this way, only since the <code>-M</code> flag has been introduced that the issue became visible.  The fix organises the arguments in the correct position</p>
<ul>
<li><a href="https://github.com/clojure-emacs/cider/issues/2916">Issue: Clojure CLI command parameters order incorrect</a></li>
<li><a href="https://github.com/clojure-emacs/cider/issues/2917">PR: jack-in: move Clojure-cli parameter global-opts after -Sdeps</a></li>
</ul>
<p><a href="https://youtu.be/XuquYgOSOnc">Hacking on CIDER live broadcast</a> to evolve the way cider-jack-in manages aliases. Covers basic elisp print line style debugging and how to hack on the live Cider code running in Emacs.</p>
<h3 id="clojure-cli-support-for-other-tools">Clojure CLI support for other tools</h3>
<p>Reviewed Clojure CLI support for other <a href="https://practicalli.github.io/clojure/clojure-editors/">Clojure aware editors</a> recommended and raised issues and fixes.</p>
<h4 id="calva-issue">Calva issue</h4>
<p>Calva only seems to allow the use of <code>-A</code> flag when using its jack-in feature, so <a href="https://github.com/BetterThanTomorrow/calva/issues/826">issue #826 raised</a> for awareness of the change in Clojure CLI tools.</p>
<h4 id="spacevim-issue">Spacevim issue</h4>
<p>Spacevim <a href="https://github.com/SpaceVim/SpaceVim/issues/3931">fails to run the REPL using Command Line tools on Unix systems</a>, picking up the wrong executable name.  Suggested <a href="https://github.com/SpaceVim/SpaceVim/issues/3931#issuecomment-720140933">a quick hack to fix the issue</a> to help the community create a suitable fix in vimscript.</p>
<h1 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h1>
<h3 id="october-1-15-2"><strong>October 1-15</strong></h3>
<p>Here is an overview of the work I did per project.</p>
<h3 id="babashka">Babashka</h3>
<ul>
<li>Ensure ns map exists for namespaces used only &ldquo;code&rdquo; vars <a href="https://github.com/babashka/babashka.pods/issues/20">babashka/babashka.pods#20</a>. This fixes compatibility with <a href="https://github.com/retrogradeorbit/bootleg">bootleg</a>.</li>
<li>Support <code>java.io.file.FileVisitor</code> and <code>java.io.FilenameFilter</code> with <code>reify</code> <a href="https://github.com/borkdude/babashka/issues/600">#600</a>. Nice side effect: this makes babashka compatible with the <a href="https://github.com/clj-commons/fs">fs</a> library.</li>
<li>Add classes <code>java.util.zip.ZipInputStream</code> and <code>java.util.zip.ZipEntry</code>. This makes babashka compatible with <a href="https://github.com/borkdude/glam">glam</a>, a work in progress package manager.</li>
<li>Documentation updates for <code>--uberscript</code>:
<ul>
<li><a href="https://github.com/borkdude/babashka#uberscript">https://github.com/borkdude/babashka#uberscript</a></li>
<li><a href="https://github.com/borkdude/babashka#carve">https://github.com/borkdude/babashka#carve</a></li>
</ul>
</li>
<li>Sending mail, experimented with drewr/postal <a href="https://github.com/borkdude/babashka/issues/599">#599</a></li>
<li>Fix <code>System/exit</code> in REPL <a href="https://github.com/borkdude/babashka/issues/606">#606</a></li>
<li>Review PR for <a href="https://github.com/babashka/babashka.nrepl/issues/28">babashka/babashka.nrepl#28</a></li>
</ul>
<h3 id="sci">Sci</h3>
<ul>
<li>Add <code>lazy-cat</code> <a href="https://github.com/borkdude/sci/issues/427">#427</a></li>
</ul>
<h3 id="clj-kondo">Clj-kondo</h3>
<ul>
<li>Review PR and making additional changes for
<a href="https://github.com/borkdude/clj-kondo/issues/1016">clj-kondo#1016</a>: config
for ignoring unused <code>:as</code> binding</li>
<li>Support ignore hint on unused binding <a href="https://github.com/borkdude/clj-kondo/issues/1017">#1017</a></li>
<li>Support ignore hint in ns form <a href="https://github.com/borkdude/clj-kondo/issues/1031">#1031</a></li>
<li>Support require in top-level do <a href="https://github.com/borkdude/clj-kondo/issues/1018">#1018</a></li>
<li>Support quote in require <a href="https://github.com/borkdude/clj-kondo/issues/1019">#1019</a></li>
<li>Type warning for <code>contains?</code> <a href="https://github.com/borkdude/clj-kondo/issues/1021">#1021</a></li>
<li>Predicate functions for hooks api <a href="https://github.com/borkdude/clj-kondo/issues/1006">#1006</a></li>
<li>Fix memory leak in long running process <a href="https://github.com/borkdude/clj-kondo/issues/1036">#1036</a></li>
<li>Shadowed var linter <a href="https://github.com/borkdude/clj-kondo/issues/646">#646</a></li>
<li>Review PR and making additional changes for <a href="https://github.com/clj-kondo/config/pull/7">clj-kondo/config#7</a></li>
<li>Support reader conditionals in ignore hint <a href="https://github.com/borkdude/clj-kondo/issues/1022">#1022</a></li>
<li>Don&rsquo;t warn about redundant let and do in hook-generated code <a href="https://github.com/borkdude/clj-kondo/issues/1038">#1038</a></li>
<li>Fix format string false positive <a href="https://github.com/borkdude/clj-kondo/issues/1007">#1007</a></li>
<li>Parse failure in <code>(or)</code> <a href="https://github.com/borkdude/clj-kondo/issues/1023">#1023</a></li>
<li>Base Docker image on Ubuntu latest <a href="https://github.com/borkdude/clj-kondo/issues/1026">#1026</a></li>
</ul>
<h3 id="misc-2">Misc</h3>
<ul>
<li>deps.clj <a href="https://github.com/borkdude/deps.clj/releases/tag/v0.0.10">v0.0.10</a>
Parity with Clojure Tools 1.10.1.697</li>
<li>Glam, a work in progress package manager <a href="https://github.com/borkdude/glam">https://github.com/borkdude/glam</a></li>
<li>Carve:
<ul>
<li><a href="https://github.com/borkdude/carve/commit/b53b85af41eadafe9d9a76d4e9bf5f5ace0ea19e">:silent option</a></li>
<li>updated deps</li>
<li>deprecate question mark in options</li>
</ul>
</li>
<li>Jet: support <code>take-while</code> and <code>drop-while</code> <a href="https://github.com/borkdude/jet/issues/69">#69</a></li>
</ul>
<h3 id="october-16-31-2"><strong>October 16-31</strong></h3>
<p>Here is an overview of the work I did per project. These two weeks mostly were
spent on babashka and sci.</p>
<h3 id="babashka-1">Babashka</h3>
<ul>
<li><a href="https://github.com/babashka/pod-babashka-lanterna">pod-babashka-lanterna</a>: a pod for creating TUI apps</li>
<li><a href="https://github.com/babashka/process">babashka/process</a>: a Clojure library for working with <code>java.lang.Process</code></li>
<li><code>pprint/print-table</code> should write to <code>sci/out</code> <a href="https://github.com/borkdude/babashka/issues/611">#611</a></li>
<li>add <code>lazy-cat</code> <a href="https://github.com/borkdude/babashka/issues/605">#605</a></li>
<li>Fix <code>System/exit</code> in REPL <a href="https://github.com/borkdude/babashka/issues/606">#605</a></li>
<li>Review PR <a href="https://github.com/babashka/babashka.nrepl/issues/28">babashka.nrepl#28</a></li>
<li>Review PR <a href="https://github.com/borkdude/babashka/commit/13f65f05aeff891678e88965d9fbd146bfa87f4e">feature flag</a></li>
<li>Add <code>transit+json</code> format support to pods <a href="https://github.com/babashka/pods/issues/21">babashka/pods#21</a></li>
<li>Fix pod destroy function <a href="https://github.com/borkdude/babashka/issues/615">#615</a></li>
<li>Bind <code>*file*</code> in nREPL server <a href="https://github.com/babashka/babashka.nrepl/issues/31">babashka/babashka.nrepl#31</a></li>
<li>Add <a href="https://github.com/borkdude/babashka/tree/master/examples#portal">portal</a> example</li>
<li>Import should return class <a href="https://github.com/borkdude/babashka/issues/610">#610</a></li>
<li>Support <code>clojure.java.io/Coercions</code> protocol <a href="https://github.com/borkdude/babashka/issues/601">#601</a></li>
<li>Add <code>clojure.pprint/write</code> <a href="https://github.com/borkdude/babashka/issues/607">#607</a></li>
<li>Add socket support to pods <a href="https://github.com/babashka/pods/issues/2">babashka/pods#2</a></li>
<li>Partial support for multiple classes in <code>reify</code> <a href="https://github.com/borkdude/babashka/issues/603">#603</a></li>
<li>Add <a href="https://twitter.com/borkdude/status/1320134220107419648">image-viewer</a> example</li>
</ul>
<h3 id="sci-1">Sci</h3>
<ul>
<li>Add <code>bound?</code> <a href="https://github.com/borkdude/sci/issues/430">borkdude/sci#430</a></li>
<li>Support <code>map-&gt;</code> constructor on defrecords <a href="https://github.com/borkdude/sci/issues/431">borkdude/sci#431</a></li>
<li>Add <code>*print-namespace-maps*</code> <a href="https://github.com/borkdude/sci/issues/428">borkdude/sci#428</a></li>
</ul>
<h3 id="misc-3">Misc</h3>
<ul>
<li><a href="https://github.com/borkdude/rewrite-edn">Rewrite-edn</a>: a tool to rewrite EDN files while preserving whitespace and comments</li>
<li><a href="https://github.com/borkdude/puget-cli">puget-cli</a>: a CLI to pprint and colorize EDN output</li>
<li><a href="https://github.com/babashka/clojure-lanterna">clojure-lantera</a>: an updated
version of the original repository.</li>
</ul>
<h1 id="datahike">Datahike</h1>
<h3 id="october-1-15-3"><strong>October 1-15</strong></h3>
<p>In this iteration <a href="https://github.com/kordano">Konrad</a> was on his yearly
vacation, so the focus was primarily on API docs, Datomic compatibility, tuple
support, and upsert optimizations.</p>
<h3 id="api-and-datomic-compatibility">API and Datomic Compatibility</h3>
<p>The api namespace of Datahike is updated to match the signatures of Datomic,
among them the ability to pass queries as string and to transact lazy sequences.
Besides that the namespace has now more examples and is ready to be released
onto cljdoc for a complete documentation of the Datahike API. The next step is
to implement missing functionality from the Datomic client API including
asynchronous behavior and further harmonize the returning values of Datahike
with the ones of Datomic.</p>
<h3 id="tuple-support">Tuple Support</h3>
<p>During the last period, further progress has been made towards adding &lsquo;tuples&rsquo;
to Datahike. It is now possible to declare the three types of tuples
(homogeneous, heterogeneous and composite) in a Datahike schema. As a result
Datahike will not only check the conformity of the declaration but also the
validity of a tuple related transaction at transaction time. In addition,
transacting and querying homogeneous and heterogeneous is also done. Finally,
what remains to be done is composite tuples transaction and querying. Work into
this direction has started. Currently, as a first step, the design of an
algorithm for supporting composite tuples transaction has been undertaken.</p>
<h3 id="beyond-clojurists-together-tasks">Beyond Clojurists Together Tasks</h3>
<p>We have continued and finished the work on improving upsert operations support
in Datahike. This is expected to have a significant impact on transaction
speed.
Further work was done on the implementation of a garbage collector for
hitchhiker-tree based backends.
Design and implementation on attribute references and test refactoring
was continued.</p>
<h3 id="october-16-31-3"><strong>October 16-31</strong></h3>
<p>This iteration included extensive work on the API docs and Datomic
compatibility, as well as progress on the tuple support.</p>
<h3 id="api-and-datomic-compatibility-1">API and Datomic Compatibility</h3>
<p>We continued work on the Datomic API compatibility and finished most of the
adjustments and documentation with the pull request #240. Part of that PR was
to get the cljdoc api-docs working, which can now be seen on
<a href="https://cljdoc.org/d/io.replikativ/datahike">cljdoc</a>.
Other parts of the Datomic API were the compatibility of the pull-api,
unit-testing the examples in the api-docs and comparing the return values
between Datahike and Datomic. It was also investigated if we can offer a
query that is returning a lazy sequence but this is only possible with
breaking changes and will possibly be part of future iterations when async
support is on the verge of completion. The support of returning vectors -
like Datomic does - is basically the same issue and needs a rewrite of the
query engine and therefore a breaking change that needs further investigation
and should be aligned with coming changes. Besides that we made further
progress moving to Clojure CLI tools. In the coming weeks work will be spent
on bug fixing seek-datoms, preparing remote communication with empty protocols
and move the listen function to the api namespace.</p>
<h3 id="tuple-support-1">Tuple Support</h3>
<p>The work on tuple is gearing towards its end. During the last period, the
focus was on the implementation of composite tuples. This stage has just been
reached and the first few tuples have been transacted into a Datahike
instance. What remains to be done is adding more tests, bug fixing and making
the artifact more bullet-proof.</p>
<h3 id="beyond-clojurists-together-tasks-1">Beyond Clojurists Together Tasks</h3>
<p>We continued on our work on the ClojureScript port with now a first simple
round trip with only core db functions. Additionally we started updating our
<a href="https://github.com/replikativ/datahike-benchmark">benchmark suite</a>.
The work on the <a href="https://github.com/replikativ/datahike/pull/201">upsert functionality</a>
was also continued, and testing and review for the
<a href="https://github.com/replikativ/datahike/pull/236">attribute references</a> feature was extended.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2020 Survey Results</title>
      <link>https://www.clojuriststogether.org/news/q3-2020-survey-results/</link>
      <pubDate>Wed, 28 Oct 2020 15:36:17 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2020-survey-results/</guid>
      <description>Thanks so much for your support and feedback in the latest survey. This quarter we are funding four projects $9,000 each, applications are open until 6th November 11:59pm PST.</description>
      <content:encoded><![CDATA[<p>Thanks so much for your support and feedback in the latest survey. This quarter we are funding four projects $9,000 each. You can <a href="https://www.clojuriststogether.org/open-source/">apply for funding</a>, applications are open until 11th November 11:59pm PST.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 60 respondents to our Q3 2020 survey. The highlights are presented below.</p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things our members were interested in:</p>
<ul>
<li>Developer Experience Tools</li>
<li>Error Messages</li>
<li>IDE support</li>
<li>Data Analysis/Processing Frameworks</li>
<li>Documentation</li>
<li>Linters</li>
<li>Debuggers</li>
<li>Build tooling</li>
<li>Test tooling</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>shadow-cljs</li>
<li>Calva</li>
<li>cider</li>
<li>babashka</li>
<li>Fulcro</li>
<li>Pathom</li>
<li>clj-kondo</li>
<li>datahike</li>
<li>DataScript</li>
<li>Malli</li>
<li>Neanderthal ecosystem</li>
<li>re-frame</li>
<li>vim fireplace</li>
</ul>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>A sampling of comments:</p>
<ul>
<li>I&rsquo;ve been happy with the projects that have been funded, it&rsquo;s a community effort after all.</li>
<li>Calva certainly seems way better than when I tried it 2 years ago</li>
<li>Yes. I believe everyone who is a member of Clojurists Together benefits from what you&rsquo;re doing and that&rsquo;s why we contribute to the organization.</li>
<li>Continued reliability on the Clojure ecosystem</li>
<li>Happy to see support for CIDER, Oz, shadow-cljs, etc. Recent updates to Oz have been very helpful to me.</li>
<li>I&rsquo;ve appreciated the recent nrepl, reagent, and clj-kondo work</li>
<li>I use approximately half the sponsored projects.</li>
<li>It&rsquo;s good to know that Bozhidar was supported – he&rsquo;s doing a lot of work</li>
<li>Borkdude&rsquo;s work has really gained focus and the improvements to his libraries are great.</li>
</ul>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>For company members:</p>
<ul>
<li>57% wanted us to fund 50% Mature, 50% speculative</li>
<li>43% wanted us to fund 75% Mature, 25% speculative</li>
</ul>
<p>For developer members:</p>
<ul>
<li>65% wanted us to fund 50% Mature, 50% speculative</li>
<li>29% wanted us to fund 75% Mature, 25% speculative</li>
<li>4% wanted us to fund 25% Mature, 75% speculative</li>
<li>2% wanted us to fund 100% Mature, 0% speculative</li>
</ul>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>IDE support and core libraries</li>
<li>Being transparent and well organized</li>
<li>The engagement and communication to backers is really well done. Reading the mails keeps me afloat on the ecosystem</li>
<li>Good choices in projects that are funded. picking a good mix of projects and the right projects to fund</li>
<li>Establishing a community of support around the Clojure ecosystem, making the language ever more viable for use.</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Outreach, elevator pitching, making the mission even more known in companies</li>
<li>More insight into how the projects to be funded are chosen.</li>
<li>Fund specific people (not projects) who have demonstrated innovative thinking / tools.  Look for a way to fund quantum improvements in tools.</li>
<li>Treat mature and mainstream (by democratic choice) projects specially, i.e. allocate steady significant sponsorships</li>
</ul>
<p>Thank you!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Summer of Bugs Update 2020</title>
      <link>https://www.clojuriststogether.org/news/summer-of-bugs-update-2020/</link>
      <pubDate>Sat, 24 Oct 2020 16:00:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/summer-of-bugs-update-2020/</guid>
      <description>The Summer of Bugs Updates includes: clj-kondo vim-iced, DataScript, Calva, reitit, Keycloak-Clojure, cljc.java-time</description>
      <content:encoded><![CDATA[<p>A few months ago we ran our first ever <a href="/news/clojurists-together-summer-of-bugs-selections/">Summer of Bugs</a> program. These were grants of $500 or $1,000 to work on small, well-scoped projects. We funded clj-kondo, vim-iced, DataScript, Calva, reitit, keycloak-clojure, and cljc.java-time. We&rsquo;ve been thrilled with what these projects have come up with and that we were able to provide small grants to projects.</p>
<p>Here are the project reports from what they accomplished.</p>
<h2 id="clj-kondo">clj-kondo</h2>
<p><a href="https://github.com/borkdude/clj-kondo/">Clj-kondo</a> is a Clojure linter that
uses static analysis. This means it only looks at source code, but does not
execute it. While the information available to produce good lint warnings is
more limited with static analysis, static analyzing is generally more
performant, and works independently from a runtime (JVM, nodeJS, browser,
etc.). Static analysis does not suffer from causing unwanted side effects when
executing code. It often yields good enough results. Where static analysis falls
short, clj-kondo offers
<a href="https://github.com/borkdude/clj-kondo/blob/master/doc/config.md">configuration</a>
options where the user can help clj-kondo understand more of their code.</p>
<p>One area where static analysis of Clojure code becomes hard is macros. Macros
can introduce new syntactical constructs. Often macros are syntactically similar
to existing Clojure core macros. This is where you can use clj-kondo&rsquo;s
<code>:lint-as</code> configuration. In places where this isn&rsquo;t possible, for example
because the macro had irregular binding patterns, one could use
<code>:unresolved-symbol</code> + <code>:exclude</code> which would simply ignore unresolved symbol
errors in an entire s-expression.</p>
<p>I&rsquo;ve been asking myself the following question for a while now: can clj-kondo
make more sense of custom macros with a little help from the user? Clj-kondo
could invent some DSL to express a transformation, but DSLs often cover just 80%
of what you want to achieve. To get 20% more power, you&rsquo;d have to turn the DSL
into something like Clojure itself. So why not just use Clojure directly?</p>
<p>Clj-kondo is distributed in a couple of different ways. A widely used
distribution is the binary compiled with GraalVM. One limitation of a
GraalVM-compiled binary is that one cannot introduce new classes at runtime. And
this is what <code>clojure.core/eval</code> does, so that&rsquo;s off the table. Since August
2019 I&rsquo;ve been working on the <a href="https://github.com/borkdude/sci">Small Clojure
Interpreter</a>. It&rsquo;s not a compiler, like
Clojure, but it allows you to interpret Clojure expressions within a GraalVM
binary. The interpreter is used in <a href="http://babashka.org/">babashka</a> but it has
other uses as well and also works in JavaScript.</p>
<p>This interpreter can be used in clj-kondo to execute hooks that users can
provide to transform custom macro calls into constructs that clj-kondo can
understand. And this is what I&rsquo;ve worked on.</p>
<p>Clj-kondo uses a vendored version of
<a href="https://github.com/xsc/rewrite-clj">rewrite-clj</a> to analyze source code. My
first attempt at the hooks API was to transform the rewrite-clj nodes into
Clojure s-expressions. Then the user&rsquo;s hook function would transform these
s-expressions in a similar fashion as the macro would, returning new
s-expressions. Lastly clj-kondo would then translate these s-expressions back
into rewrite-clj nodes and continue analysis. Ostensibly this worked great for
several test cases, but ultimately it wasn&rsquo;t good enough. The main problem is
that numbers, strings and keywords cannot carry metadata. Metadata on sexprs was
used to keep track of the original locations. When (some of) these locations are
lost, clj-kondo cannot accurately position lint warnings anymore. And this is
unacceptable in my opinion. You can read more about this problem on ClojureVerse
<a href="https://clojureverse.org/t/feedback-wanted-on-new-clj-kondo-macroexpansion-feature/6043">here</a>
and in the issue on Github
<a href="https://github.com/borkdude/clj-kondo/issues/811">here</a>.</p>
<p>After more experimentation I decided that the transformation should happen
directly on rewrite-clj nodes in order to preserve location information. This led
to the current implementation of the <code>:analyze-call</code> hook, documented
<a href="https://github.com/borkdude/clj-kondo/blob/master/doc/config.md#hooks">here</a>.
Additionally, some library specific example config + hook code is provided
<a href="https://github.com/borkdude/clj-kondo/tree/master/libraries">here</a>, showing how
to make clj-kondo understand <a href="https://github.com/tonsky/rum">Rum</a>&rsquo;s <code>defc</code> macro
and <a href="https://github.com/scgilardi/slingshot">slingshot</a>&rsquo;s <code>try+</code> macro.</p>
<p>I consider this new feature a powerful feature but not an easy to use one. It
does provide a higher degree of linting quality while still enjoying the
benefits of static analysis. Luckily we only have to figure out the right code
for each library once. I urge library authors and users to contribute their
configurations to the clj-kondo
<a href="https://github.com/borkdude/clj-kondo/tree/master/libraries">repository</a> so we
can all benefit.</p>
<p><a href="https://www.clojuriststogether.org/">Clojurist Together</a> has sponsored this
work as part of their <a href="https://www.clojuriststogether.org/news/announcing-summer-of-bugs/">Summer of
Bugs</a>
program. Thanks to the people who have made this possible: the Clojurists
Together staff and of course the people who donate.</p>
<p>Hope you enjoy. Happy linting!</p>
<p>Michiel Borkent (a.k.a. <a href="https://twitter.com/borkdude">@borkdude</a>)</p>
<h2 id="vim-iced">vim-iced</h2>
<h4 id="what-we-were-trying-to-do">What we were trying to do</h4>
<p>I tried to add support test integration on plain nREPL server including <a href="https://github.com/borkdude/babashka/blob/master/doc/repl.md#nrepl">Babashka nREPL</a>.</p>
<p>Concretely tried to add following functionalities.</p>
<ul>
<li>Test single var under cursor.
<ul>
<li>Show the test result on vim.</li>
</ul>
</li>
<li>Test vars in a namespace.</li>
<li>Test all vars.</li>
</ul>
<h4 id="how-we-solved-the-issue">How we solved the issue</h4>
<p>I wrote a simple custom <a href="https://clojure.github.io/clojure/clojure.test-api.html#clojure.test/report">clojure.test/report</a> function to be able to gather test reports.</p>
<p>Then I fixed vim-iced to run tests with this <code>report</code> function and parse reports, so users can run tests on plain nREPL server, and display summarized results on vim.</p>
<h2 id="datascript">DataScript</h2>
<p>The main goal was to bring latest Datomic API improvements to DataScript:</p>
<ul>
<li>Support composite tuples <a href="https://github.com/tonsky/datascript/issues/323">#323</a></li>
<li>Support return maps (:keys/:syms/:strs) in query <a href="https://github.com/tonsky/datascript/issues/322">#322</a> <a href="https://github.com/tonsky/datascript/issues/345">#345</a></li>
</ul>
<p>Another big quality-of-life improvement was allowing any hashable values in <code>:db.cardinality/many</code> and <code>:db/indexed</code> attributes. Previously those attribute values had to be <code>Comparable</code>/<code>IComparable</code>.</p>
<ul>
<li>Support any hashable values in cardinality-many and indexed attributes <a href="https://github.com/tonsky/datascript/issues/274">#274</a> <a href="https://github.com/tonsky/datascript/issues/356">#356</a></li>
</ul>
<p>Validation was improved significantly as well:</p>
<ul>
<li>Throw when init-db is used with anything but datoms <a href="https://github.com/tonsky/datascript/issues/276">#276</a></li>
<li>Throw on using unindexed attribute in :avet index access <a href="https://github.com/tonsky/datascript/issues/344">#344</a></li>
<li>Throw on referencing undefined rule <a href="https://github.com/tonsky/datascript/issues/319">#319</a></li>
<li>Validate tempids only used as values in transaction <a href="https://github.com/tonsky/datascript/issues/304">#304</a></li>
<li>Throw if transacted entity id is out of range <a href="https://github.com/tonsky/datascript/issues/292">#292</a></li>
<li>Better validate rules syntax <a href="https://github.com/tonsky/datascript/issues/300">#300</a></li>
<li>Throw when pred/fn called on unbound variable <a href="https://github.com/tonsky/datascript/issues/309">#309</a></li>
<li>Validate inputs count in <code>:in</code> and <code>d/q</code> <a href="https://github.com/tonsky/datascript/issues/297">#297</a></li>
</ul>
<p>And few minor fixes:</p>
<ul>
<li>Fix <code>[:db/retract e a false]</code> working as <code>[:db/retract e a]</code></li>
<li>Add <code>keyword</code> to the built-ins <a href="https://github.com/tonsky/datascript/issues/231">#231</a></li>
</ul>
<p>The result is published as <a href="https://github.com/tonsky/datascript/releases/tag/1.0.0">DataScript 1.0.0</a></p>
<h2 id="calva">Calva</h2>
<p>Moving towards a file based REPL window replacement I decided to start with changing how Calva prints in-editor evaluation results.</p>
<p>Currently the first line of the evaluation results are displayed inline in the file being edited, while the full results are printed to a VS Code output channel (titled <strong>Calva says</strong>). This channel is plain text, readonly and provides very little help in navigating/editing/copying the results.</p>
<p>The <em>Summer of Bugs</em> version of Calva now uses a ”regular” file window for printing the results. I&rsquo;ve put <em>regular</em> in quotes there, because there is some supporting code around it making it more convenient as a REPL results window.</p>
<p>The rationale for using this regular window instead of the output channel or the REPL window, is that there are tons of work put into making Calva clojure windows interactive and Clojure friendly. (There is almost as much work put into the REPL window, but that is another story). So some of the things the new output window sports are:</p>
<ul>
<li>Clojure syntax highlightning</li>
<li>Rainbow brackets and indent guides</li>
<li><a href="https://calva.io/paredit/">Paredit</a></li>
<li>REPL connection, making it an alternative to the REPL window for explorations (which was the goal of the Summer of Bugs effort). It is treated as a CLJC file, so the user can toggle between the Clojure and ClojureScript REPL at will.</li>
<li>A Clojure debugger (made possible by previous CT funding)</li>
<li>VIM extension support – a huge win over the current REPL window.</li>
</ul>
<p>Demo of debugger active in the new output window:
<img src="https://user-images.githubusercontent.com/30010/88337560-37209900-cd37-11ea-8683-2c2a99fcca98.png" alt="image"></p>
<p>Stacktraces, which were not worth printing to the previous output channel, are printed to this output window (when available) with clickable links to the file locations in the stack frames. (It is printed as an Clojure/EDN vector so the user can wield the REPL on it.)</p>
<p>Demo of output window stacktrace with clickable file locations and peek hovers:
<img src="https://user-images.githubusercontent.com/30010/88339069-af885980-cd39-11ea-85b3-467cad9396e0.png" alt="output window stack trace"></p>
<h4 id="lessons-learned">Lessons Learned</h4>
<p>While the rationale behind making use of all the previous work on Calva to make this output/repl window extra powerful was sound, VS Code was not made with LISPs in mind and it sometimes feels like a battle making it support Clojure coding. Most of the things I thought would be easy turned out quite tricky, and I had to yield to the VS Code API and adapt several of my intended features a bit more than I liked. But we in the Calva Team are fighters, and, all things considered, this new output window unfolded to be quite a lot sweeter than I had envisioned.</p>
<p><img src="https://user-images.githubusercontent.com/30010/88337775-8c5caa80-cd37-11ea-872f-39676382097a.png" alt="theseus vs code api"></p>
<h4 id="soon-to-be-released">Soon to be Released</h4>
<p>I expect to release this version of Calva within the following week. It will not yet replace the current REPL window, but the ground work is done, and this mini project has certainly proven that this regular-file approach is viable.</p>
<h2 id="reitit">reitit</h2>
<p>Here is a short summary of my progress so far:</p>
<ul>
<li>Informed maintainers of reitit about the grant and they provided some comments to the original issue to make contributing a bit easier <a href="https://github.com/metosin/reitit/issues/84">#84</a></li>
<li>Contributed to two swagger related issues to get more familiar with the codebase (<a href="https://github.com/metosin/reitit/issues/375">#375</a> &amp; <a href="https://github.com/metosin/reitit/issues/217">#217</a>)</li>
<li>Found a couple of small issues while working on #375 and #217 and submitted fixes (<a href="https://github.com/metosin/reitit/pull/415">#415</a> &amp; <a href="https://github.com/metosin/reitit/pull/418">#418</a>)</li>
<li>Read through the open api 3 changes and found a tool that helps with migration from old version</li>
<li>Started working on <a href="https://github.com/metosin/reitit/issues/84">#84</a></li>
</ul>
<h2 id="keycloak-clojure">Keycloak-clojure</h2>
<p><em>Jeremie has nearly completed his work on the project.</em></p>
<p>I&rsquo;ve got pretty exciting news as I work on new features for keycloak-clojure particularly on the Ops and automation side: I will ship very soon a <a href="https://github.com/jgrodziski/keycloak-clojure/commit/c20668ae3513a44850214f5cfd1f6306a62d227a">native CLI</a> (thanks to GraalVM) and a <a href="https://github.com/jgrodziski/keycloak-clojure/commit/7d20d35d827f5c20747848cc0bed7e2aa6127f83">docker image</a> of the keycloak-clojure client for configuring Keycloak given an EDN of the config (realm, clients, roles, users, etc.). The idea is to fully automate the provisioning/config of a Keycloak environment. I also worked on a Vault integration for that Keycloak client to export the secret related to a backend for it to get it at launch time, hence having a more secure setup. As Keycloak is an infrastructure component, in real life project that ops stuff is very mandatory.</p>
<p>Back to the documentation stuff, I experimented with mkdocs and codox and finally settle on codox. I also worked on a sample app, dockerized that illustrate the tutorial part of the doc. I move forward on the setup/admin part of the doc and will soon publish that part on a dedicated website.
So to give an ETA, I can commit to:
end of October for a first shipping of the doc website with the setup/admin part
end of the year for the application part (frontend and backend integration with a sample app).</p>
<h2 id="cljcjava-time">cljc.java-time</h2>
<p>I am planning to drop the npm/foreign-lib dependencies (npm library ‘js-joda’ &amp; related) from <a href="https://github.com/henryw374/cljc.java-time">https://github.com/henryw374/cljc.java-time</a> 8.</p>
<p>Doing this should mean that other Clojure(Script) libraries which make any use of dates and times could now depend on cljc.java-time library because:</p>
<p>There will be no transitive dependency headaches for users (ie excluding foreign-libs if you have a :bundle cljs build etc)
End users will benefit from dead code elimination: If they are not using part of a library that uses cljc.java-time, then nothing of cljc.java-time library will be included in an advanced optimization cljs build.
In other words, cljc libraries that need to use dates (even if dates are not the main focus of that library) can depend on cljc.java-time and get a banana without a gorilla holding on to it.</p>
<p>… and being cross-platform and using java.time on the jvm, I hope cljc.java-time could become the de-facto platform time library for Clojure and Clojurescript.</p>
<p>Of course <a href="https://github.com/juxt/tick">https://github.com/juxt/tick</a> and any other end-user-focused date-time libraries that depend on cljc.java-time will benefit</p>
<p>How will this work?</p>
<p>I am creating a custom build of the js-joda source that results in a single js file that does a goog.provide() - ie something cljs compiler treats as native.</p>
<p>In order for the jsjoda addon libs (timezone &amp; locales) to work they will also need custom builds.</p>
<p>I am assuming here that no one is using any js libraries that are using jsjoda - but if you are please shout. If people are then I could provide an option to use cljc.java-time with npm dependency instead.</p>
<p>The downside for me is that each release of jsjoda that people want will need a new release of this custom build. However, since jsjoda just replicates java.time and that is stable, I don’t expect that many releases.</p>
<p>There is a new platform library for JS in the works, ‘proposal-temporal’, but I decided it is best to focus on the custom-jsjoda approach for now since:</p>
<p>it may be years before proposal temporal is fully ready
jsjoda lib is still openly considering deferring to proposal-temporal method/objects when it is ready - ie jsjoda does the mapping to java.time so cljc.java-time doesn’t have to
I am not sure how long until the new version of cljc.java-time will be ready, but weeks rather than months hopefully.</p>
<p>FYI I have gratefully received some funding from Clojurists Together for this work.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>September 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/september-2020-monthly-update/</link>
      <pubDate>Sat, 03 Oct 2020 14:10:00 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/september-2020-monthly-update/</guid>
      <description>Read more updates from Malli, Practicalli, Clj-kondo/babashka/sci, and Datahike</description>
      <content:encoded><![CDATA[<p>Here are the updates from our <a href="/news/q3-2020-funding-announcement/">new projects</a>.</p>
<h1 id="malli">Malli</h1>
<h3 id="september-1-15"><strong>September 1-15</strong></h3>
<p>Small improvements based on user feedback, finalized the EntrySchemas and drafted implementation for <em>heterogeneous sequences</em>, aka regex schemas.</p>
<h3 id="done-stuff">Done stuff</h3>
<ul>
<li><a href="https://github.com/metosin/malli/pull/212">#212</a> merged in master, closing 2 other PRs and 3 Issues</li>
<li><a href="https://github.com/metosin/malli/pull/251">#251</a> transformation terms</li>
<li><a href="https://github.com/metosin/malli/pull/250">#250</a> api-docs for public api</li>
<li><a href="https://github.com/metosin/malli/issues/116">#116</a> all known issues for initial alpha are now resolved!</li>
</ul>
<h3 id="ongoing">Ongoing</h3>
<ul>
<li><a href="https://github.com/metosin/malli/pull/252">#252</a>
<ul>
<li>adding support for lazy registries (supports pulling e.g.AWS CloudFormation Schemas in at runtime, when needed)</li>
<li>lazy <code>:multi</code> impl</li>
<li>first class support for String Schema references</li>
<li>spell-specking of <code>:multi</code> and <code>:enum</code> values</li>
</ul>
</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clj" data-lang="clj"><span style="color:#75715e">;; given a lazy registry is provided, pulling the schemas when needed</span>
(<span style="color:#66d9ef">def </span>Schema
  [<span style="color:#e6db74">:multi</span> {<span style="color:#e6db74">:dispatch</span> <span style="color:#e6db74">:Type</span>, <span style="color:#e6db74">:lazy</span> true}
   <span style="color:#e6db74">&#34;AWS::ApiGateway::Stage&#34;</span>
   <span style="color:#e6db74">&#34;AWS::ApiGateway::UsagePlan&#34;</span>
   <span style="color:#e6db74">&#34;AWS::AppSync::ApiKey&#34;</span>])

(-&gt; (<span style="color:#a6e22e">m/explain</span>
      Schema
      {<span style="color:#e6db74">:Type</span> <span style="color:#e6db74">&#34;AWS::AppSync::ApiKey&#34;</span>
       <span style="color:#e6db74">:Descriptionz</span> <span style="color:#e6db74">&#34;kikka&#34;</span>})
    (<span style="color:#a6e22e">me/with-spell-checking</span>)
    (<span style="color:#a6e22e">me/humanize</span>))
<span style="color:#75715e">; ...loaded &#34;AWS::AppSync::ApiKey&#34;</span>
<span style="color:#75715e">; =&gt; {:ApiId [&#34;missing required key&#34;]</span>
<span style="color:#75715e">;     :Descriptionz [&#34;should be spelled :Description&#34;]}</span>

(-&gt; Schema
    (<span style="color:#a6e22e">m/explain</span>
      {<span style="color:#e6db74">:Type</span> <span style="color:#e6db74">&#34;AWS::ApiGatway::UsagePlan&#34;</span>
       <span style="color:#e6db74">:Description</span> <span style="color:#e6db74">&#34;kikka&#34;</span>
       <span style="color:#e6db74">:UsagePlanName</span> <span style="color:#e6db74">&#34;kukka&#34;</span>})
    (<span style="color:#a6e22e">me/with-spell-checking</span>)
    (<span style="color:#a6e22e">me/humanize</span>))
<span style="color:#75715e">; =&gt; {:Type [&#34;did you mean AWS::ApiGateway::UsagePlan&#34;]}</span>
</code></pre></div><ul>
<li><strong>WIP</strong>: Heterogenous sequences, aka regex schemas. Studied implementation of <a href="https://clojure.org/guides/spec">clojure.spec</a>, <a href="https://github.com/plumatic/schema">plumatic schema</a>, <a href="https://github.com/cgrand/seqexp">seqexp</a> and <a href="https://github.com/cgrand/seqexp">minimallist</a> and drafted an initial clean slate impl. Validation and parsing mostly work, but lot of rough edges and explaining &amp; generation not yet implemented. Kudos to <a href="https://github.com/green-coder">Vincent Cantin</a> for the initial work on this!</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clj" data-lang="clj"><span style="color:#75715e">;; internal api</span>
(<span style="color:#a6e22e">re/parse</span>
  (<span style="color:#a6e22e">re/*</span> (<span style="color:#a6e22e">re/cat</span> [<span style="color:#e6db74">:prop</span> (<span style="color:#a6e22e">re/fn</span> string?)]
                [<span style="color:#e6db74">:val</span> (<span style="color:#a6e22e">re/alt</span> [<span style="color:#e6db74">:s</span> (<span style="color:#a6e22e">re/fn</span> string?)]
                              [<span style="color:#e6db74">:b</span> (<span style="color:#a6e22e">re/fn</span> boolean?)])]))
  [<span style="color:#e6db74">&#34;-server&#34;</span> <span style="color:#e6db74">&#34;foo&#34;</span> <span style="color:#e6db74">&#34;-verbose&#34;</span> true <span style="color:#e6db74">&#34;-user&#34;</span> <span style="color:#e6db74">&#34;joe&#34;</span>])
<span style="color:#75715e">;[{:prop &#34;-server&#34;, :val [:s &#34;foo&#34;]}</span>
<span style="color:#75715e">; {:prop &#34;-verbose&#34;, :val [:b true]}</span>
<span style="color:#75715e">; {:prop &#34;-user&#34;, :val [:s &#34;joe&#34;]}]</span>

<span style="color:#75715e">; malli with named branches</span>
[<span style="color:#e6db74">:*</span> [<span style="color:#e6db74">:cat*</span>
     [<span style="color:#e6db74">:prop</span> string?]
     [<span style="color:#e6db74">:val</span> [<span style="color:#e6db74">:alt*</span>
            [<span style="color:#e6db74">:s</span> string?]
            [<span style="color:#e6db74">:b</span> boolean?]]]]]

<span style="color:#75715e">; malli with indexed branches</span>
[<span style="color:#e6db74">:*</span> [<span style="color:#e6db74">:cat</span> string? [<span style="color:#e6db74">:alt</span> string? boolean?]]]
</code></pre></div><h4 id="misc">Misc</h4>
<p>All old issues for first alpha are now resolved. Will release it soon, without the regexs (take some time to finish)</p>
<h3 id="september-16-30"><strong>September 16-30</strong></h3>
<p>Polishing the code, updated dependencies, updated libraries using malli, helped people on slack, though about time, lot&rsquo;s of small improvements, curving out bundle size on js, added <code>type-properties</code>, rewrote a lot of core code to use it, started to write alpha release blog post.</p>
<h3 id="done-stuff-1">Done stuff</h3>
<ul>
<li><a href="https://github.com/kwrooijen/gungnir/pull/31">kwrooijen/gungnir#31</a> - update &amp; test Gugnir to use latest malli</li>
<li><a href="https://github.com/lambdaisland/regal/pull/20">lambdaisland/regal#20</a> - update &amp; test Regal to to use latest malli</li>
<li><a href="https://github.com/metosin/reitit/commit/fbff819909dd8a6b325678f1ed5c49b1f5d8034f">metosin/reitit#fbff819</a> - update &amp; test Reitit to use latest malli</li>
<li><a href="https://github.com/metosin/malli/pull/260">#260</a> - <code>:map-of</code> keys should decode like String with JSON</li>
<li><a href="https://github.com/metosin/malli/issues/116">#116</a> - just done</li>
<li><a href="https://github.com/metosin/malli/issues/254">#254</a> - easy way to attach custom errors to Schemas</li>
<li><a href="https://github.com/metosin/malli/issues/253">#253</a> - spell checking for :multi map dispatch keys</li>
<li><a href="https://github.com/metosin/malli/pull/252">#252</a> - lazy registries &amp; multis</li>
<li><a href="https://github.com/metosin/malli/issues/25">#25</a> - support core predicates or just keyword types?</li>
<li><a href="https://github.com/metosin/malli/issues/244">#244</a> - won&rsquo;t fix, too special case</li>
</ul>
<h3 id="ongoing-1">Ongoing</h3>
<ul>
<li>
<p>Writing the alpha release post. Have found out many small inconsistencies and even bugs while writing sample code into the post, need to fix all of those to get the library &amp; post out. Still, really happy how it&rsquo;s all clicking together.</p>
</li>
<li>
<p>Designing how to support schemas for time and dates <a href="https://github.com/metosin/malli/issues/49">#49</a>. There is <code>java.time</code>,  on JS, <a href="https://github.com/tc39/proposal-temporal">Temporal</a> is coming, but while waiting, we have <a href="https://github.com/tc39/proposal-temporal">tick</a> and <a href="https://github.com/henryw374/cljc.java-time">cljc.java-time</a>, but they add a whopping 40-50kb gzipped to bundle size (currently, malli starts ~2kb gzipped). Good discussion about this in <a href="https://clojureverse.org/t/progress-update-on-the-clojure-script-date-time-libraries/5344/6">clojureverse</a>.</p>
</li>
<li>
<p>carving out js bundle size with great tooling &amp; tips by <a href="https://github.com/thheller">Thomas Heller</a> via slack. This could be done later, but is so much fun.</p>
</li>
</ul>
<h4 id="misc-1">Misc</h4>
<p>Thought releasing a library was easy, but want to do it too(?) right, seems to take time more than expected. Had a flu.</p>
<h1 id="practicalli">Practicalli</h1>
<h3 id="september-1-15-1"><strong>September 1-15</strong></h3>
<p>Invested time to understand the changes coming to the Clojure CLI tools and understand the opportunities that <a href="https://insideclojure.org/2020/09/04/clj-exec/">Clojure exec</a> (<code>:exec-fn</code> &amp; <code>:exec-args</code>) brings to aliases. These changes provided a catalyst to start redesigning the aliases used in <a href="https://github.com/practicalli/clojure-deps-edn/tree/qualified-alias-keywords-and-new-flags">practicalli/clojure-deps-edn</a>.</p>
<h3 id="practicalli-study-group">Practicalli Study Group</h3>
<p>Continuing the Banking on Clojure project, especially around database access.  The database schema was refined along with improved approaches to creating database schema, using transactional updates and ensuring connections are closed.  The next.jdbc friendly functions were explored and a CRUD approach implemented.</p>
<ul>
<li><a href="https://youtu.be/sBdmwDUp1Ho">082 - Banking On Clojure - Part3 - next.jdbc for SQL in Clojure</a></li>
<li><a href="https://youtu.be/DmYlNTe7Gds">083 - Banking On Clojure - Part4 - Updating data in the database</a></li>
</ul>
<p>Next steps will be to use Clojure spec for generative testing with the database, add connection pooling and using lifecycle management libraries.</p>
<h3 id="practicalli-webapps">Practicalli WebApps</h3>
<p>Updated sections on <a href="https://practicalli.github.io/clojure-webapps/relational-databases-and-sql/h2-database/">H2 Database</a> and Banking on Clojure</p>
<ul>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/database-tables.html">Design and Create Database Tables</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/database-queries.html">Defining Database Queries - different approaches</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/create-records.html">Create database records</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/read-records.html">Read Database Records</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/update-records.html">Update Records in the database</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/delete-records.html">Delete Records in the database</a></li>
</ul>
<h3 id="practicalli-clojure">Practicalli Clojure</h3>
<p>Added <a href="https://practicalli.github.io/clojure/testing/unit-testing/">core principles for writing effective unit tests</a> in Clojure. Included project configuration examples of unit tests for Leiningen and Clojure CLI tools.  Also included example configuration for Emacs CIDER test runner and link to the test runner configurations in <a href="https://github.com/practicalli/clojure-deps-edn/tree/qualified-alias-keywords-and-new-flags">practicalli/clojure-deps-edn</a>.</p>
<h3 id="clojure-depsedn">Clojure deps.edn</h3>
<p>Created a <a href="https://gist.github.com/jr0cket/ae7dd745eb45870109ace59fe835ce80">draft guide to changes in the next release of the Clojure CLI tools</a>, to understand the significance of the changes it introduces.  The <code>-X</code> flag for executing a function with EDN arguments (hash-map arguments) has already been introduced and the new release depreciates the generic <code>-A</code> alias in favor of <code>-M</code>.  In the long term using the <code>-X</code> flag with functions that take a structured argument looks to be an excellent approach.</p>
<p>Started a <a href="https://github.com/practicalli/clojure-deps-edn/tree/qualified-alias-keywords-and-new-flags">redesign of practicalli/clojure-deps-edn using qualified keywords for alias names</a>.  The Library repositories keyword, <code>:mvn/repos</code>, is already qualified, so this redesign brings the aliases in line with that style.  The alias keywords are prepended with names to communicate the category of purpose for each alias, e.g. repl, project, env, lib, inspect, build, deploy.</p>
<p>As part of the redesign, the new flags introduced with Clojure CLI tools, <code>-M</code> and <code>-X</code>, are used.  The <code>-X</code> flag is the preferred Clojure command line flag to use for the aliases, where the library supports executing a function from the library that takes a hash-map of arguments.  Otherwise <code>-M</code> flag replaces <code>-A</code> flag and continues to use <code>clojure.main</code> to call the <code>-main</code> function of the given main namespace.</p>
<p>Add project/check to give detailed report on compilation issues for a project</p>
<h3 id="practicalli-spacemacs">Practicalli Spacemacs</h3>
<p>Resolved simple bug fixes raised by the community.</p>
<h3 id="september-16-30-1"><strong>September 16-30</strong></h3>
<h3 id="practicalli-study-group-1">Practicalli Study Group</h3>
<p>Continuing the Live broadcasts covering the development of the Banking on Clojure web application.</p>
<ul>
<li><a href="https://youtu.be/Cn5QX9nL7jU">084 - Banking On Clojure - Part5 - Generated database records from clojure.spec</a></li>
<li><a href="https://youtu.be/e4QInyWa1bM">085 - Banking On Clojure - Part6 - Refactor database schema, specs and namespaces</a></li>
</ul>
<h3 id="practicalli-clojure-1">Practicalli Clojure</h3>
<p>New sections and Pages:</p>
<ul>
<li><a href="http://practicalli.github.io/clojure/coding-challenges/">Coding Challenges section</a></li>
<li><a href="http://practicalli.github.io/clojure/testing/unit-testing/fixtures.html">Unit testing fixtures</a></li>
</ul>
<p>Added Code Challenges section, covering the Clojure challenges available in 4Clojure.com, Exercism.io, CodwWars.com, ClojureScript Koans and Advent of Code.  A quick guide to using each of the Code challenge websites was provided and tips to using them effectively.  GitHub code repositories for the Practicalli <a href="https://github.com/practicalli/four-clojure/">4Clojure guides</a>, <a href="https://github.com/practicalli/codewars-guides">codewars-guides</a> and <a href="https://github.com/practicalli/exercism-clojure-guides">exercism-guides</a> were included, along with the <a href="https://www.youtube.com/playlist?list=PLpr9V-R8ZxiDB_KGrbliCsCUrmcBvdW16">4Clojure guides video playlist</a> which walks through the solution to over 60 challenges and different approaches to solving them. Several 4Clojure and Exercism challenges have been added as solution walk-through, showing the design thinking behind the solution in the website.  More of these will be converted from the solution code repositories as time allows, along with a video showing the REPL driven development experience.</p>
<p>Added <a href="http://practicalli.github.io/clojure/testing/unit-testing/fixtures.html">Unit testing fixtures</a> page with examples from Banking on Clojure project.  Also mentioned test selectors as a way to organize slower fixtures.</p>
<p>Started creating project templates for use with clj-new, to create deps.edn projects useful for beginners and experienced developers alike.  A section on writing your own custom templates will be added to the Practicalli Clojure book in October.</p>
<p>Continuing to create scripts for video screencasts for a series on the Clojure CLI tools, covering the usage from the latest release (1.10.1.697). The series will convey the developer experience and common practices.</p>
<p>Continue testing Clojure CLI pre-release and enhancing the aliases in practicalli/clojure-deps-edn, no issues found so far.</p>
<h3 id="clojure-webapps">Clojure WebApps</h3>
<p>Redesign the database schema and clojure.spec specifications to simplify the use of generative testing with specifications and in general make the specifications easier to work with.</p>
<p>Using generative testing with the database.  Specifications are used to generate random data to test the database CRUD functions, validating the results of those functions against clojure specs.</p>
<p>Added code to create and delete the development database which is called from fixture functions within the handler-helper-test namespace.  The tests now run successfully via the CircleCI service.</p>
<p>Using kaocha profiles to configure different behavior in the development environment and when running on the CI server, specifically file change watcher and test output.</p>
<h3 id="practicalli-spacemacs-1">Practicalli Spacemacs</h3>
<p>Now Emacs 27 is the default, trying out Ligature support in Emacs.  Added the unicode layer with variables to include ligatures.  Initially switching to the Fira code font which contains a wide range of ligatures in the font already.</p>
<p>Will try the <a href="https://github.com/ToxicFrog/Ligaturizer">Ligaturizer project</a> to add Fira Code ligatures to the Ubuntu Mono font, the preferred font used by Practicalli.</p>
<h1 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h1>
<h3 id="september-1-15-2"><strong>September 1-15</strong></h3>
<p>Here is an overview of the work I did per project. In the last two weeks I spent
most of my time focusing on a new release for clj-kondo.</p>
<h3 id="clj-kondo">Clj-kondo</h3>
<ul>
<li>
<p>Add <code>--parallel</code> option to lint sources in parallel. This will speed up
linting an entire classpath. <a href="https://github.com/borkdude/clj-kondo/issues/632">#632</a>, <a href="https://github.com/borkdude/clj-kondo/issues/972">#972</a></p>
</li>
<li>
<p>Fix false positive type warning with <code>into</code> and custom transducer <a href="https://github.com/borkdude/clj-kondo/issues/952">#952</a></p>
</li>
<li>
<p>Recognize aliases in quoted keywords <a href="https://github.com/borkdude/clj-kondo/issues/981">#981</a>
e</p>
</li>
<li>
<p>Support ignore hints <a href="https://github.com/borkdude/clj-kondo/issues/872">#872</a>:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(inc <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">3</span>)
<span style="color:#f92672">^</span>--- clojure.core/inc is called with <span style="color:#ae81ff">3</span> args but expects <span style="color:#ae81ff">1</span>

<span style="color:#f92672">#</span>_<span style="color:#e6db74">:clj-kondo/ignore</span>
(inc <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">3</span>)
<span style="color:#f92672">^</span>--- arity warning ignored

<span style="color:#f92672">#</span>_{<span style="color:#e6db74">:clj-kondo/ignore</span>[<span style="color:#e6db74">:invalid-arity</span>]}
(<span style="color:#66d9ef">do </span>(inc <span style="color:#ae81ff">1</span> <span style="color:#ae81ff">2</span> <span style="color:#ae81ff">3</span>))
<span style="color:#f92672">^</span>--- only redundant <span style="color:#66d9ef">do </span>is reported, but invalid arity is ignored
</code></pre></div><p>Also see <a href="doc/config.md">config.md</a>.</p>
</li>
<li>
<p>Merge config from <code>$HOME/.config/clj-kondo</code>, respecting <code>XDG_CONFIG_HOME</code>. See
<a href="doc/config.md">config.md</a> for details. <a href="https://github.com/borkdude/clj-kondo/issues/992">#992</a></p>
</li>
<li>
<p>New <code>:config-paths</code> option in <code>&lt;project&gt;/.clj-kondo/config.edn</code>. This allows
extra configuration directories to be merged in. See
<a href="doc/config.md">config.md</a> for details.</p>
</li>
<li>
<p><a href="https://github.com/clj-kondo/config">Config tool</a> that can spit out library
specific configurations that can be added via <code>:config-paths</code>. Contributions
for libraries are welcome.</p>
</li>
<li>
<p><a href="https://github.com/clj-kondo/inspector">Clj-kondo inspector</a>, a POC of
inspecting Clojure specs and turning them into clj-kondo type annotations.</p>
</li>
<li>
<p>Rum hooks for <code>defc</code> and <code>defcs</code> now support multi-arity definitions <a href="https://github.com/borkdude/clj-kondo/issues/987">#987</a></p>
</li>
</ul>
<h3 id="babashka">Babashka</h3>
<ul>
<li>Made differences with Clojure on the JVM clearer in README</li>
<li>Investigate inclusion of http-kit client <a href="https://github.com/borkdude/babashka/issues/561">#561</a></li>
<li>Investigate inclusion of http-kit server <a href="https://github.com/borkdude/babashka/issues/556">#556</a></li>
<li>Bumped clj-yaml to 0.7.2 <a href="https://github.com/borkdude/babashka/pull/562">#562</a></li>
<li>Reported bug and implemented patch for test.check related to GraalVM native-image <a href="https://clojure.atlassian.net/browse/TCHECK-157">TCHECK-157</a></li>
<li>Error when using <code>use</code> <a href="https://github.com/borkdude/babashka/issues/565">#565</a></li>
</ul>
<h3 id="sci">Sci</h3>
<ul>
<li>Experimented with faster loop implementation <a href="https://github.com/borkdude/sci/issues/394">#394</a></li>
<li>Hammock time: controlling number of iterations or execution time length <a href="https://github.com/borkdude/sci/issues/348">#348</a></li>
<li>Hammock time: resolving external macro namespaces <a href="https://github.com/borkdude/sci/issues/397">#397</a></li>
<li>Throw when trying to re-define referred var <a href="https://github.com/borkdude/sci/issues/398">#398</a></li>
<li>Fix libsci, an example of how to use sci as a shared native library (<a href="https://github.com/borkdude/sci/commit/d0b10f25bbbd6b09fb5c4ac99cf9887d33115845">https://github.com/borkdude/sci/commit/d0b10f25bbbd6b09fb5c4ac99cf9887d33115845</a>)</li>
</ul>
<h3 id="september-16-30-2"><strong>September 16-30</strong></h3>
<p>Here is an overview of the work I did per project. Most of the time went into
improvements to sci and a <a href="https://github.com/borkdude/babashka/releases/tag/v0.2.1">new babashka release</a>.</p>
<h3 id="babashka-1">Babashka</h3>
<ul>
<li>Include <code>org.httpkit.client</code>, a high performance async http client <a href="https://github.com/borkdude/babashka/issues/561">#561</a></li>
<li>Include <code>org.httpkit.server</code>, an HTTP server
<a href="https://github.com/borkdude/babashka/issues/556">#556</a>. This namespace should
be considered experimental and may stay or be removed in a future version of
babashka, depending on feedback from the community. See <a href="examples/httpkit_server.clj">example</a></li>
<li>Add <code>java.io.FileNotFoundException</code>, <code>java.security.DigestInputStream</code>, <code>java.nio.file.FileVisitOption</code> classes</li>
<li>Support implementing <code>IDeref</code>, <code>IAtom</code> and <code>IAtom2</code> on records <a href="https://github.com/borkdude/sci/issues/401">sci#401</a></li>
<li>Support compatibility with <a href="https://github.com/xsc/version-clj">version-clj</a> <a href="https://github.com/borkdude/babashka/issues/565">#565</a> <a href="https://github.com/lread">@lread</a> and <a href="https://github.com/borkdude">@borkdude</a></li>
<li>Support YAML roundtrip through <code>*input*</code> <a href="https://github.com/borkdude/babashka/issues/583">#583</a></li>
<li>Support <code>clojure.core/find-var</code> <a href="https://github.com/borkdude/sci/issues/420">sci#420</a> <a href="https://github.com/RickMoynihan">@RickMoynihan</a></li>
<li>Fix location printing in REPL (<code>--repl</code>) <a href="https://github.com/borkdude/babashka/issues/589">#598</a></li>
<li>Babashka.curl sends form params incorrectly as multipart <a href="https://github.com/borkdude/babashka.curl/issues/25">babashka.curl#25</a></li>
<li>Update Windows build instructions <a href="https://github.com/borkdude/babashka/issues/574">#574</a></li>
<li>Set minimum macOS version in build explicitly <a href="https://github.com/borkdude/babashka/pull/588">#588</a></li>
<li>Fix NPE in error handling logic <a href="https://github.com/borkdude/babashka/issues/587">#587</a></li>
<li>Fix namespace switch in REPL (<code>--repl</code>) <a href="https://github.com/borkdude/babashka/issues/564">#564</a></li>
<li>Fix location of errors in REPL (<code>--repl</code>) <a href="https://github.com/borkdude/babashka/issues/589">#589</a></li>
<li><a href="https://github.com/borkdude/babashka/issues/571">https://github.com/borkdude/babashka/issues/571</a></li>
</ul>
<h3 id="sci-1">Sci</h3>
<ul>
<li>
<p>Expose <code>parse-string</code>, <code>reader</code>, <code>parse-next</code> and <code>eval-form</code> <a href="https://github.com/borkdude/sci/issues/404">#404</a></p>
</li>
<li>
<p>Added REPL docs <a href="https://github.com/borkdude/sci#repl">here</a> and examples <a href="https://github.com/borkdude/sci/tree/688a4addda7cb9e630a49042743ae254571ac5f0/examples/sci/examples">here</a></p>
</li>
<li>
<p>Namespace dependency tree <a href="https://github.com/borkdude/sci/blob/688a4addda7cb9e630a49042743ae254571ac5f0/examples/sci/examples/ns_tree.clj">example</a></p>
</li>
<li>
<p>Support multi-arity methods in <code>defprotocol</code> <a href="https://github.com/borkdude/sci/issues/406">sci#406</a></p>
</li>
<li>
<p>Constructor call not recognized in protocol impl <a href="https://github.com/borkdude/sci/issues/419">sci#419</a></p>
</li>
<li>
<p>Improve handling of top-level do in macro expansion <a href="https://github.com/borkdude/sci/issues/421">sci#421</a></p>
</li>
<li>
<p>Performance improvements suggested by <a href="https://github.com/joinr">@joinr</a> <a href="https://github.com/borkdude/sci/issues/415">sci#415</a></p>
</li>
<li>
<p>Throw when trying to redefine referred var <a href="https://github.com/borkdude/sci/issues/398">sci#398</a></p>
</li>
<li>
<p>Xterm-sci: <a href="https://github.com/babashka/xterm-sci">https://github.com/babashka/xterm-sci</a></p>
</li>
<li>
<p>Eval single quote ' should return eof <a href="https://github.com/borkdude/edamame/issues/61">https://github.com/borkdude/edamame/issues/61</a></p>
</li>
<li>
<p>Fix import from hyphened namespace <a href="https://github.com/borkdude/sci/issues/410">https://github.com/borkdude/sci/issues/410</a></p>
</li>
</ul>
<h3 id="misc-2">Misc</h3>
<ul>
<li>dynaload 0.2.0, 0.2.1 and 0.2.2: <a href="https://github.com/borkdude/dynaload#graalvm">https://github.com/borkdude/dynaload#graalvm</a></li>
<li><a href="https://clojure.atlassian.net/browse/CLJ-2582">https://clojure.atlassian.net/browse/CLJ-2582</a></li>
</ul>
<h1 id="datahike">Datahike</h1>
<h3 id="september-1-15-3"><strong>September 1-15</strong></h3>
<p>Due to vacation in our team we could only work on the implementation of <a href="https://github.com/replikativ/datahike/issues/197">entity specs</a>.</p>
<h3 id="entity-specs">Entity Specs</h3>
<p>The required attributes and entity predicates were <a href="https://github.com/replikativ/datahike/pull/229">implemented</a>, added to Datahike <code>0.3.2-SNAPSHOT</code>, and will be release with Datahike 0.3.2. Users can now create new specs with <code>:db.entity/attrs</code> and <code>:db.entity/preds</code> and assert entities in transactions with <code>:db/ensure</code>.</p>
<p>Beyond implementation, we cleaned out older stale branches and PRs. Also we started planning our next feature roadmap after <code>0.3.2</code> release.</p>
<h3 id="september-16-30-3"><strong>September 16-30</strong></h3>
<p>Everybody is back from vacation now and we continued working together again on the open topics.</p>
<h3 id="release-032">Release 0.3.2</h3>
<p>We released our latest version <a href="https://github.com/replikativ/datahike/releases/tag/v0.3.2">0.3.2</a> that added entity specs that were implemented in Datahike in the last iteration as well as the following updates that we worked on over the last months:</p>
<ul>
<li>fixed hash computation</li>
<li>improved printer</li>
<li>fixed history upsert</li>
<li>added database name to environ</li>
<li>added circle ci orbs for ci/cd across all libraries</li>
<li>fixed reverse schema update</li>
<li>added automatic releases</li>
<li>added benchmark utility</li>
<li>extended time variance test</li>
<li>updated dependencies</li>
<li>adjusted documentation</li>
</ul>
<h3 id="datomic-compatibility">Datomic Compatibility</h3>
<p>Within our <a href="https://github.com/lambdaforge/vertailu">comparison project</a> we created a document on comparing functions from both Datahike and Datomic, and continued discussing adjustments both for signature and naming. Also we <a href="https://github.com/TimoKramer/datahike/tree/add-datomic-compatibility">started</a> adjusting our API documentation in order to provide better examples on how to use them.</p>
<h3 id="tuple-support">Tuple Support</h3>
<p>The schema definition for composite tuples was added to the transaction validation, while the definition for heterogeneous and homogeneous tuples are still drafted and tested. We started discussing the design and architecture for the search of the tuples in Datahike&rsquo;s index for both read and write schema flexibility.</p>
<h3 id="beyond-clojurists-together-tasks">Beyond Clojurists Together Tasks</h3>
<p>Within the task of porting of our own dependencies to ClojureScript, we unified the CI/CD for circleci, moving from leiningen to Clojure CLI tools.
Continued with improving the <a href="https://github.com/replikativ/datahike/pull/201">upsert performance</a>.
We started discussions on features and next steps for <a href="https://github.com/replikativ/datahike-server">datahike-server</a> and possible http clients.
Worked on <a href="https://github.com/replikativ/datahike/pull/232">garbage collection</a> for our backend.
Continued on the larger tasks for <a href="https://github.com/replikativ/datahike/tree/211-attr-refs">attribute reference support and partitions</a> that also incorporates vast refactoring of Datahike&rsquo;s tests.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>August 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/august-2020-monthly-update/</link>
      <pubDate>Mon, 07 Sep 2020 10:00:54 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/august-2020-monthly-update/</guid>
      <description>Read more updates from Malli, Practicalli, Clj-kondo/babashka/sci, and Datahike</description>
      <content:encoded><![CDATA[<p>Welcome to the first (half) month of updates from our <a href="/news/q3-2020-funding-announcement/">new projects</a>.</p>
<h2 id="malli">Malli</h2>
<p><strong>August 16-31</strong></p>
<p>First goal is to get a stable release of <a href="https://github.com/metosin/malli">Malli</a> out. This has involved some hammock time, revisiting the design decisions and both designing and implementing features that still could effect the shape of the core apis. And a lot of refactoring. Work is mostly tracked via <a href="https://github.com/metosin/malli/issues/116">#116</a>.</p>
<h3 id="done-stuff">Done stuff</h3>
<h3 id="simple-schemas">Simple Schemas</h3>
<ul>
<li>Add utilities for users to easily create simple schemas with property-based validation, including <code>:min</code> and <code>:max</code> ranges for numbers, collections and dates.</li>
<li>More built-in schemas: <code>:int</code>, <code>:double</code>, <code>:boolean</code>, <code>:keyword</code>, <code>:symbol</code>, <code>:qualified-keyword</code>, <code>:qualified-symbol</code> and <code>:uuid</code></li>
<li>Closed PRs
<ul>
<li>Int <a href="https://github.com/metosin/malli/pull/243">#243</a></li>
<li>Simple schemas <a href="https://github.com/metosin/malli/pull/249">#249</a></li>
</ul>
</li>
</ul>
<h3 id="entryschemas">EntrySchemas</h3>
<ul>
<li>One of the last big things that needs to get done right. Handling of Map Schemas is rewritten lifting MapEntry properties as first class concept for schema applications. This includes new entry value schema type (<code>m/-val-schema</code>), conditional entry walking and a new reusable syntax parser. It&rsquo;s a breaking change for many early adopters and because of that, still in review.</li>
<li>PR in review
<ul>
<li>Schema Applications can use MapEntry properties <a href="https://github.com/metosin/malli/pull/212">#212</a></li>
</ul>
</li>
<li>Related issues and PRs
<ul>
<li>More Robust Humanized Errors <a href="https://github.com/metosin/malli/issues/80">#80</a></li>
<li>Feature request or bug: adding properties directly to map keys <a href="https://github.com/metosin/malli/issues/86">#86</a></li>
<li>Define Child/Parent relationship to Schemas <a href="https://github.com/metosin/malli/issues/120">#120</a></li>
<li>Rough edges for swagger documentation <a href="https://github.com/metosin/malli/issues/182">#182</a></li>
<li>feat: call map-key w/ parent-schema information <a href="https://github.com/metosin/malli/pull/119">#119</a></li>
<li>Allow specifying gen/gen and friends on map entries <a href="https://github.com/metosin/malli/pull/197">#197</a></li>
</ul>
</li>
</ul>
<h3 id="misc">Misc</h3>
<ul>
<li>Studied <a href="https://github.com/redplanetlabs/specter/blob/1.0.4/src/clj/com/rpl/specter/navs.cljc#L243-L367">Specter Source</a> for finding more performant ways for doing value transformations. Good stuff.</li>
</ul>
<h2 id="practicalli">Practicalli</h2>
<p><strong>August 16-31</strong></p>
<p>Continued support for Practicalli by Clojurists together is much appreciated and there are <a href="https://practicalli.github.io/clojure-webapps/relational-databases-and-sql/managing-connections.html">several hundred content ideas</a> for the continued work.</p>
<p>Highlights of the last two weeks includes:</p>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLpr9V-R8ZxiDjyU7cQYWOEFBDR1t7t0wv">Live broadcasts</a> - continuing the Banking on Clojure project with next.jdbc, H2 database and DBeaver.</li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/development-database.html">Database access and design</a> for Banking on Clojure project</li>
<li>Updated <a href="https://github.com/practicalli/clojure-deps-edn">practicalli/clojure-deps-edn</a> repository to <a href="https://practicalli.github.io/clojure/clojure-tools/data-browsers/rebl-data-visualization.html">use Congnitect dev-tools for REBL</a> and a way to <a href="https://practicalli.github.io/clojure/clojure-tools/data-browsers/rebl-data-visualization.html#run-rebl-with-nrepl">configure CIDER to work with REBL</a>.</li>
<li>Test drive of <a href="https://github.com/Olical/conjure">Conjure</a>, an impressive Clojure environment for Neovim</li>
</ul>
<h3 id="clojure-webapps">Clojure WebApps</h3>
<p>Continuing the <a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/database-tables.html">Banking on Clojure project</a> as a major project, which started from the specifications created in Practicalli study group and will be expanded into a production grade web application.</p>
<p>The application server system, UI, routing and initial handler have been defined and CircleCI used for system integration and generative testing, deploying to a staging environment on Heroku on successful builds.</p>
<p>Currently adding content for database connectivity, database design and using next.jdbc and H2 for a development environment database.</p>
<p>PostgreSQL provisioned using Heroku for staging and production database.  Explored JDBC database connection strings, understanding well formed jdbc connection strings, very useful for working with Heroku environment variable for Postgres databases. Using different variations on the db-spec mapping for next.jdbc to minimise the number of environment variables to create.</p>
<ul>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/database-tables.html">Design and create database tables</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/namespace-design.html">Namespace design</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/relational-databases-and-sql/h2-database/">h2 Relational database</a> and <a href="https://practicalli.github.io/clojure-webapps/relational-databases-and-sql/h2-database/database-tools.html">development tools for H2</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/relational-databases-and-sql/managing-connections.html">Relational databases - Managing connections</a></li>
<li><a href="https://practicalli.github.io/clojure-webapps/projects/banking-on-clojure/production-database.html">Production database - Heroku Postgres</a></li>
</ul>
<p>Once the project is completed with compojure, other routing libraries (bidi, reitit) will be used to show a working comparison, communicating the different approaches taken in a practical way.  The same will be done for component lifecycle libraries, eg. mount, integrant and component.</p>
<h3 id="clojure-depsedn">Clojure deps.edn</h3>
<p>Added new aliases and updated existing aliases</p>
<ul>
<li><code>:cognitect-rebl</code> and <code>:nrepl</code> updated to use the Cognitect dev-tools release for REBL, testing with latest version of CIDER.</li>
<li><code>:database-h2</code> library dependency to separate the development environment database from staging and production deployment</li>
<li><code>:outdated</code> using antq rather than depot (which is no longer under development) to manage dependency versions</li>
</ul>
<p>[Additional aliases added for lambdaisland/kaocha][https://github.com/practicalli/clojure-deps-edn/blob/live/deps.edn#L318-L350] to support ClojureScript test runner, BDD style tests, code coverage and junit-xml reports for CI tools and wall-boards.</p>
<h3 id="practicalli-clojure">Practicalli Clojure</h3>
<p>Added <a href="https://practicalli.github.io/clojure/simple-projects/">several small projects</a> to help people learn the basics of Clojure, many of which cover the concept of data transformation using the Clojure standard library.</p>
<p>Added docs to <a href="https://practicalli.github.io/clojure/clojure-tools/data-browsers/rebl-data-visualization.html#configure-rebl-with-cider-for-spacemacs--emacs">use CIDER and Calva with REBL</a></p>
<h3 id="conjure---vim-tooling-for-clojure-development">Conjure - vim tooling for Clojure development</h3>
<p>Expanding the Clojure aware tools recommendations with Conjure, an excellent development environment for Neovim.</p>
<p>Created a <a href="https://gist.github.com/jr0cket/6c475137ee57fbb14f9289bd76889512">install walk through guide for Conjure</a> that supports those new to Neovim (as I was) which will be added to the <a href="http://practicalli.github.io/clojure/clojure-editors/">Clojure aware editors section</a> in Practicalli Clojure.  Also adding an <a href="https://gist.github.com/jr0cket/fc7c6ec08d584675105667a0e483a643">example init.vim</a> configuration that is documented and explains the purpose of the plugins included, supporting the adoption of the Conjure tool.</p>
<p>Planning a video of a REPL based workflow using <a href="https://github.com/Olical/conjure">Conjure</a> (and all other editors) to show the tool in action and support effective.</p>
<h2 id="clj-kondobabashkasci">Clj-kondo/babashka/sci</h2>
<p><strong>August 16-31</strong></p>
<p>Here is an overview of the work I did per project. During this period I focused mostly on a new babashka release,
<a href="https://github.com/borkdude/babashka/blob/master/CHANGELOG.md#v020-2020-08-28">v0.2.0</a>. Most of the issues worked on
in <a href="https://github.com/borkdude/sci">sci</a> also end up in
<a href="https://babashka.org/">babashka</a>.</p>
<h3 id="babashka">Babashka</h3>
<ul>
<li>Allow resources to be read from jar files <a href="https://github.com/borkdude/babashka/issues/528">#528</a></li>
<li>Add support for <code>clojure.datafy</code> in babashka <a href="https://github.com/borkdude/babashka/issues/468">#468</a></li>
<li>Use absolute paths rather than canonical paths on var metadata <a href="https://github.com/borkdude/babashka/issues/532">#532</a></li>
<li>Can&rsquo;t <code>set!</code> <code>*warn-on-reflection*</code> in babashka nREPL <a href="https://github.com/babashka/babashka.nrepl/issues/25">#25</a></li>
<li>Uberscript can put output of namespaces in wrong order <a href="https://github.com/borkdude/babashka/issues/535">#535</a></li>
<li>Support for uberjars <a href="https://github.com/borkdude/babashka/issues/536">#536</a></li>
<li>Ignore unresolved symbols while generating uberscript <a href="https://github.com/borkdude/babashka/issues/538">#538</a></li>
<li>Babashka shows wrong file name when error is from required ns <a href="https://github.com/borkdude/babashka/issues/508">#508</a></li>
<li>Print stacktrace, context and locals on exception <a href="https://github.com/borkdude/babashka/issues/543">#534</a></li>
</ul>
<p>I also started to work on <a href="https://github.com/babashka/babashka.process">babashka.process</a>, a library that will make it easier to work with <code>java.lang.ProcessBuilder</code>. This did not yet end up in a release.</p>
<p>Another sub-project I started working on is integrating clojure.spec with
babashka (<a href="https://github.com/borkdude/babashka/issues/558">#558</a>). It&rsquo;s unclear
if this will make it in babashka, but it will give me an idea if it&rsquo;s feasible
at all. According to a
<a href="https://twitter.com/borkdude/status/1299975678885072898">poll</a> 60% of babashka
user like to wait for spec2. An option is to include spec1 under a feature flag
for those who like to compile babashka on their own machines. Here is a <a href="https://github.com/borkdude/babashka/issues/558">Github
issue</a> where you can post your
ideas on this.</p>
<h3 id="sci">Sci</h3>
<ul>
<li>Fixed an with <code>with-redefs</code>: core vars could not be rebound <a href="https://github.com/borkdude/sci/issues/375">#375</a></li>
<li>Dynamic binding with <code>false</code> value is evaluated as <code>nil</code> <a href="https://github.com/borkdude/sci/issues/379">#379</a></li>
<li>Implement CI performance test <a href="https://github.com/borkdude/sci/issues/385">#385</a></li>
<li>Records produced by data readers are parsed as maps <a href="https://github.com/borkdude/sci/issues/386">#386</a></li>
<li>Support for callstack and locals for babashka <a href="https://github.com/borkdude/sci/issues/374">#374</a></li>
<li>Wrong arity reported when calling single-arity macro <a href="https://github.com/borkdude/sci/issues/392">#392</a></li>
<li>Implement <code>clojure.walk/macroexpand-all</code> <a href="https://github.com/borkdude/sci/issues/389">#398</a></li>
<li>Recursive function bound by var should not introduce local binding <a href="https://github.com/borkdude/sci/issues/384">#384</a></li>
</ul>
<h3 id="clj-kondo">Clj-kondo</h3>
<ul>
<li>Enhanced <code>rum/defcs</code> <a href="https://github.com/borkdude/clj-kondo/commit/9f004622d0c69a6baf93bb63243306a7098f0941">hook code example</a> (also see this <a href="https://github.com/borkdude/clj-kondo/issues/960">issue</a>)</li>
<li>Don&rsquo;t use return values from <code>analyze-input</code> invocations <a href="https://github.com/borkdude/clj-kondo/issues/972">#972</a>. This will make linting in parallel easier.</li>
<li>Work started on linting on parallel <a href="https://github.com/borkdude/clj-kondo/issues/632">#632</a></li>
<li>Catch calling non-functions as functions in bindings <a href="https://github.com/borkdude/clj-kondo/issues/948">#948</a></li>
</ul>
<h3 id="misc-1">Misc</h3>
<ul>
<li>Released <a href="https://github.com/borkdude/dynaload">dynaload</a> 0.1.0 to clojars</li>
<li>Released <a href="https://github.com/borkdude/clj-reflector-graal-java11-fix">clj-reflector-graal-java11-fix</a> 20.2.0</li>
<li>Released <a href="https://github.com/borkdude/jet">jet</a> v0.0.13</li>
</ul>
<h2 id="datahike">Datahike</h2>
<p><strong>August 16-31</strong></p>
<p>In the first iteration we started working primarily on analysis and planning on the following issues:</p>
<ul>
<li>Datomic API compatibility (<a href="https://github.com/replikativ/datahike/issues/196">https://github.com/replikativ/datahike/issues/196</a>)</li>
<li>Entity Specs (<a href="https://github.com/replikativ/datahike/issues/197">https://github.com/replikativ/datahike/issues/197</a>)</li>
<li>Homogeneous Tuple Value Type (<a href="https://github.com/replikativ/datahike/issues/104">https://github.com/replikativ/datahike/issues/104</a>)</li>
</ul>
<h3 id="datomic-api">Datomic API</h3>
<p>A comparison project was created that calls common functions from Datomic and Datahike in order to find out what functions differ. The result from this iteration will be a report that highlights the differences.</p>
<h3 id="entity-specs">Entity Specs</h3>
<p>Datomic&rsquo;s entity specs (<a href="https://docs.datomic.com/on-prem/schema.html#entity-specs">https://docs.datomic.com/on-prem/schema.html#entity-specs</a>) were analysed and a first draft for Datahike&rsquo;s system schema was derived. Further planning for integration into the current transactor was done.</p>
<h3 id="tuples">Tuples</h3>
<p>Homogeneous tuple value types were analysed both in DataScript and Datomic (<a href="https://docs.datomic.com/on-prem/schema.html#homogeneous-tuples">https://docs.datomic.com/on-prem/schema.html#homogeneous-tuples</a>) in order to understand the differences and to define a proper design that would fit well within our system schema.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2020 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2020-funding-announcement/</link>
      <pubDate>Sat, 29 Aug 2020 10:10:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2020-funding-announcement/</guid>
      <description>Clojurists Together is funding clj-kondo/babashka/sci, Datahike, Malli, and Practicalli</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q3 of 2020 (mid-August-mid-November) we are funding four projects:</p>
<ul>
<li><a href="https://github.com/borkdude/clj-kondo">clj-kondo</a>/<a href="https://github.com/borkdude/babashka">babashka</a>/<a href="https://github.com/borkdude/sci">sci</a> with Michiel Borkent</li>
<li><a href="https://github.com/replikativ/datahike">Datahike</a> with Konrad Kühne</li>
<li><a href="https://github.com/metosin/malli">Malli</a> with Tommi Reiman</li>
<li><a href="https://practicalli.github.io">Practicalli</a> with John Stevenson</li>
</ul>
<p>This is the first full funding round run under the Clojurists Together Foundation. It&rsquo;s taken us a little bit longer to get up and running this time, but future rounds should be much quicker.</p>
<h2 id="clj-kondobabashkasci">clj-kondo/babashka/sci</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding">What are you wanting to achieve with this funding?</h3>
<p><strong>clj-kondo</strong></p>
<p>High priority issues in clj-kondo are usually fixed very fast: in most cases
they are fixed and released within weeks. But there are several important
enhancements that have been in the backlog for a while. I have curated a list of
these issues and labeled them &ldquo;clj-together&rdquo;. They are prioritized in order of
importance on the project board:
<a href="https://github.com/borkdude/clj-kondo/projects/1?card_filter_query=label%3Aclj-together">https://github.com/borkdude/clj-kondo/projects/1?card_filter_query=label%3Aclj-together</a>
(see medium priority column).</p>
<p>A couple of examples:</p>
<ul>
<li>Lint files in parallel which speeds up linting entire projects</li>
<li>Add warnings for bindings shadowing vars, nested function literals, discarded
constants/pure expressions.</li>
</ul>
<p><strong>Babashka / Small Clojure Interpreter</strong></p>
<ul>
<li>Integration of clojure.spec into babashka</li>
<li>Add support for clojure.datafy</li>
<li>Port tests to Windows</li>
<li>Investigate possibility of implementing reify and deftype</li>
<li>Smaller sci CLJS builds by configuration</li>
<li>More control over duration / interrupts</li>
</ul>
<h3 id="why-is-this-project-important-to-the-clojure-community">Why is this project important to the Clojure community?</h3>
<p>Clj-kondo is a Clojure linter that is used by a wide variety of individual users
and companies
(<a href="https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md)">https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md)</a>.</p>
<p>Babashka is a scripting environment that can execute a significant subset of JVM
Clojure programs with instant startup. It is used by a individual users and
companies (<a href="https://github.com/borkdude/babashka/issues/254)">https://github.com/borkdude/babashka/issues/254)</a>. It is currently my
project with the most stars on Github.</p>
<p>Sci is the Clojure interpreter powering babashka and several other projects:</p>
<ul>
<li>Bootleg: An HTML templating CLI</li>
<li>Clj-kondo: Clojure linter</li>
<li>Chlorine: Atom editor plugin for Clojure</li>
<li>Malli: Plain data Schemas for Clojure/Script</li>
<li>Spire: Pragmatic provisioning using Clojure.</li>
</ul>
<h2 id="datahike">Datahike</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-1">What are you wanting to achieve with this funding?</h3>
<p>The following requested features can be added with the help of the funding:</p>
<ul>
<li><a href="https://github.com/replikativ/datahike/issues/104">tuple support</a></li>
<li>adjustment of the general API to Datomic&rsquo;s client API where possible for easier interaction, <a href="https://github.com/replikativ/datahike/issues/196">#196</a>, <a href="https://github.com/replikativ/datahike/issues/188">#188</a></li>
<li><a href="https://github.com/replikativ/datahike/issues/197">attribute predicates and entity specs</a></li>
<li><a href="https://github.com/replikativ/datahike/issues/151">lazy sequences for transactions</a></li>
</ul>
<h3 id="why-is-this-project-important-to-the-clojure-community-1">Why is this project important to the Clojure community?</h3>
<p>Within the Clojure Datalog database world Datahike provides a persistent open source solution for medium-sized projects with a relatively small and extensible code base. It supports a variety of persistent storages like JDBC or Redis. Additionally Datahike supports parts of the well-known Datomic API to better adapt to its functionality.</p>
<p>By adding ClojureScript support in the future, Datahike goes beyond the backend market with a vision of a distributed cross-platform system environment that speaks Datalog everywhere. With two commercial projects in progress, Datahike becomes more battle-tested in production environments.</p>
<p>The core team now consists of five people contributing to the core libraries with more people from the community building useful extensions like for example a <a href="https://github.com/purrgrammer/konserve-rocksdb">RocksDB store</a>, a <a href="https://github.com/replikativ/datahike/issues/205">console for database interaction</a>, or <a href="https://alekcz.gitbook.io/datahike-tuts">tutorials</a>.</p>
<h2 id="malli">Malli</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-2">What are you wanting to achieve with this funding?</h3>
<p>Malli is pre-alpha, 90% ready for the community. Due to private and business reasons, I haven&rsquo;t had enough extra time to lead out a robust stable version. With funding, I would have time to:</p>
<ol>
<li>
<p>get a stable release out! lot&rsquo;s of small and some bigger design decisions, tracked via <a href="https://github.com/metosin/malli/issues/116">metosin/malli#116</a></p>
</li>
<li>
<p>help early adopters (users and libraries like reitit, regal, aave and gungnir) to upgrade to use the initial version</p>
</li>
</ol>
<p>After the release, would work on the following:</p>
<ol start="3">
<li>
<p>finalize sequence schemas, <a href="https://github.com/metosin/malli/pull/187">https://github.com/metosin/malli/pull/187</a></p>
</li>
<li>
<p>enhance developer tooling:</p>
</li>
</ol>
<ul>
<li>function schemas with clj-kondo integration <a href="https://github.com/metosin/malli/issues/125">https://github.com/metosin/malli/issues/125</a></li>
<li>pull out and reuse the reitit development time error pretty printer as a separate library (<a href="https://github.com/metosin/virhe">https://github.com/metosin/virhe</a>)</li>
</ul>
<ol start="5">
<li>
<p>implement pluggable schema inference</p>
</li>
<li>
<p>parsers</p>
</li>
</ol>
<h3 id="why-is-this-project-important-to-the-clojure-community-2">Why is this project important to the Clojure community?</h3>
<p>Clojure is a data-oriented language and we should have a solid fully data-driven schema library too! Besides validation and value transformations, we should be able transform, persist, generate and infer schemas just like normal data. Malli tries to be  develop-friendly library to companion to other data-driven libs like EQL, Bidi, HoneySQL, Hiccup, Integrant, Reagent and Reitit.</p>
<p>Malli has an open development model, design decisions are discussed in slack (#malli) and in GitHub issues. Not a top goal, but eventually, Malli should be spec-compatible.</p>
<p>Despite being pre-alpha, malli has 21 contributors, 391 stars on github and 54k+ downloads on Clojars.</p>
<p>There is more background on my <a href="https://www.youtube.com/watch?v=MR83MhWQ61E">ClojureD talk</a>  and <a href="https://www.slideshare.net/metosin/malli-inside-datadriven-schemas">slides</a>.</p>
<h2 id="practicalli">Practicalli</h2>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-3">What are you wanting to achieve with this funding?</h3>
<p>Create high quality video tutorials to help spread awareness of Clojure to a wider developer audience.  Use selective content from the books to promote Clojure via articles on channels such as DZone, InfoQ, etc.</p>
<p><strong>1) Practicalli Clojure</strong></p>
<p>Extend the existing content with high quality video tutorials of REPL driven development.  Video tutorials will cover Clojure CLI, tools.deps, community tools (20+ tools in practicalli/clojure-deps.edn including kaocha, clj-new, depstar, depot, clj-kondo) unit test runners, test.check and continuous integration.</p>
<p><strong>2) Practicalli Clojure WebApps</strong></p>
<p>Extending the content on server-side webapps using Clojure CLI and tools.deps projects which already covers ring/compojure apps with unit tests, clojure.spec specifications all run through CircleCI continuous integration and deployed to the Cloud.   Adding Reitit, Duct, Juxt Edge and pedestal based projects which include further examples of component lifecycle management (mount, component, integrant). Data stores currently used are H2 and PostgreSQL and will be extended with Datomic and Crux and their associated security &amp; access management.</p>
<p><strong>3) Practicall ClojureScript</strong></p>
<p>Provide clear and up to date guides on ClojureScript development with Reagent and Re-frame, using figwheel-main and shadow-cljs.  Include video tutorials on using CIDER and Calva with these projects for highly interactive development experience.  To extend with Fulcro if time allows.</p>
<p>Funding will also provide more time for deeper subjects on the weekly live broadcast I am currently working on.</p>
<p>All content is freely available under a Creative Commons license. Code examples and projects will be available via the Practicalli GitHub organization and website.</p>
<h3 id="why-is-this-project-important-to-the-clojure-community-3">Why is this project important to the Clojure community?</h3>
<p>Helping the community to grow by providing quality content for people to learn,  share and help others more readily discover the joy of Clojure.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>July 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/july-2020-monthly-update/</link>
      <pubDate>Thu, 27 Aug 2020 10:00:54 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-2020-monthly-update/</guid>
      <description>Read more updates from Cider, Figwheel, Practicalli, and Re-frame</description>
      <content:encoded><![CDATA[<h2 id="new-members">New members</h2>
<p>Big welcome to our newest members, <a href="https://roamresearch.com">Roam Research</a> and <a href="https://www.cisco.com">Cisco</a>!</p>
<h2 id="cider">Cider</h2>
<p><strong>July 1-15</strong></p>
<ul>
<li>Got married :-)</li>
<li>My computer broke and I had to get a new one
<ul>
<li>Then I had to troubleshoot AMD GPU driver issues :-)</li>
</ul>
</li>
<li>Specified docs license (<a href="https://github.com/clojure-emacs/cider/issues/2740">https://github.com/clojure-emacs/cider/issues/2740</a>)</li>
<li>Tried to get CIDER&rsquo;s ClojureDocs integration working with ClojureScript, but it turned out to be more complex than I initially expected. I&rsquo;ll revisit this later. (<a href="https://github.com/clojure-emacs/cider/issues/2874">https://github.com/clojure-emacs/cider/issues/2874</a>)</li>
<li>Fixed a dependency bug in Orchard and cider-nrepl (<a href="https://github.com/clojure-emacs/orchard/issues/91">https://github.com/clojure-emacs/orchard/issues/91</a>)</li>
<li>Fix an eldoc issue on Emacs 28 (<a href="https://github.com/clojure-emacs/cider/issues/2875">https://github.com/clojure-emacs/cider/issues/2875</a>)</li>
<li>Cut a new Orchard release (0.5.11)</li>
<li>Bundle clojuredocs export with Orchard and cut version 0.6 (this eliminates the need to delete the data on demand when starting CIDER)</li>
<li>New docs sections
<ul>
<li>Code Evaluation (<a href="https://docs.cider.mx/cider/usage/code_evaluation.html">https://docs.cider.mx/cider/usage/code_evaluation.html</a>)</li>
<li>Working with Documentation (<a href="https://docs.cider.mx/cider/usage/working_with_documentation.html">https://docs.cider.mx/cider/usage/working_with_documentation.html</a>)</li>
<li>Profiling (<a href="https://docs.cider.mx/cider/debugging/profiling.html">https://docs.cider.mx/cider/debugging/profiling.html</a>)</li>
</ul>
</li>
<li>Various small documentation improvements</li>
<li>Discussed the addition of a potential UNIX socket transport for nREPL (<a href="https://github.com/nrepl/nrepl/pull/204">https://github.com/nrepl/nrepl/pull/204</a>)</li>
</ul>
<p>Between the unexpected wedding and my hardware issues I&rsquo;m a bit behind my schedule, but I still managed to do some pretty good progress. On the bright side - I feel I&rsquo;m way more productive with my new computer, especially when the GPU works. :D</p>
<p><strong>July 16-31</strong></p>
<p>Here&rsquo;s the latest update.</p>
<ul>
<li>Investigated a mysterious spike in the traffic of clojuredocs-edn.netlify.app (it was 4 times higher this month compared to the previous month) - half a terabyte of clojuredocs-export.edn</li>
<li>Released cider-nrepl 0.25.3 (mostly to address the complaints about downloading the ClojureDocs export automatically)</li>
<li>Released inf-clojure 3.0 (no new functionality, but massive improvements to the internals)</li>
<li>Released nREPL 0.8 (as promised in <a href="https://metaredux.com/posts/2020/06/15/nrepl-0-8-evolving-the-protocol.html">https://metaredux.com/posts/2020/06/15/nrepl-0-8-evolving-the-protocol.html</a>)</li>
<li>Extended the nREPL docs on building new middleware (<a href="https://nrepl.org/nrepl/building_middleware.html">https://nrepl.org/nrepl/building_middleware.html</a>)</li>
<li>Fixed cider-mode not being auto-activated for babashka (<a href="https://github.com/clojure-emacs/cider/issues/2882">https://github.com/clojure-emacs/cider/issues/2882</a>)</li>
<li>Documented how to manually update one&rsquo;s copy of the clojuredocs data</li>
<li>Merged Krell REPL support (<a href="https://github.com/clojure-emacs/cider/pull/2861">https://github.com/clojure-emacs/cider/pull/2861</a>)</li>
<li>Fixed an init bug when using babashka (<a href="https://github.com/clojure-emacs/cider/issues/2882">https://github.com/clojure-emacs/cider/issues/2882</a>)</li>
<li>Made connection-info babashka/generic nREPL server aware (<a href="https://github.com/clojure-emacs/cider/pull/2883">https://github.com/clojure-emacs/cider/pull/2883</a>)</li>
<li>Added cider-eval-list-at-point for evaluating code between paired delimiters (lists, vectors, etc)</li>
<li>Released CIDER 0.26 (&ldquo;Nesebar&rdquo;) (<a href="https://github.com/clojure-emacs/cider/releases/tag/v0.26.0">https://github.com/clojure-emacs/cider/releases/tag/v0.26.0</a>)</li>
</ul>
<p>I&rsquo;m glad that despite some unforeseen circumstances I managed to finish the funding cycle with several major releases!
There&rsquo;s a bit of work in progress that I plan to finish in the next couple of weeks and I&rsquo;ll credit ClojureDocs for supporting it:</p>
<ul>
<li>write a couple of blog posts about recent changes and the profiler</li>
<li>add more gif-like demos to the docs</li>
<li>polish the sideloading functionality (have user and system sideloading, add better docs)</li>
<li>add more examples of CIDER features in hard-cider</li>
</ul>
<h2 id="figwheel">Figwheel</h2>
<p><strong>July 1-15</strong></p>
<p>The past two weeks were mostly dedicated getting React Native support
up and running.</p>
<h4 id="configuring-ssl-certificate-hosts-with-ssl-valid-hosts">Configuring SSL certificate hosts with <code>:ssl-valid-hosts</code></h4>
<p>Added a new
<a href="https://figwheel.org/config-options#ssl-valid-hosts"><code>:ssl-valid-hosts</code></a>
option will let you configure which hostnames and ips the generated
certificate considers valid.</p>
<h4 id="react-native-support">React Native Support</h4>
<p>React Native support is complete!</p>
<p>The minimal configuration for a React Native project in
<code>figwheel.main</code> is now:</p>
<pre><code>^{:react-native :cli}
{:main example.main}
</code></pre>
<p>This also supports React Native Expo CLI as well.</p>
<p>React Native support includes the compiler passes from
<a href="https://github.com/vouch-opensource/krell">Krell</a> which allows
<code>js/require</code> of assets like CSS and images.</p>
<p>Also spent time getting good production compilation support as well.</p>
<p>Please see the new <a href="https://figwheel.org/docs/react-native.html">React Native figwheel
documentation</a> for more
details.</p>
<p>This is pretty exciting because the time to get a native app up and
and under development is quite fast. Using Figwheel to do these things
is great because we get the familiar Figwheel reloading patterns and
other bells and whistles.</p>
<p>As a final test I was able to create a MacOS app via
<a href="https://github.com/Microsoft/react-native-macos">react-native-macos</a>
and it just worked without a hitch.</p>
<p>I really hope folks give the new React Native support a try as it&rsquo;s a
joy to code a native app this way.</p>
<h4 id="released-figwheelmain-0210">Released <code>figwheel.main 0.2.10</code></h4>
<p>All of the above and more has been released in <code>figwheel.main 0.2.10</code>.</p>
<p><strong>July 16-31</strong></p>
<h4 id="fixes">Fixes</h4>
<ul>
<li>Fixed bug introduced by a refactor that broke <code>:connect-url</code> this
has been deployed to 0.2.11</li>
</ul>
<h4 id="updated-the-figwheelmain-template">Updated the figwheel.main template</h4>
<p>The figwheel main template was in need of some major updates.</p>
<ul>
<li>om support has been removed</li>
<li>added the <code>+npm-bundle</code> option</li>
</ul>
<p>The <code>+npm-bundle</code> option will generate a Figwheel project that uses
the Figwheel&rsquo;s new <code>:auto-bundle</code> feature and is a quick way to get
started with NPM in a Figwheel project.</p>
<p>I went through all the permutations of the CLI options for each to
ensure that the template works for the different tools and frameworks
and fixed several bugs in the process.</p>
<h4 id="added-a-tutorialdoc-on-how-to-use-nodejs-with-figwheel">Added a tutorial/doc on how to use Nodejs with Figwheel</h4>
<p>It&rsquo;s always been possible to use Figwheel to develop Nodejs
applications in ClojureScript. But it certainly isn&rsquo;t that clear how
to do so.</p>
<p>I added a document that shows how to set up a Nodejs application
including an example of how to create a hot reloadable <code>express</code>
application.</p>
<h4 id="much-much-thanks">Much Much thanks!</h4>
<p>A big thanks again to everyone who has come together to support this
work. All in all it has allowed me to make some major improvements. My
hope is that folks will find time to try out these new features, if
anyone encounters any problems please let me know.</p>
<h2 id="practicalli">Practicalli</h2>
<p><strong>July 1-15</strong></p>
<p>Continuous integration and deployment was the main focus of this period, with some Clojure spec generative testing.</p>
<p>Added Practicalli website and YouTube channel to the <a href="https://clojure.org/community/resources">Clojure.org community resources</a>.</p>
<h4 id="practicalli-study-group">Practicalli study group</h4>
<p>Continuing a tools theme by setting up continuous integration (CI) for Clojure projects.  The CI service partially written in Clojure provides good support for Clojure projects.  Building on CircleCI to deploy Clojure applications to the Cloud using the Heroku service.</p>
<p>Broadcasts also cover using Kaocha generative test runner, both locally and on CircleCI</p>
<ul>
<li><a href="https://youtu.be/WLcaXuAH1Ew">077 - Continuous Integration - Clojure deps.edn and Leiningen projects</a></li>
<li><a href="https://youtu.be/sXZKrD4cAFk">78 - Continuous Integration - Clojure deps.edn projects and CircleCI</a></li>
<li><a href="https://youtu.be/P0D3W_ugfdA">079 - Continuous Integration - Deploying deps.edn project on Heroku via CircleCI</a></li>
</ul>
<p>Content developed for Practicalli Clojure and Practicalli Clojure Webapps books.</p>
<h4 id="practicalli-clojure">Practicalli Clojure</h4>
<p>Created several guides for new and existent projects, using CircleCI as a continuous integration service.  Kaocha is also used to run generative tests as well as unit tests.</p>
<p>Created <a href="http://practicalli.github.io/clojure/testing/integration-testing/circle-ci/random-clojure-function.html">an introduction to CircleCI as a continuous integration service</a> and identified and documented recommended docker images to use for Clojure deps.edn and Leiningen projects.  The CircleCI examples are a little dated and includes only Leiningen project examples.</p>
<p><strong>Random Clojure Function project</strong>.
Created a guide to develop a project that <a href="http://practicalli.github.io/clojure/simple-projects/random-clojure-function.html">generates a random function</a> from the namespaces available in the REPL or the functions from specified namespaces.</p>
<p>Using the <a href="http://practicalli.github.io/clojure/simple-projects/random-clojure-function.html">random Clojure function project</a>, created a <a href="http://practicalli.github.io/clojure/testing/integration-testing/circle-ci/random-clojure-function.html">guide to develop a project with the help of CircleCI</a> as the continuous integration service.</p>
<p><strong>Banking on Clojure</strong>
Updated the <a href="http://practicalli.github.io/clojure/clojure-spec/projects/bank-account/">banking-on-clojure project</a> using a TDD approach with Clojure spec.</p>
<p>Using Kaocha test runner run unit tests and Clojure spec generative tests locally and via CircleCI. Kaocha can run the same tests as clojure.spec.test.alpha/test function calls, without having to add code to the project. Adding the spect-check-plugin via the test.edn config did not run the generative tests, only the unit tests. Use the spec-test-check plugin to run the reports works when included as a command line flag.</p>
<h4 id="practicalli-clojure-webapps">Practicalli Clojure Webapps</h4>
<p>Created <a href="https://practicalli.github.io/clojure-webapps/projects/status-monitor-deps/">a guide to deploy a Clojure application via CircleCI onto Heroku</a>. Think of Heroku as AWS without the cognative load to use it, simply push source code to Heroku and it builds and deploys the resulting application.</p>
<p>Updated the status monitor project to deps.edn to use as the basis for a guide to deploy Clojure applications via CircleCI to Heroku (a cloud platform as a service). The project takes a simple approach so the focus remains on the continuous integration pipeline.</p>
<p>CircleCI has an Heroku Orb, providing common configuration for deploying to Heroku.  The Heroku orb is used to deploy the project from its source code, building an uberjar and running the application from that uberjar.</p>
<p>Updated details of using postgresql with Clojure (documentation will be extended soon) and recommended next.java as a library to use for SQL.</p>
<p>Simplified the overall navigation on the Practicalli Clojure Webapps book.</p>
<h4 id="practicalli-spacemacs">Practicalli Spacemacs</h4>
<p>Rewrite of the switch to develop page, using in-page tabs to simplify the guide into the two different approaches.</p>
<h4 id="hacking-on-spacemacs">Hacking on Spacemacs</h4>
<p>Added key bindings to refactor namespace forms in clojure-mode</p>
<p><code>&quot;ran&quot; 'clojure-insert-ns-form</code>
<code>&quot;raN&quot; 'clojure-insert-ns-form-at-point</code>
<code>&quot;rsn&quot; 'clojure-sort-ns</code></p>
<p>Updated <a href="https://github.com/practicalli/spacemacs.d/">practicalli/.spacemacs.d</a> repository with doom modeline configuration, providing a very clean and simple UI experience for Emacs whilst still providing the most useful information.</p>
<p><strong>July 16-31</strong></p>
<p>Started series called Banking on Clojure to cover application servers, sql and relational databases.  This will cover the full development and deployment workflow, including clojure.spec for specifications and generative testing.</p>
<p>Added more tools to practicalli/clojure-deps-edn</p>
<p>Add anchors to all sub-headings across all books, making content easier to navigate by enabling navigation to specific sections in a page.  This helps keep relevant information together on one page and reference a specific section from other pages.</p>
<h4 id="practicalli-clojure-webapp">Practicalli Clojure WebApp</h4>
<p>Started a section on <a href="https://practicalli.github.io/clojure-webapps/app-servers/">Application servers</a>, covering approaches to server configuration and server start/stop/reload.</p>
<p>Started a section on Databases that will initially cover H2 and Postgresql relational databases, using Sql with next.jdbc</p>
<p>Created Banking on Clojure WebApp content for the live broadcasts and book.  The project uses CircleCI for continuous integration and Heroku pipelines for deployment to staging and production.</p>
<h4 id="practicalli-clojure-1">Practicalli Clojure</h4>
<p>Configure REPL startup using <code>dev/user.clj</code> file and <code>:dev</code> alias in practicalli/clojure-deps-edn configuration.  Added examples of <a href="http://practicalli.github.io/clojure/clojure-tools/configure-repl-startup.html">requiring namespaces and starting component lifecycle services at REPL startup</a> added to Practicalli Clojure book.</p>
<p>Add section on <a href="https://practicalli.github.io/clojure/clojure-tools/data-browsers/">data browser tools</a>, extending REBL and Clojure Inspector with new projects Reveal and Portal.</p>
<h4 id="practicalliclojure-deps-edn">practicalli/clojure-deps-edn</h4>
<p>Identified main purpose of the practicalli/clojure-deps-edn project, to provide a large set of meaningful and consistently named aliases that would be available in all projects and less likely to be over-ridden by project specific deps.edn configuration.</p>
<p>Any experimental or alpha state tools are clearly marked as &lsquo;experimental - used at own risk&rsquo; to set clear expectations.</p>
<p>Updated libraries used in aliases are using their fully qualified names, e.g. cider/cider-nrepl as this will be required for future versions of the Clojure CLI tool.</p>
<p>Added Google Storage mirrors for Maven Central for Americas, Asia and Europe to library repository configuration.  Also added a community mirror in Asia (China) for Clojars.</p>
<p>Recent alias additions include</p>
<ul>
<li><code>:dev</code> - include the `/dev/ path to configure REPL startup with a /dev/user.clj file</li>
<li><code>rebel-nrepl</code> - run rebel REPL with nrepl connection for editor connections (eg. CIDER, Calva)</li>
<li><code>:nrebl</code> - REBL data browser on nREPL connection (e.g. CIDER, Calva)</li>
<li><code>:deploy-locally</code> to add a jar to _/.m2 directory</li>
<li><code>:deploy-clojars</code> to deploy a jar on clojars.org</li>
<li><code>:deploy-clojars-signed</code> to sign and deploy a jar on clojars.org</li>
<li><code>:carve</code> - a new project to carve out unused vars in code</li>
<li><code>:repl-reveal</code> - a REPL with data browser</li>
</ul>
<h4 id="practicalli-spacemacs-1">Practicalli Spacemacs</h4>
<p>Add Emacs profiler use to the <a href="https://practicalli.github.io/spacemacs/install-spacemacs/troubleshooting.html">Spacemacs troubleshooting guide</a></p>
<h4 id="pull-requests">Pull requests</h4>
<ul>
<li>carve - fixed alias in docs</li>
</ul>
<h2 id="re-frame">Re-frame</h2>
<p>Most of the Clojurists Together work was completed in the first sprint earlier in the year in May.</p>
<p>However we have released a stable v1.0.0 version of re-frame which is major milestone in the project&rsquo;s history.</p>
<p>Also, many improvements to the docs have been made recently. Too many to mention but some are notable:</p>
<ul>
<li>added a new FAQ on <a href="https://day8.github.io/re-frame/FAQs/laggy-input/">laggy input</a></li>
<li>added a new FAQ on <a href="https://day8.github.io/re-frame/FAQs/FocusOnElement/">field focus</a></li>
<li>added to existing FAQ on <a href="https://day8.github.io/re-frame/FAQs/GlobalInterceptors/#answer-v100-onwards">global interceptors</a></li>
<li>Additions made to <a href="https://day8.github.io/re-frame/External-Resources/">External-Resources</a></li>
<li>completely reworked <a href="https://day8.github.io/re-frame/event-handling-infographic/">Infographics for Dominoes 1,2 3</a></li>
<li>completely reworked <a href="https://day8.github.io/re-frame/Interceptors/#infographics">Infographics for Interceptors</a>. See also other explanations added to that tutorial.</li>
</ul>
<p>Also:</p>
<ul>
<li>closed #590</li>
<li>created #627 and developed a corresponding PR #628</li>
<li>React native and other niggles resolved in v1.0.0-rc* releases. See #604  #614  #615.</li>
</ul>
<p>Numerically, we&rsquo;re at 16 issues and 4 pull requests.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>June 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/june-2020-monthly-update/</link>
      <pubDate>Thu, 09 Jul 2020 10:00:54 +0800</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/june-2020-monthly-update/</guid>
      <description>Read more updates from Fireplace, Cider, Figwheel, Practicalli, Re-frame, and Clojars</description>
      <content:encoded><![CDATA[<h2 id="fireplace">Fireplace</h2>
<ul>
<li>Implemented eval backgrounding.  Press CTRL-D during any interactive eval to
detach from it and continue using Vim.  The results will open in a preview
window when finished.</li>
</ul>
<h2 id="cider">Cider</h2>
<p><strong>June 1-15</strong></p>
<p>Here&rsquo;s an update broken by project:</p>
<h5 id="nrepl">nREPL:</h5>
<ul>
<li>fixed handling of aliased symbols in lookup middleware</li>
<li>added var type to completion candidates</li>
<li>cut nREPL 0.8.0-alpha1 and wrote a blog post about it</li>
<li>small documentation fixes</li>
<li>discussed with other tool authors adding some runtime info to the describe op</li>
</ul>
<h5 id="cider-1">CIDER:</h5>
<ul>
<li>Improved support for Babashka.</li>
<li>Wrote docs on using CIDER with Babashka (and without Clojure in general).</li>
<li>Fixed a couple of small bugs with REPL warning messages.</li>
<li>Did some work towards making CIDER a bit Clojure-agnostic, so it&rsquo;s easier to use it with flavours of Clojure and other programming languages.</li>
<li>Started work on sideloading support and all the nREPL 0.8 features.</li>
<li>Reviewed a proposal for making auto-trimming REPL output (<a href="https://github.com/clojure-emacs/cider/pull/2857">https://github.com/clojure-emacs/cider/pull/2857</a>)</li>
<li>Misc documentation improvements.</li>
</ul>
<h5 id="misc">Misc:</h5>
<ul>
<li>Helped with adding print middleware support to shadow-cljs</li>
<li>Helped with adding eldoc support to babashka.nrepl</li>
</ul>
<p><strong>June 16-30</strong></p>
<p>Here&rsquo;s the latest update.</p>
<h5 id="nrepl-1">nREPL</h5>
<ul>
<li>Issued several alphas including small fixes to the new lookup and completion logic.</li>
</ul>
<h5 id="cider-2">CIDER</h5>
<ul>
<li>Fixed eldoc for <code>.</code> and <code>..</code>.</li>
<li>Merged and polished REPL auto-trimming functionality (<a href="https://github.com/clojure-emacs/cider/pull/2857)">https://github.com/clojure-emacs/cider/pull/2857)</a>.</li>
<li>Implemented initial support for sideloading.</li>
<li>Started migration from Cask to Eldev for the project management.</li>
<li>Reviewed and merged a couple of small bug fixes.</li>
<li>Make some small improvements to the docs.</li>
<li>Spent some time thinking on how to improve the eval handler creation in CIDER (e.g. by using an alternative API with named params)</li>
<li>Investigated the xref.el API in relation to <a href="https://github.com/clojure-emacs/cider/issues/2831">https://github.com/clojure-emacs/cider/issues/2831</a></li>
</ul>
<h5 id="cider-nrepl">cider-nrepl</h5>
<ul>
<li>Issued to a bug-fix release that workarounds an incompatibility between clj-suitable and shadow-cljs 2.10.</li>
</ul>
<h5 id="orchard">orchard</h5>
<ul>
<li>Merged a fix for a problem that caused orchard to hit the JVM max open files limits. (<a href="https://github.com/clojure-emacs/orchard/pull/95">https://github.com/clojure-emacs/orchard/pull/95</a>) Will issue a bug-fix release covering this soon.</li>
</ul>
<h2 id="figwheel">Figwheel</h2>
<p><strong>June 1-15</strong></p>
<p>The last two weeks I spent some time documenting the NPM features a
bit more. Then I turned my attention to what I call the Jetty
conflicts problem. Which eventually lead me to investigate SSL support
and how to make connecting to a Figwheel server over HTTPS even
easier.</p>
<p>I also spent quite a bit of time looking into some advanced
compilation problems that occur when you are switching from Cljsjs
based project to an NPM <code>:bundle</code> based project. This lead me to
finally implement a <code>--clean</code> command which makes it easier to clean
your compiled artifacts out of your project.</p>
<h4 id="the-jetty-conflicts-problem">The Jetty conflicts problem</h4>
<p>The Jetty conflicts problem has dogged <code>figwheel-main</code> from the
beginning.</p>
<p>How did we get here? I switched to Jetty thinking that it would be
better to use the most common server used for Clojure development
(<code>ring-jetty-adapter</code>) and eliminate some bloat while making things
like configuring HTTPS easier. I didn&rsquo;t realize that switching to
Jetty would cause so many headaches for folks.</p>
<p>The main problem is that the way Jetty is packaged, makes version
conflicts extremely easy when we use slightly uncommon packages like
<code>org.eclipse.jetty.websocket/websocket-servlet</code> and
<code>org.eclipse.jetty.websocket/websocket-server</code>.</p>
<p>Jetty is developed across several &ldquo;independent&rdquo; packages.
Unfortunately these &ldquo;independent&rdquo; packages are tightly coupled so you
need to ensure that you are running the same version number for each
required Jetty package.</p>
<p>This gets easily thrown out of whack when another dependency like
<code>datomic-cloud</code> includes a Jetty dependency that is newer than the
Jetty dependency in Ring. The main problem is a UX problem because
when a conflict occurs the errors are about missing classes or methods
deep in Jetty leaving the user with little to go on.</p>
<p>I spent time looking at the server code and considering whether I
should get rid of the Jetty websocket packages and just use the HTTP
long-polling already in ring for the connection, or perhaps making the
websocket connection conditional on having an additional
figwheel-websocket package. I also looked at maybe going back to using
httpkit. All of these solutions were less than ideal.</p>
<p>Then it came to my attention that then next major release of Ring is
going to include websocket support. So I decided to just punt on this
until then and see if that improves things.</p>
<p>As it stands right now, I&rsquo;ve updated to the latest Ring which has a
fairly recent version of Jetty and this should reduce collisions for
the time being.</p>
<h4 id="https-support">HTTPS support</h4>
<p>The look at the Jetty conflict problem drew me to consider the
necessity of using websockets, and considering if http long polling
could work.</p>
<p>The figwheel-main long polling support works really well, but it
becomes a problem if you are serving your development application with
SSL. That would require using HTTPS in figwheel as well for
long-polling to work.</p>
<p>Even though I decided not to use long-polling, this did lead me to
investigate how to make setting up HTTPS in <code>figwheel-main</code> easier.
Situations where folks are required to use HTTPS during development
are becoming more common and I wanted to see if I could make it
easier.</p>
<p>I eventually added a <code>:use-ssl</code> configuration option which is sure
that sets up and changes figwheel configuration to support SSL,
currently it still requires that you set up a Java Keystore. However I
wanted the <code>:use-ssl</code> option to work even if you didn&rsquo;t have a Java
Keystore configured.</p>
<p>Setting up a local dev certificate and getting into the form of a JAva
Keystore can be pretty esoteric. Creating a certificate, trusting it
in order to eliminate browser warings, and doing this all securely is
fairly challenging.  This eventually lead to the creation of the
<a href="https://github.com/bhauman/certifiable"><code>certifiable</code></a> library to
ease the creation of a local dev certificate and Java Keystore. Using
<a href="https://github.com/bhauman/certifiable"><code>certifiable</code></a> should enable
<code>figwheel-main</code> to have turn-key HTTPS support.</p>
<h4 id="cleaning">Cleaning</h4>
<p>While <code>lein-figwheel</code> has support for cleaning up your compiled
development artifacts <code>figwheel-main</code> has chosen to allow you to
implement your own cleaning. Well, I&rsquo;ve finally added cleaning to
<code>figwheel-main</code>.  You can either add the <code>--clean</code> to your CLI options
or or <code>:clean-ouputs true</code> to your Figwheel options.</p>
<p>This will clean all of your builds compilation output including
generated bundles AND all of the compiled output from and extra-mains
that you have configured as well.</p>
<p>Clean is a better option in many cases when you just want to target
what you are currently woring on.</p>
<p>It&rsquo;s handy to leave <code>--clean</code> or <code>:clean-outputs</code> in your
configuration while you work on debugging something.</p>
<p><strong>June 16-30</strong></p>
<p>Things are really moving along great! For the last two weeks I worked
on two main things. I spent most of my time working on getting
<a href="https://github.com/bhauman/certifiable">certifiable</a> up and working
well on MacOS, Linux and Windows along with integrating it into
figwheel-main to enable zero-config HTTPS support.</p>
<p>Along with that during the last couple of days I&rsquo;ve been getting
<a href="https://reactnative.dev/">React Native</a> support started.</p>
<h4 id="very-simple-https-configuration">Very Simple HTTPS Configuration</h4>
<p>Continued work on Certifiable to make it robust enough that it can
dependably create a Java Keystore across common platforms.</p>
<p>This allowed me to finish the implementation of the <code>:use-ssl</code>
Figwheel Option which completely automates the configuration of
Figwheel&rsquo;s server to use HTTPS.</p>
<p>Usually setting up your local server as an HTTPS server is tedious
combination of searching the web and several rounds of trial and
error. Now you can just set <code>:use-ssl true</code> and Figwheel will start
using HTTPS including a secure websocket.</p>
<p>Next steps are to allow users to provide the hostnames and ips they
want the certificate to be configured for.</p>
<p>This will ultimately be very helpful when you are interacting with
applications remote to the computer running the Figwheel, like on a
smartphone or touch pad.</p>
<p>Also started on the documentation for <code>:use-ssl</code>
<a href="https://figwheel.org/docs/https.html">here</a>.</p>
<h4 id="react-native-support">React Native Support</h4>
<p>I was able to complete an initial pass at React Native support.</p>
<p>The goal is to allow you to simply create a Figwheel project in the
root directory of a React Native CLI or React Native Expo project.</p>
<p>One can now set the new <code>:react-native</code> Figwheel option to <code>true</code> and
it will take care of the mechanics of hooking up Figwheel to the React
Native project.</p>
<p>The initial pass at this for React Native CLI is finished.</p>
<p>One problem is that the <code>npm_deps.js</code> file is regenerated on every
compile which causes the metro bundler to reload the whole application
on every compile. I solve this by creating a separate source directory
and copying <code>npm_deps.js</code> there only when it changes.</p>
<p>I will probably be working on React Native for the next two weeks as
there are several things that need to be done to make it all work well.</p>
<p>The most important problems to solve are:</p>
<ul>
<li>allowing asset requires in cljs code for images, json, css, etc.
this will be taken from krell</li>
<li>allowing customization of the index.js file</li>
<li>providing a good pattern to support compiling for production</li>
<li>providing good documentation</li>
</ul>
<h4 id="thanks-again">Thanks Again!</h4>
<p>As always I want to thank everyone for this opportunity to dedicate
time to Figwheel.</p>
<p>I hope everyone is staying safe, and is finding time to care for
themselves, their loved ones and their community.</p>
<h2 id="practicalli">Practicalli</h2>
<p><strong>June 1-15</strong></p>
<p>Continued with Practicalli Clojure updates and weekly broadcasts covering Clojure spec and generative testing.  Also updates on Practicalli Spacemacs, including a move to doom modeline theme for a clean and modern look to Spacemacs.</p>
<p>I was still feeling the affects of illness for some of this period, but steadily improving.</p>
<h4 id="practicalli-study-group">Practicalli Study Group</h4>
<p>Designing specifications for an online bank and basic generative testing video added to the <a href="https://www.youtube.com/playlist?list=PLpr9V-R8ZxiBWGAuncfBRYhZtY5-Bp75s">Practicall Clojure Spec playlist</a></p>
<h4 id="practicalli-clojure-updates">Practicalli Clojure Updates</h4>
<p>Adding content and videos to the <a href="http://practicalli.github.io/clojure/clojure-spec/">Introducing Spec section</a> of the book, providing live code examples via klipse enabling the reader to interact with the specs and functions in the Practicalli Clojure book website.</p>
<p>Spec is introduced by showing how it can be used in the REPL and added to project, with the leveraging-spec project containing many different examples.</p>
<p>Divided the Spec section into Spec data, that covers how the use of predicates, literals and custom functions as specifications along with the core functions to verify data against specs (conform, valid?, explain).</p>
<p>Expanded on Getting Started section, converting to Clojure CLI and tools.deps. Examples on using Clojure CLI tools to evaluate functions, load files and run applications.</p>
<p>Added details on configuring tools.deps and how to define and use multiple aliases.  Provided a collection of aliases for community tools, jcenter clojars mirror and how to use a local Artifactory instance.</p>
<p>Added section rebel readline for a feature rich command line REPL, including install, customisation and major features.</p>
<p><a href="https://practicalli.github.io/clojure/repl-driven-development/configure-repl-startup.html">Configuring a REPL on startup for deps.edn projects</a>, examples of using <code>dev/user.clj</code> to require namespaces, call functions and manage component lifecycle services (mount, component, integrant, etc.).</p>
<h4 id="clojure-depsedn-updates">Clojure deps.edn updates</h4>
<ul>
<li>Using REBL from Emacs CIDER using nREBL middleware, alias and configuration</li>
<li>Add example of a local Artifactory instance for a repository provider</li>
<li><code>:dev</code> alias - used to configure the Clojure repl automatically on startup by evaluating the content of <code>dev/user.clj</code></li>
<li>Update of dependency versions in the <code>deps.edn</code> file with depot</li>
<li>Update unit testing aliases, add separate expectation aliases.</li>
<li><code>:test-path</code> alias - enable Emacs CIDER and other tools to add the test directory to the classpath</li>
</ul>
<h4 id="practicalli-spacemacs-updates">Practicalli Spacemacs Updates</h4>
<p>Added page on calling component lifecycle services when refreshing the REPL from CIDER.</p>
<p>Updated practicalli/spacemacs.d to use doom modeline and doom-gruvbox-light theme to give a modern and clean look to Spacemacs.</p>
<p><strong>June 16-30</strong></p>
<p>After the broadcasts on Clojure spec, moving on to more tooling centric topics.  Starting with Unit test runners for Clojure CLI tool and preparing a series on continuous integration, packaging and deployment.</p>
<p>Flu symptoms have finally eased, so planning video tutorials in the later part of the sponsorship.</p>
<h4 id="practicalli-study-group-1">Practicalli Study Group</h4>
<p>Wrap up of Clojure spec series of 5 broad, sharing my experiences with spec along with feedback from many others in the community.</p>
<p>Broadcast on unit testing and test runners, focusing on Cognitect Labs test runner and Koacha from Lambda Island.</p>
<h4 id="practicalli-clojure">Practicalli Clojure</h4>
<p>Updated and extended the Getting Started section, using rebel readline for the command line REPL UI.  Added sections on configuring Clojure CLI and provided a wide range of community tools and other useful aliases.</p>
<p>Wrote a new section on Clojure Spec and generative testing, covering how to design specifications (composite vs hierarchical).  Also discussed organising specifications and how they fit into a project and along side Test Driven Development (TDD) and REPL drive development (RDD).</p>
<p>Wrote section on Regular Expressions in Clojure.  Added regular expressions for common string patterns, such as passwords, email addresses, etc.</p>
<p>Extended the Unit Testing section to cover useful practices with clojure.test library, refactor is assertions with are to work over data sets.</p>
<p>Added test runner section covering Cognitect Labs test runner and configuring categories of tests.  Started a section on kaocha covering the basic use and configuration.  This section to be extended as more projects are used with kaocha.</p>
<p>Configured git template to use live branch as the default branch name.  The word master has never made any sense as a term in a distributed version control system.</p>
<p>Added <code>:test-runner-cljs</code> alias to practicalli/clojure-deps-edn for the cljs-test-runner from Olical.  A test runner inspired by Cognitect Labs test runner for Clojure.</p>
<p>Discussion regarding some defacto approaches and conventions for Clojure tools.deps projects, especially around the idea of naming of aliases.  The practicalli/clojure-deps-edn repository is an example of how 30+ aliases could be defined to provide the most common tooling for all tools.deps projects.</p>
<h4 id="practicalli-clojurescript">Practicalli ClojureScript</h4>
<p>Clarified the introduction to the ClojureScript book status and surfaced the work that remains current and functional. This content includes and several reagent based projects, building and deploying a ClojureScript website for ClojureBridge and creating a TicTacToe game with Scalable Vector Graphics.</p>
<p>Depreciated content developed several years ago, as much has changed in the ClojureScript world since then. The older content is still available and will be updated during July 2020 and onward.</p>
<h4 id="practicalli-spacemacs">Practicalli Spacemacs</h4>
<p>Using CIDER test runner in Spacemacs with Clojure CLI projects.  Covering the Spacemacs specific key bindings, and how to configure the CIDER test runner in Spacemacs.</p>
<p>Hint on turning off custom themes to get the classic Emacs look.  The theme called default looks the same as classic Emacs.</p>
<p>Created a reference sheet for CIDER configuration variables, as there is no overall reference.</p>
<p>Using .dir-locals.el for project specific configuration.</p>
<h4 id="spacemacs-pull-requests">Spacemacs Pull Requests</h4>
<p>Refactor applications menu key bindings to create more room for key bindings and improve mnemonic keybinding use.  Sub menus added using the layer categories of the packages any existing key bindings originate from.</p>
<h2 id="re-frame">Re-frame</h2>
<p><strong>June 1-30</strong></p>
<p>As we had been working almost full-time on re-frame over the prior period we took a break from re-frame over this period and expect to resume work on re-frame&rsquo;s meatier enhancement proposals in July.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together Summer of Bugs Selections</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-summer-of-bugs-selections/</link>
      <pubDate>Wed, 24 Jun 2020 06:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-summer-of-bugs-selections/</guid>
      <description>The Summer of Bugs selections are: clj-kondo vim-iced, DataScript, Calva, reitit, Keycloak-Clojure, cljc.java-time</description>
      <content:encoded><![CDATA[<p>About a month ago we <a href="/news/announcing-summer-of-bugs/">solicited proposals</a> for a new funding project we are calling Summer of Bugs. Developers can apply for $500 or $1,000 funding to work on a project that they maintain or contribute to. Summer of Bugs awards are smaller in scope than our three month projects and don&rsquo;t require the grantee to be a maintainer of the project they are applying for. This means that we have been able to accept applications from a wider range of developers, and fund different kinds of projects which don&rsquo;t need three months work.</p>
<p>In our first round of funding we are funding $6,500 USD to clj-kondo vim-iced, DataScript, Calva, reitit, Keycloak-Clojure, and cljc.java-time. Below is a description of the projects and developers we are funding.</p>
<p>We&rsquo;d like to say a big thanks to all Clojurists Together <a href="/members/">members</a> for your help in funding these projects. In particular we&rsquo;d like to thank new company members Latacora, Clubhouse, and Solita for helping to provide funding for these grants.</p>
<h2 id="clj-kondo">clj-kondo</h2>
<p>Michiel Borkent is the maintainer of clj-kondo. Clj-kondo is used by a lots of <a href="https://github.com/borkdude/clj-kondo/blob/master/doc/companies.md">companies</a>. It has 18,000 downloads in the Visual Studio marketplace.</p>
<p>Michiel plans to make it possible for clj-kondo users to deal with arbitrary custom macros, like Rum&rsquo;s defc macro, slingshot&rsquo;s try+ or core.match. See <a href="https://github.com/borkdude/clj-kondo/issues/811">this</a>.</p>
<p>This project will receive a grant of $1,000USD.</p>
<h2 id="vim-iced">vim-iced</h2>
<p>Iizuka Masashi is a maintainer of vim-iced and has implemented docstring references in a plain nREPL environment. vim-iced is the only one that provides practical and interactive Clojure development environment for both Vim and Neovim. With the advent of babashka and babashka.nrepl, there are now more nREPL servers that are easy to use. By supporting them, we can make development in Clojure easier and more efficient.</p>
<p>Iizuka&rsquo;s plan is to test integration (individual or full execution) even when connected to a plain nREPL server.</p>
<p>This project will receive a grant of $500USD.</p>
<h2 id="datascript">DataScript</h2>
<p>Nikita Prokopov is the author and maintainer of DataScript. It is a popular Clojure/Script project that is unique to Clojure community, providing a competitive advantage to everyone using Clojure.</p>
<p>Nikita&rsquo;s plan is to catch up DataScript API with what latest Datomic offers.</p>
<ul>
<li>Return maps in query <a href="https://github.com/tonsky/datascript/issues/322">https://github.com/tonsky/datascript/issues/322</a></li>
<li>Composite tuples data type <a href="https://github.com/tonsky/datascript/issues/323">https://github.com/tonsky/datascript/issues/323</a></li>
<li>Pull :as keyword <a href="https://github.com/tonsky/datascript/issues/350%22">https://github.com/tonsky/datascript/issues/350&quot;</a></li>
</ul>
<p>This project will receive a grant of $1,000USD.</p>
<h2 id="calva">Calva</h2>
<p>Peter Strömberg is the creator and main contributor to Calva. For the Calva experience, there are some quality issues with the REPL window so for some newcomers to Clojure, it taints their experience with the language as well. Clojure is a joy to use, and so should the IDE tooling be too.</p>
<p>Calvas REPL Window is an ambitious project. Due to the nature of VS Code API, the window is implemented in a Webview as a full Clojure editor, with formatting, syntax highlighting, paredit, the lot. (Think a Clojure only CodeMirror.) But it is too ambitious for the Calva project and a constant source of friction and bugs. In addition to that, the VS Code team seems to not have the time to fix some important issues with the Webview API, making fixing some of the REPL window bugs unreachable for the Calva devs.</p>
<p>Peter would like to eventually get rid of the REPL window. But first, he needs something that can replace it for the developers who fancy the workflow it offers. Some of Peter&rsquo;s quick experiments seem to confirm that he could use regular files, and Calva could have commands to create these ”REPL files”, to ”pair” them with project files/namespaces, and to make it easy to evaluate code in them in a predictable way. This is easy in project files, so he would almost be done ones Calva can help create and handle the REPL files, but he would still need to try. According to him, as far as he understand things, it would be quite similar to the CIDER REPL buffers, even if he thinks he is going for an even more file-like experience.</p>
<p>He also thinks that with some reasonable amount of work he&rsquo;d be able to release it as an experimental feature for users to opt in. But further down the line, he hopes for being able to stop maintaining the REPL window and get rid of a whole category of quality issues with Calva.</p>
<p>This project will receive a grant of $1,000USD.</p>
<h2 id="reitit">reitit</h2>
<p>Tommi Jalkanen an experienced user of reitit. He has previously contributed to reitit by fixing some typos in this <a href="https://github.com/metosin/reitit/pull/211">documentation</a>. He had used reitit in many APIs and worked with <a href="https://github.com/CSCfi/rems">https://github.com/CSCfi/rems</a> which included swagger related tasks as well.</p>
<p>Overall there are around 250,000 downloads of <a href="https://clojars.org/metosin/reitit">reitit</a>. A lot of people in the clojure community are using it but the project is relatively new. It would be beneficial to the community at large to improve swagger documentation and migrate to using the new version. Metosin is also looking for help. Having a swagger schema generated reitit template would also help people to get started with reitit easier or port their old APIs to use reitit.</p>
<p>There are a handful of open <a href="https://github.com/metosin/reitit/issues?q=is%3Aissue+is%3Aopen+swagger">issues</a> related to swagger and some of which are marked as good first issue or help wanted. Tommi would like to push this issue forward as this has been open for a while: <a href="https://github.com/metosin/reitit/issues/84">https://github.com/metosin/reitit/issues/84</a></p>
<p>In addition to that, these steps will help Tommi to gain enough information about swagger to be able to tackle <a href="https://github.com/metosin/reitit/issues/272">https://github.com/metosin/reitit/issues/272</a> in the future.</p>
<p>This project will receive a grant of $1,000USD.</p>
<h2 id="keycloak-clojure">Keycloak-clojure</h2>
<p>Grodziski is the project creator and maintainer of Keycloak-Clojure. Top-notch and quick security is a must-have, Keycloak brings a solid IAM server compatible with OAuth and keycloak-clojure brings its integration in the Clojure ecosystem. Keycloak-clojure eases the integration and administration but documentation is mandatory to ease the integration process</p>
<p>keycloak-clojure needs better documentation about its integration in the Clojure ecosystem. The doc should clearly separate the Keycloak concepts and different interaction: administration of a realm, authentication and authorization checking with &ldquo;common&rdquo; Clojure libraries both on the front and serverside (ring, yada, re-frame, reagent, etc.)</p>
<p>This project will receive a grant of $1,000USD.</p>
<h2 id="cljcjava-time">cljc.java-time</h2>
<p>Henry Widd is a maintainer of cljc.java-time. According to him, with regards to the section on proposal-temporal in this <a href="https://github.com/henryw374/cljc.java-time">post</a>, the best looking solution on the horizon is the new platform date-time library being developed for Javascript aka tc-39/proposal-temporal (hereafter PT). If JS had a good date-time api built-in then it wouldn’t be necessary to bring your own of course, so no need for Js-Joda and problems 1) and 2) go away, simples!</p>
<p>The PT api is currently being finalized and experimental work is underway to reimplement Moment.js with it. How far away it is from being included in the next version of Node, Chrome etc he really can’t tell. Even when it is there, the world’s browsers won’t get upgraded overnight so polyfills will be needed for some time in many cases.</p>
<p>That aside, what does PT look like? Unfortunately, from a cross-platform lib developer’s PoV, it is not that similar to java.time. Some obvious differences are naming and the entities where methods reside. Also, there is no ZonedDateTime and the Duration and Period classes have been combined. However, although it looks pretty different, he has a feeling that the differences are quite superficial. If you wanted a cross platform Clojure api that used PT and java.time, Henry thinks extending tick’s protocols to the PT entities would likely be a good starting point, so you might end up with a tick-lite that doesn’t use js-joda or any npm lib.</p>
<p>This library works on jvm clojure, clojurescript and babashka and is the basis for the popular &lsquo;tick&rsquo; library. Adoption by other cross platform libraries is hindered by the npm dependency and it&rsquo;s size. Having it work on proposal-temporal would remove those barriers (as discussed here for <a href="https://github.com/metosin/malli/issues/49">example</a>).</p>
<p>This project will receive a grant of $1,000USD.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>May 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/may-2020-monthly-update/</link>
      <pubDate>Mon, 15 Jun 2020 15:00:54 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/may-2020-monthly-update/</guid>
      <description>Read more updates from Fireplace, Cider, Figwheel, Practicalli, Re-frame, and Clojars</description>
      <content:encoded><![CDATA[<h2 id="fireplace">Fireplace</h2>
<ul>
<li>Retool <code>:Eval</code> to support streaming response.  In my async <code>:Eval</code> spike I
wrote this piece off as being a trivial change but it took quite a bit of
refactoring to get this working.</li>
<li>Implement sending text to stdin.</li>
</ul>
<h2 id="cider">Cider</h2>
<p><strong>May 1-15</strong></p>
<h5 id="nrepl">nREPL:</h5>
<ul>
<li>Implemented an initial version of the built-in code completion middleware</li>
<li>Started work on the built-in lookup middleware</li>
<li>Reviewed and merged dynamic middleware loading functionality (some really great work by Shen Tian)</li>
<li>Provided default print functions via <code>nrepl.util.print</code>.</li>
<li>Reviewed and merged a couple of other bug fixes by Shen Tian.</li>
<li>Small documentation updates</li>
</ul>
<h5 id="cider-nrepl">cider-nrepl:</h5>
<ul>
<li>Normalized the interface of several ops by making the params they accept consistent</li>
</ul>
<h5 id="piggieback">Piggieback:</h5>
<ul>
<li>Cut Piggieback 0.5 with pprint support</li>
<li>Wrote some design documentation</li>
</ul>
<h5 id="cider-1">CIDER:</h5>
<ul>
<li>Added support for the new nREPL completions op</li>
<li>Fixed a couple of long-standing bugs related to streamed printing in the REPL (<a href="https://github.com/clojure-emacs/cider/issues/2628">https://github.com/clojure-emacs/cider/issues/2628</a> and <a href="https://github.com/clojure-emacs/cider/issues/1971">https://github.com/clojure-emacs/cider/issues/1971</a>)</li>
<li>Make it possible to configure the print buffer size that nREPL uses via CIDER</li>
<li>Reviewed and merged some inspector improvements</li>
<li>Added a couple of small command (e.g. <code>cider-repl-toggle-clojure-font-lock</code>) and made many documentation improvements</li>
<li>Dropped support for Nashorn</li>
</ul>
<h5 id="inf-clojure">inf-clojure:</h5>
<ul>
<li>Worked with Dan Sutton on simplifying inf-clojure and making it more robust (probably I&rsquo;ll cut a new major release by the end of the funding round)</li>
</ul>
<p><strong>May 16-31</strong></p>
<h5 id="nrepl-1">nREPL:</h5>
<ul>
<li>Implemented an initial version of the build-in lookup middleware</li>
<li>Started work on some best practices documentation for middleware authors</li>
<li>Started working on adding some extra language/runtime metadata to nREPL that might make it easier for client to
support multiple nREPL implementation (related to <a href="https://github.com/clojure-emacs/cider/issues/2848)">https://github.com/clojure-emacs/cider/issues/2848)</a>.</li>
</ul>
<h5 id="orchard">Orchard:</h5>
<ul>
<li>Merged a fix for #86 that fixes the resolution order in the info function</li>
<li>Cut a new release (0.5.9)</li>
<li>Spent a lot of time debugging an issue with the new release (<a href="https://github.com/clojure-emacs/orchard/issues/91">https://github.com/clojure-emacs/orchard/issues/91</a>)</li>
<li>Cut a new release (0.5.10)</li>
</ul>
<h5 id="cider-nrepl-1">cider-nrepl:</h5>
<ul>
<li>Cut a new release (0.25)</li>
</ul>
<h5 id="cider-2">CIDER:</h5>
<ul>
<li>Many small documentation improvements (including some new page navigation)</li>
<li>Improved the behavior of commands based on <code>cider-jump</code> (<a href="https://github.com/clojure-emacs/cider/issues/2850">https://github.com/clojure-emacs/cider/issues/2850</a>)</li>
<li>Fixed eldoc on Emacs 28.1</li>
<li>Discussed ideas on how to make CIDER somewhat Clojure-agnostic (<a href="https://github.com/clojure-emacs/cider/issues/2848">https://github.com/clojure-emacs/cider/issues/2848</a>)</li>
<li>Cut a new CIDER release (0.25)</li>
</ul>
<h5 id="misc">Misc:</h5>
<ul>
<li>Fixed a deployment issue with the clojuredocs-edn-export tool (it generates data that orchard uses)</li>
</ul>
<h2 id="figwheel">Figwheel</h2>
<p><strong>May 16-31</strong></p>
<h5 id="thanks">Thanks!</h5>
<p>This last couple of weeks have been fun and productive. I&rsquo;m grateful to
have had the time to work on the new <code>:bundle</code> target and simplify how
figwheel integrates with the larger NPM eco-system. As a result, the
NPM workflow in Figwheel has been vastly improved.</p>
<p>The following <code>dev.cljs.edn</code> config is enough to get you started with
the new bundle target and webpack.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#f92672">^</span>{<span style="color:#e6db74">:auto-bundle</span> <span style="color:#e6db74">:webpack</span>}
{<span style="color:#e6db74">:main</span> example.core}
</code></pre></div><p>Thanks to everyone who contributed to Clojurists Together and to those
great early adopters of the new <code>:bundle</code> target who&rsquo;ve helped me
understand what folks are needing.</p>
<p>If you use these new features in Figwheel please reach out with any
comments/questions on the <code>#figwheel-main</code> Slack channel as I&rsquo;d like
to really understand what folks are running into.</p>
<h5 id="overview">Overview</h5>
<p>I spent the last two weeks continuing to improve the <code>:bundle</code> target
support in <a href="https://figwheel.org">figwheel-main</a>.</p>
<p>You can see this work reflected it the <code>com.bhaumsn/figwheel-main 0.2.7</code> release and the newly updated <a href="https://figwheel.org/docs/npm.html">documentation for working with
NPM</a>.</p>
<p>If you head over to that page you will see a vastly improved document
that details the improvements. You will also see that I spent a
weekend updating the look of the <a href="https://figwheel.org">Figwheel
website</a>. The site is still a work in progress
as I only implemented about half of <a href="https://lubovsoltan.com/">Lubov
Soltan</a>&rsquo;s design.</p>
<p>To ensure that I wasn&rsquo;t doing anything that would complicate working
with React Native and the new <code>:bundle</code> target, I spent some time
looking at
<a href="https://github.com/bhauman/react-native-figwheel-bridge">react-native-figwheel-bridge</a>. I
ended up spending some time updating it so that it works with the new
ClojureScript compiler. In addition I refactored RNFB and added
support for <code>expo</code>. During that work I formulated a decent plan to
bring React Native support directly into figwheel-main.</p>
<p>I also spent some time on Devcards and removed its dependency on a
global <code>js/React</code> object. It now works much better when using NPM
dependencies for React.</p>
<h5 id="itemized">Itemized</h5>
<ul>
<li>Added a notion of <code>:final-output-to</code> so that figwheel can
potentially know where the final output bundle is. This allows us
to bootstrap an environment without having to create a host
page.</li>
<li>Added templating keywords that can be interpolated in the
<code>:bundle-cmd</code>. So if you put <code>:output-to</code>, <code>:final-output-to</code>,
<code>:final-output-path</code>, of <code>:final-output-filename</code> in a <code>:bundle-cmd</code>
the will be replaced with the appropriate file strings.</li>
<li>Fixed the default REPL host page so that it works with bundling</li>
<li>Fixed <a href="https://figwheel.org/docs/extra_mains.html">Extra-Mains</a> functionality so that it works with bundling</li>
<li>Fixed <a href="https://figwheel.org/docs/testing.html#auto-testing">Auto-Testing</a> so that it works with bundling</li>
<li>Added bundle command logging so that the bundle command that is executed gets logged to the console</li>
<li>Added bundle failure logging so that the output of a failed bundle command is logged to the console</li>
<li>Added the new Figwheel logo and new website style to <a href="https://figwheel.org">figwheel.org</a></li>
<li>Extensively updated the Figwheel <a href="https://figwheel.org/docs/npm.html">NPM documentation</a></li>
<li>Made it so that <code>:log-level :debug</code> will always reveal the stacktrace of a logged Error</li>
<li>added support for the new <code>--install-deps</code> <strong>cljs.main</strong> cli option</li>
<li>added a validation error for when the <code>:output-to</code> is not in the
<code>:output-dir</code> when using the <code>:bundle</code> target (bundling wont work otherwise)</li>
<li>added the <code>:auto-bundle :webpack</code> figwheel option which will fill in
all the defaults to get you up and running with NPM and webpack quickly</li>
<li>added <code>:parcel</code> support to the <code>:auto-bundle</code> config option</li>
<li>added <code>:bundle-freq</code> figwheel option which controls how often the
bundler is called, the value can be either <code>:once</code>,<code>:always</code> or
<code>:smart</code>. The <code>:smart</code> setting re-bundles when the <code>:output-to</code> or
the <code>npm_deps.js</code> file for a build changes.</li>
<li>debugged and reported couple big bugs with <code>:install-deps</code> in the
ClojureScript compiler</li>
<li>removed <a href="https://github.com/bhauman/devcards">Devcards</a> dependence on <code>js/React</code> global</li>
</ul>
<h5 id="future-work">Future work</h5>
<ul>
<li>launching a Webpack watch process</li>
<li>React Native support</li>
<li>Devcards support</li>
</ul>
<p>During the course of this work my Figwheel to-do list has grown quite
large so stay tuned, there are more changes to come.</p>
<h2 id="practicalli">Practicalli</h2>
<p><strong>May 1-15</strong></p>
<p>Unfortunately illness caught up with me towards the end of this period, but otherwise I have been busy with the weekly broadcasts and improvements to the Practicalli Clojure book, updating the install guides to Clojure CLI tools and repl driven development sections.</p>
<h5 id="practicalli-study-group">Practicalli Study Group</h5>
<p>The weekly live broadcasts continue, finalizing the data science series and starting a new series on <code>clojure.spec</code></p>
<h5 id="visualising-data-science">Visualising data science</h5>
<p>Concluded the <a href="https://www.youtube.com/playlist?list=PLpr9V-R8ZxiDUXIR2z8Y8wvhpoPyl0t_D">series of 7 live broadcasts on Visualising data science</a>.</p>
<p>The series started with extraction of data from various sources and how to transform data into more relevant structures for the task required.  Initially using ascii-graph to visualize data in the REPL before moving on to create a professional looking dashboard usings Oz and Bulma CSS framework.</p>
<p>The dashboard project was developed around the continually changing coronavirus data available in the UK. The broadcasts has several examples of how to deal with things when the data format changes (which it did several times).</p>
<p>The later broadcasts includes tips and examples on how to refactor a project as it grows.</p>
<h5 id="introduction-to-clojurespecalpha">Introduction to clojure.spec.alpha</h5>
<p>Started a new video series covering how to use spec in the REPL and with Clojure projects</p>
<p>Initially covering the foundation functions of the <code>clojure.spec.alpha</code> library and why its called alpha.  <a href="https://github.com/practicalli/leveraging-spec">practicalli/leveraging-spec</a> project was created, covering Clojure predicates, spec/conform, spec/valid?, literal values (Clojure sets), the spec registry, fully qualified namespaces, map literal syntax, spec/def and spec/explain.</p>
<p>Started a spec for an online bank account that will be used in further episodes of the series.</p>
<h5 id="practicalli-clojure">Practicalli Clojure</h5>
<p>Continued to migrate the book to Clojure CLI tools and deps.edn projects. The overall book content design is being refactored.</p>
<p>Update install guide to use Java 11 and added more editor options to the install guides, including NeoVim Conjure and Atom.io Chlorine.</p>
<p>Updated the <a href="https://github.com/practicalli/clojure-deps-edn">practicalli/clojure-deps-edn</a> repository with also contains a collection of commonly used aliases.  This repository greatly simplifies the installation of Clojure CLI tooling.</p>
<p>Started creating transcripts for videos.  Creating transcripts first helps increase the quality of videos created and reduces the amount of effort required post processing videos.</p>
<p>Added basic introduction to spec which will be expanded as Practicalli study group video series continues</p>
<h5 id="practicalli-spacemacs">Practicalli Spacemacs</h5>
<p>Supported the community with issues on Spacemacs gitter and #spacemacs channel of Clojurians Slack.</p>
<h5 id="practicalli-clojure-webapps">Practicalli Clojure WebApps</h5>
<p>Refactor overall book content design for Practicalli Clojure WebApps - plan to extend the scope of the book.</p>
<p><strong>May 16-31</strong></p>
<p>Unfortunately I was ill for most of this period, so not as much achieved this time.  I am (and always intended to) extending the work passed the Clojurists Together sponsor period.</p>
<h5 id="summary">Summary</h5>
<p>Continuing the weekly broadcasts on Clojure spec, a topic that will be added to the Practicalli Clojure book.</p>
<p>Added GitHub issues / PR shields for each book on the website to make tracking and contributing more convenient.</p>
<p>Pages on how to use Magit forge to list and create issues and pull requests as well as fork repositories on GitHub, all from within Spacemacs (Emacs).</p>
<h5 id="practicalli-website">Practicalli Website</h5>
<p>Added <a href="https://github.com/badges/shields">Shields</a> for each book with links to content ideas and pull requests on the respective repositories.  Aids in the tracking of book progress and providing another way for others to contribute.</p>
<p>Added YouTube playlists to the Practicalli website to make specific video content easier to find.</p>
<p>Updated the Creative commons license notice on the front pages of all books and GitHub README files, ensuring compliance with the <a href="https://sfconservancy.org/">Software Freedom Conservancy</a>.</p>
<p>Add favicon to each book website</p>
<h5 id="practicalli-study-group-1">Practicalli Study Group</h5>
<p>Continuing the new series on <code>clojure.spec.alpha</code>, this time comparing function definition validation with <code>:pre</code> / <code>:post</code> conditions and spec <code>fdef</code>.</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=fOv_z6E30l0&amp;list=PLpr9V-R8ZxiBWGAuncfBRYhZtY5-Bp75s&amp;index=3">072 - Clojure Spec - Part 2 validation with :pre &amp; :post and spec fdef</a></li>
</ul>
<h5 id="practicalli-spacemacs-1">Practicalli Spacemacs</h5>
<p>Several updates on using the Magit client</p>
<p>Guide on using Magit Forge to list and create issues and pull requests on GitHub, including forking remote repositories on GitHub.
<a href="https://practicalli.github.io/spacemacs/source-control/magit/forge.html">https://practicalli.github.io/spacemacs/source-control/magit/forge.html</a></p>
<p>Updated and tested the Magit Forge configuration page
<a href="https://practicalli.github.io/spacemacs/source-control/forge-configuration.html">https://practicalli.github.io/spacemacs/source-control/forge-configuration.html</a></p>
<p>Add page on how to staging changes with Magit, including the scope of changes that can be selected, from multiple files, hunks or individual lines.</p>
<p>Video to how to update an existing pull request added to the contributing section, to complement the existing video showing how to contribute a pull request to Spacemacs (which can be used for any other project).</p>
<p><a href="https://www.youtube.com/playlist?list=PLpr9V-R8ZxiCHMl2_dn1Fovcd34Oz45su">Practicalli Spacemacs playlist</a> updated with related Spacemacs videos from jr0cket channel.</p>
<p>Supported the community with issues on Spacemacs gitter and #spacemacs channel of Clojurians Slack.</p>
<h5 id="practicalli-clojure-webapps-1">Practicalli Clojure WebApps</h5>
<p>Add the <a href="http://practicalli.github.io/clojure-webapps/content-plan.html">high level plan to extend the book contents</a> to the Clojure WebApps book, along with project ideas to implement.</p>
<p>Updated the cover of the book to use the new Practicalli ClojureWebApps book banner</p>
<p>Improvements to various content sections based on feedback from the community.</p>
<ul>
<li>Updated webapps overview with additional project links</li>
<li>Completely revised the introduction to sets and hash-maps</li>
<li>Improved descriptions for the ring introduction, creating a project, creating a webserver, defining handlers, compojure defroutes and using the let function</li>
<li>Clarified use of Heroku for deploying applications</li>
</ul>
<h2 id="re-frame">Re-frame</h2>
<p>**May 1-15</p>
<p>Based on <a href="https://github.com/day8/re-frame/issues/589">https://github.com/day8/re-frame/issues/589</a></p>
<p>Progress on the early, low-hanging-fruit step:</p>
<ul>
<li><input checked="" disabled="" type="checkbox"> thoroughly review all the existing issues and PRs.</li>
<li><input checked="" disabled="" type="checkbox"> close any issues which need it</li>
<li><input checked="" disabled="" type="checkbox"> assemble the candidate list of issues we identify as &ldquo;low hanging fruit&rdquo;</li>
<li><input checked="" disabled="" type="checkbox"> some distracting issues with re-frame-template, shadow-c;lj and Lein-Shadow. See <a href="https://github.com/day8/re-frame-template/issues/128">https://github.com/day8/re-frame-template/issues/128</a> and <a href="https://gitlab.com/nikperic/lein-shadow/-/merge_requests/3">https://gitlab.com/nikperic/lein-shadow/-/merge_requests/3</a></li>
<li><input checked="" disabled="" type="checkbox"> some distractions with re-frame-10x (almost there)</li>
<li><input checked="" disabled="" type="checkbox"> #570 - Implement a way to add global interceptors</li>
<li><input checked="" disabled="" type="checkbox"> about to cut a new release which includes all the low hanging fruit</li>
<li><input checked="" disabled="" type="checkbox"> #544</li>
<li><input checked="" disabled="" type="checkbox"> #456</li>
<li><input checked="" disabled="" type="checkbox"> #216</li>
</ul>
<p>Closed with explanations:</p>
<ul>
<li><a href="https://github.com/day8/re-frame/issues/553">#553</a></li>
<li><a href="https://github.com/day8/re-frame/issues/572">#572</a></li>
<li><a href="https://github.com/day8/re-frame/issues/555">#555</a></li>
<li><a href="https://github.com/day8/re-frame/issues/112">#112</a></li>
<li><a href="https://github.com/day8/re-frame/issues/481">#481</a></li>
<li><a href="https://github.com/day8/re-frame/issues/164">#164</a></li>
<li><a href="https://github.com/day8/re-frame/issues/554">#554</a></li>
<li><a href="https://github.com/day8/re-frame/issues/480">#480</a></li>
</ul>
<p>Picked Fruit, so far:</p>
<p>Issues arising:</p>
<ul>
<li><a href="https://github.com/day8/re-frame/issues/588">#588</a></li>
</ul>
<p>Building a grown-up website <a href="https://github.com/day8/re-frame/issues/582">#582</a>:</p>
<ul>
<li><input checked="" disabled="" type="checkbox"> A review of options and likely paths has commenced.</li>
</ul>
<h5 id="new-website-progress">New website progress</h5>
<ul>
<li><input checked="" disabled="" type="checkbox"> learning new static site generator  (good decision so far, but there&rsquo;s always stuff to learn)</li>
<li><input checked="" disabled="" type="checkbox"> we&rsquo;ve spent far too long getting Klipse going (to supply a page of live coding)</li>
<li><input checked="" disabled="" type="checkbox"> a GithubActions based build system for new website</li>
<li><input checked="" disabled="" type="checkbox"> a LOT of rewriting, writing and thinking</li>
<li><input checked="" disabled="" type="checkbox"> integration with API docs</li>
</ul>
<p>New docs include the following:</p>
<ul>
<li>Reusable Components - Addresses issue #264</li>
<li>On Dynamics</li>
<li>Subscriptions - Previously a neglected area.</li>
</ul>
<p>We&rsquo;re down to about 18 issues and 3 PRs. When we started, I think it was 30 issues and 9 PRs.</p>
<p>**May 16-31</p>
<p>Based on <a href="https://github.com/day8/re-frame/issues/589">https://github.com/day8/re-frame/issues/589</a></p>
<p>The task of addressing meatier issues is now slightly delayed.</p>
<p>New FAQ item added which closes <a href="https://github.com/day8/re-frame/issues/538">#538</a></p>
<p><a href="https://github.com/day8/re-frame/issues/478">#478</a> - cljs-oss/canary build support has been done, but not yet enabled.</p>
<p>We are down to 13 open issues and 2 PRs.</p>
<p>In light of some negative feedback we have received of the initial release, we are reworking the new website.
Goal is to present code earlier and require less initial reading.</p>
<h2 id="clojars">Clojars</h2>
<p><strong><a href="https://tcrawley.org/clojars-worklog/#may-2020">May 1-31</a></strong></p>
<p>I continued working on deploy tokens, adding:</p>
<ul>
<li><a href="https://github.com/clojars/clojars-web/commit/f6fc33168c76298bd084e8903ec9bf22a9ec226e">An endpoint</a> that GitHub will use to report when a deploy token is found in source code that will notify the user and disable the token</li>
<li>The option to <a href="https://github.com/clojars/clojars-web/commit/fc572b5cf1acdbaf17655b1b8a6f32bfcc89015e">scope a deploy token to a group or artifact</a></li>
</ul>
<p>I also <a href="https://github.com/clojars/clojars-web/pull/758">implemented the bulk of two-factor authentication</a>. This wasn&rsquo;t released in May, but will be released by mid-June.</p>
<p>Part of the two-factor implementation is <a href="https://github.com/clojars/clojars-web/pull/758/commits/62e5e2313bd47530b44de732c7a2844ffe1783ee">an internal eventing system</a> that will make it easier to add additional email notifications in the future.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>April 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/april-2020-monthly-update/</link>
      <pubDate>Mon, 15 Jun 2020 14:00:54 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/april-2020-monthly-update/</guid>
      <description>Read more updates from Ring, Calva, Reagent, Fireplace, and Clojars</description>
      <content:encoded><![CDATA[<h2 id="ring">Ring</h2>
<p><strong>Apr 1-15</strong></p>
<p>Ring 2.0.0-alpha1 has been released, with the adapter and servlet
utility functions supporting both Ring 1 and Ring 2 keys by default,
though there is also an option for forcing a particular version.</p>
<p>Based on community feedback, the Ring 2.0 request and response headers
have been changed to be closer to the standard laid out in the Ring
1.x specifications.</p>
<p>I&rsquo;ve begun setting up a project using the <a href="https://openjdk.java.net/projects/code-tools/jmh/">JMH</a> benchmarking harness
to compare Ring 1 with Ring 2 performance, particularly around
building the request map. Higher level tests with ApacheBench proved
too imprecise to draw meaningful conclusions, as the variance between
results was higher than any measurable difference between Ring
versions.</p>
<p>I&rsquo;ve also been reconsidering some of the ideas around adding request
and response protocols to Ring as a way of supplementing map key
access. Initially I considered them out of scope, as they&rsquo;re a
performance enhancement, however they could also be used as a
compatibility mechanism for middleware that supports both Ring 1 and 2
formats.</p>
<p><strong>Apr 16-30</strong></p>
<p>I&rsquo;ve constructed a <a href="https://openjdk.java.net/projects/code-tools/jmh/">JMH</a>-based benchmarking project for Ring 1.8 and
Ring 2.0, in order to get a better idea of the relative performance of
both versions, specifically around converting to and from Java servlet
objects. I&rsquo;ve written up the <a href="https://github.com/ring-clojure/ring/issues/393#issuecomment-622516908">initial findings</a> and published them
as a comment on the Ring 2.0 GitHub issue.</p>
<p>I&rsquo;ve also been fixing various smaller issues with Ring 1.8.0, and
should be ready to release 1.8.1 by the end of the day.</p>
<p>Work on websocket support has been on pause while performance and
compatibility concerns were investigated, but that work is now ready
to be resumed. Work on Ring 2.0 will continue over the next few
months, and further alphas will be released to allow community
feedback and testing of new features.</p>
<p>The first stable version of Ring 1.0 was released a little over 8 years
ago. With a little luck, Ring 2.0 will last even longer.</p>
<h2 id="calva">Calva</h2>
<p><strong>Apr 1-15</strong></p>
<h5 id="debugger">Debugger</h5>
<p>The debugger has been released! <a href="https://calva.io/debugger/">Documentation for the debugger</a> was written and published that covers the existing functionality and lists current and upcoming features.</p>
<p>Since then, I&rsquo;ve added step over, step in, and step out functionality as well as annotations in the editor to show the value of the current form as execution moves to each breakpoint. I&rsquo;ve updated the docs to reflect these changes as well as made some general improvements to the docs.</p>
<p>I&rsquo;m currently working on polishing the latest changes and then will release them along with the updates to the docs.</p>
<h5 id="docs">Docs</h5>
<p>The <a href="https://calva.io/">Calva docs</a> have a new look and a new home! We switched to using mkdocs for building our docs and are using the material theme.</p>
<p><strong>Apr 16-30</strong></p>
<h5 id="debugger-1">Debugger</h5>
<p>I&rsquo;ve added a command to instrument functions for debugging as an alternative and more convenient method than adding <code>#dbg</code> reader tags to the code file. I&rsquo;ve also added editor decorations to visually indicate which functions are instrumented. The instrumented function definitions as well as the usages gain a top and bottom border and a background. clj-kondo is used <a href="https://github.com/borkdude/clj-kondo/blob/master/doc/jvm.md#api">as a JVM library</a> to get the var definitions and usages, and <a href="https://github.com/borkdude/clj-kondo/tree/master/analysis">this data</a> is matched up with cider-nrepl&rsquo;s <a href="https://docs.cider.mx/cider-nrepl/nrepl-api/ops.html#_debug_instrumented_defs"><code>debug-instrumented-defs</code></a> response data to create the decorations on document change.</p>
<p>The instrument command and decorations features were released and I&rsquo;ve started working on displaying structured values, for locals, in the VS Code debugger side pane (currently non-primitives are shown as strings). This should allow a user to &ldquo;drill down&rdquo; into a structured value like a map or collection.</p>
<h2 id="reagent">Reagent</h2>
<p><strong>Apr 1-30</strong></p>
<p>Reagent 1.0.0-alpha1 is out and contains implementation of both
creating React function components from Reagent components
and options. The default is still to create class components
by default, to ensure compatibility, but an option can be used
make function components the default.</p>
<p>After the last update, I had pretty much everything ready, but
I wanted to change the API a bit before first release.
The first implementation of
options had one problem related to caching, as different
options could result in different results but the cache was shared.
This was one of the reasons I wanted to create &ldquo;Compiler&rdquo; object
which is created using the options. This object can hold the cache
(or unique key for caches) and is implemented as a reified
protocol. This object currently holds the implementation for a few
Reagent internal functions, most importantly <code>as-element</code>, and in
future the function or macro creating this object from options map,
can generate different code for this (and other) methods.</p>
<p>Implementing and getting all the tests passing with this approach
took quite long, but I finally got everything working. After
finishing the code, I added some new documentation pages
and a new example showing making Function components default
and using Hooks with Reagent, and created the first release for testing.</p>
<p>Based on the comments from users, I&rsquo;ve already added
two more &ldquo;shortcuts&rdquo; to Reagent: <code>:f&gt;</code> to create
Function Reagent component (using the default
options), and <code>:r&gt;</code> to use React
components without properties conversion done by
<code>:&gt;</code> and <code>adapt-react-class</code>.</p>
<p>Additionally I&rsquo;ve followed latest developments in ClojureScript
compiler, and added new test environment for Reagent, using the
new <code>:bundle</code> compilation target. This target generates
JS tooling compatible output. This output can be passed to
Webpack, or for testing, Karma.</p>
<h2 id="fireplace">Fireplace</h2>
<p><strong>April 1-30</strong></p>
<ul>
<li><a href="https://github.com/tpope/vim-fireplace/issues/374">Handle <code>:Require</code> exceptions</a></li>
<li>Spike out a async <code>:Eval</code> via an interface to background a blocking eval
with a key binding.  This is a substantial retooling that also allows among
other things sending text to stdin. Needs a bit more polish to push to
master but should be done by the second update.</li>
</ul>
<h2 id="clojars">Clojars</h2>
<p><strong><a href="https://tcrawley.org/clojars-worklog/#apr-2020">April 1-30</a></strong></p>
<p>This month included work finishing up the migration to AWS, including:</p>
<ul>
<li>Setting up a way to build new AMIs for the server</li>
<li>Modifying the deploy process to allow new instances to deploy the current release</li>
<li>Moving the server to an auto-scaling group to make it more robust and allow zero-downtime new AMI releasing</li>
<li><a href="https://github.com/clojars/clojars-server-config#system-diagram">Documenting the new server architecture</a></li>
<li>Upgrading from Java 8 to Java 11</li>
</ul>
<p>I then started on improving security. The work here was focused on adding a <a href="https://github.com/clojars/clojars-web/issues/726">deploy token</a> feature. This was <a href="https://groups.google.com/forum/#!topic/clojars-maintainers/nqV5yc-05BI">released in early May</a>, but 90% of the work was completed in April.</p>
<p>I also <a href="https://github.com/clojars/clojars-web/issues/495">fixed an issue</a> where the cookies weren&rsquo;t being set as secure.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Announcing Summer of Bugs</title>
      <link>https://www.clojuriststogether.org/news/announcing-summer-of-bugs/</link>
      <pubDate>Tue, 19 May 2020 06:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/announcing-summer-of-bugs/</guid>
      <description>Ever wanted to take a day off to fix an annoying bug or finally ship a feature? Clojurists Together Foundation wants to make that happen.</description>
      <content:encoded><![CDATA[<p>Ever wanted to take a day off to fix an annoying bug or finally ship a feature? Clojurists Together Foundation wants to make that happen.</p>
<p>Now that Clojurists Together Foundation <a href="/news/announcing-the-clojurists-together-foundation/">is operational</a>, we have more flexibility in how we fund open source work. One recurring community request was for smaller grants: people who feel there&rsquo;s good work to be done and that they&rsquo;re in an ideal position to do it, but there just isn&rsquo;t an entire quarter&rsquo;s worth to do. With Summer of Bugs, we&rsquo;re introducing funding for important work that takes place on a scale of days, not months.</p>
<p>Applications are open to anyone who can plausibly demonstrate their ability to do the proposed work. Previously, we&rsquo;ve only funded project maintainers. Maintainers are of course still welcome to apply, but we&rsquo;re expanding the application process to include contributors and expert users.</p>
<p>While we&rsquo;re calling this &ldquo;Summer of Bugs&rdquo;, these mini-projects are not limited to just fixing issues. If there&rsquo;s an important feature to roll out, that&rsquo;s fine too. Plenty of projects would really benefit most from someone spending a day or two tending to the issue tracker, so that other contributors can be more effective. Perhaps existing features aren&rsquo;t living up to their potential because they&rsquo;re undocumented. Surprise us! We&rsquo;d love to support all of these projects.</p>
<p>While at a later stage we want to explore funding more experimental work in the Clojure community, we&rsquo;re trying to change only one variable at a time. Therefore, we expect these mini-grants to mostly be targeted at the same sort of core open source infrastructure we&rsquo;ve funded in the past.</p>
<p>Our initial approach to this is that people can request a micro-grant ($500) or a mini-grant ($1,000). We&rsquo;re hoping to allocate a budget of $7,500, though that is somewhat dependent on available funds. The committee will vote on the submissions, rank them based on impact, and pick the top N until we reach our budget based on overall impact on the Clojure community. We will continue to gauge impact based on information from member surveys as well as third party datasets such as the annual State of Clojure survey: please continue to fill those out as it helps guarantee the quality of our decision making.</p>
<p>You can <a href="/open-source/">apply</a> for these grants now and we’ll be announcing the results at the end of May. When thinking about projects to apply for, take a look at our <a href="/news/q2-2020-survey-results/">recent survey results</a> as these are the kinds of projects our members are most interested in funding.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Announcing the Clojurists Together Foundation</title>
      <link>https://www.clojuriststogether.org/news/announcing-the-clojurists-together-foundation/</link>
      <pubDate>Tue, 19 May 2020 06:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/announcing-the-clojurists-together-foundation/</guid>
      <description>Clojurists Together has formed a trade association to grow and expand the work that we have been doing with the Clojure community.</description>
      <content:encoded><![CDATA[<h2 id="what-is-clojurists-together">What is Clojurists Together?</h2>
<p>Clojurists Together is an organisation dedicated to funding and supporting open source software, infrastructure, and documentation that is important to the Clojure and ClojureScript community.</p>
<h2 id="whats-changing">What&rsquo;s changing?</h2>
<p>As of late 2019, we (the Clojurists Together board) have formed a trade association, the Clojurists Together Foundation. Up until now Clojurists Together (through Clojars) have been a fiscal sponsoree of the Software Freedom Conservancy (Conservancy). Conservancy is a not-for-profit charity (501(c)3) that helps promote, improve, develop, and defend Free, Libre, and Open Source Software (FLOSS) projects.</p>
<p>Conservancy was instrumental in launching Clojurists Together as a grant program, funding 27 grantees $224,000 USD to date. As Clojurists Together has grown and succeeded in its mission, it&rsquo;s become clear that it is ready for its own organization. Clojurists Together Foundation will be able to control more of its own operations on its own timeline. Unlike Conservancy, which is a charity, Clojurists Together Foundation is a trade association. We feel this describes the work we hope to do in the future better.</p>
<p>We&rsquo;ve worked closely with lawyers to make sure we&rsquo;ve gotten the details right: Clojurists Together Foundation has purchased the trademark from Conservancy and will be creating the new program under that name. Conservancy will spend the money they receive from the trademark sale along with the remaining assets they hold on Clojurists Together activities that are suitably charitable, until they hold no more of our funds.</p>
<p>This is mostly an operational measure. The big picture of the work we&rsquo;re doing won&rsquo;t change, just the legal entity behind it and the legal details of how we accomplish that. Clojurists Together Foundation will move forward with the same board members, same domain name, and the same overarching goal of funding and supporting software, infrastructure, and documentation that is important to the Clojure(Script) community.</p>
<h2 id="what-does-that-mean-in-practice">What does that mean in practice?</h2>
<p>Now that Clojurists Together is its own legal entity, we can be more flexible in the kinds of work that we sponsor. Over the last two years as we&rsquo;ve talked to maintainers about applying, a few themes have come up:</p>
<ul>
<li>
<p>Three months part-time is too long for some projects. Some maintainers prefer to work full time on their project on a more compressed time scale.</p>
</li>
<li>
<p>A $9,000 USD grant was too much for some people. They had a small amount of work that they wanted to do on their project, and wanted to apply for less money. Previously we had almost the same overhead whether we funded a project $3,000 or $9,000, and we didn&rsquo;t have the bandwidth to support a large amount of small grants.</p>
</li>
</ul>
<p>Clojurists Together is now able to be significantly more flexible. We&rsquo;re opening up a survey and office hours over the next few months. We want to hear how Clojurists Together can best support the open source Clojure community. Send us your feedback on what kinds of funding would work best for you. Need server hosting covered? Looking to take an open source sabbatical? Let us know what would work for you. We&rsquo;re going to be listening to your feedback, and will announce new ways we will be funding projects and maintainers in the coming months.</p>
<h2 id="what-our-members-are-saying">What our members are saying</h2>
<p>Before the announcement we talked to some new and existing members about why they are Clojurists Together members. Here&rsquo;s what they said:</p>
<p><em>&ldquo;Clojurists Together provides an invaluable service to the Clojure community by supporting both unsung heroes of established projects (like Clojars and Ring) and brave new souls pushing boundaries and making Clojure&rsquo;s ecosystem more vibrant and exciting.&quot;</em></p>
<p><em>- Paul Stadig, Backend Software Engineer @ Clubhouse</em></p>
<p><em>&ldquo;JUXT are proud to sponsor Clojurists Together, to support some of the many individuals who make the wonderful Clojure ecosystem what it is today.&quot;</em></p>
<p><em>- Malcolm Sparks, Technical Director @ JUXT</em></p>
<p><em>&ldquo;At Nextjournal we’ve benefited immensely from the work that Clojurists Together has funded so far, and look forward to continue supporting the community in this way.&quot;</em></p>
<p><em>- Dieter Komendera, @ Nextjournal</em></p>
<p>We&rsquo;d especially like to welcome new Filter member <a href="https://clubhouse.io">Clubhouse</a>, and developer members Ryan Zebian, Niklas Heer, Aleksander Sumowski, Patrick Farwick, Mario Trost, Alexander Oloo, Paul Rutledge, and Sergey Shvets.</p>
<h3 id="summer-of-bugs">Summer Of Bugs</h3>
<p>The first new program that we are working on is something we are tentatively calling &ldquo;Summer of Bugs&rdquo;. Summer of Bugs will award a number of micro-grant of $500 or $1,000 to people working to fix bugs, implement small features, write docs, or clean up issue trackers. You can read more about Summer of Bugs at the announcement.</p>
<h3 id="access-to-member-data">Access to member data</h3>
<p>Previously, our member data was commingled with that of other entities. This meant we did not have direct access to member details and had to do a lot of manual work for things like mailing out stickers.</p>
<h3 id="transparency">Transparency</h3>
<p>Now that we are directly responsible for our finances, we are looking forward to being able to share more information about our revenue, expenses, and balance sheet. </p>
<h3 id="credit-cards">Credit cards</h3>
<p>When talking to businesses and individual members, a big theme that came up was the desire to use credit cards instead of PayPal. We are very excited to announce that we can now accept credit card payments and US wire transfers. At this time we don&rsquo;t plan to support PayPal due to the operational overhead that they require, though depending on demand we may consider it. If there is a payment method you&rsquo;d like to use that we don&rsquo;t support, get in touch and we&rsquo;ll see what we can do.</p>
<h2 id="what-does-that-mean-for-me">What does that mean for me?</h2>
<p>One difference is that the Conservancy is a charitable organization, specifically a US based 501(c)3. Clojurists Together Foundation is a trade association incorporated in Delaware. We have been awarded 501(c)6 tax-exempt status, similar to Ruby Together and the Linux Foundation.</p>
<p>After speaking with tax and legal professionals we expect this will have minimal impact on our members. Note that payments to the Clojurists Together Foundation are not charitable donations unlike those made to Conservancy, but they are likely still tax-deductible for many of our members. We recommend talking to your tax professional for specifics.</p>
<h2 id="what-do-i-need-to-do">What do I need to do?</h2>
<p>We are not able to transfer any payment authority from PayPal to the new organisation, so you will need to sign up again with Clojurists Together Foundation directly.</p>
<p>If you are a current Clojurists Together member, you should have received an email inviting you to set up an account and add your card on the Clojurists Together website. This site will also let you view invoices and manage where emails for surveys, news, and invoices are sent.</p>
<p>Once you have signed up, you will need to cancel your payments with PayPal. We have instructions for <a href="https://www.clojuriststogether.org/docs/paypal-update/">how to do this</a>. If you don&rsquo;t cancel, Conservancy will cease to accept donations on our behalf and cancel your recurring payments on June 1, 2020.</p>
<p>If you would like to join Clojurists Together, you can sign up as a <a href="https://www.clojuriststogether.org/companies/">Company member</a>, or a <a href="https://www.clojuriststogether.org/developers/">Developer member</a>.</p>
<h2 id="elections">Elections</h2>
<p>For those paying close attention, you may remember that Clojurists Together has annual elections that are normally held in November. Due to our change in legal structure, we&rsquo;ve delayed the elections until mid 2020. We will hold elections for the four seats that are up for reelection soon.</p>
<h2 id="annual-general-meeting">Annual general meeting</h2>
<p>One of the responsibilities of a trade association is to have an annual general meeting (AGM) of the members. This will allow a formal place for members to bring ideas, questions, and concerns to the committee. We&rsquo;ll have more information on this once we announce our first AGM.</p>
<h2 id="what-happens-to-the-funds-still-at-conservancy">What happens to the funds still at Conservancy?</h2>
<p>For legal reasons related to their charitable tax-exempt status, the Conservancy can&rsquo;t just transfer our funds to the new legal entity. Therefore, we&rsquo;ll be using up the remaining funds by making grants from the funds still at the Conservancy. We&rsquo;re expecting that soon there will be virtually no new funds added to our accounts at Conservancy. Hence our relationship with the Conservancy will be concluded within approximately a year.</p>
<h2 id="legal-documents">Legal documents</h2>
<p>You can view our founding documents on GitHub at <a href="https://github.com/clojurists-together/documents">clojurists-together</a>.</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>We&rsquo;d like to thank Ruby Together, which served as a model for our new organization. In particular, we&rsquo;d like to thank André Arko (Ruby Together&rsquo;s executive director) who gave us tons of advice, insight and referrals that helped us set up the new legal entity.</p>
<p>We&rsquo;d like to thank Conservancy and Karen Sandler for their help in getting set up, and starting Clojurists Together.</p>
<p>Lastly, we&rsquo;d like to thank all of the members of Clojurists Together, both current and former. We&rsquo;re deeply grateful to everyone who has supported the work we&rsquo;ve done, filled out surveys, sent us feedback, given us money, and shared the work we&rsquo;re doing with others.</p>
<p>We are very excited for the future of Clojurists Together, and look forward to being able to support the Clojure community even more.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Clojurists Together is Funding Clojars</title>
      <link>https://www.clojuriststogether.org/news/clojurists-together-is-funding-clojars/</link>
      <pubDate>Fri, 24 Apr 2020 09:03:12 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/clojurists-together-is-funding-clojars/</guid>
      <description>Clojurists Together is funding Clojars to improve its security, reliability, and ensure its long-term future</description>
      <content:encoded><![CDATA[<p>In yesterdays <a href="https://www.clojuriststogether.org/news/q2-2020-funding-announcement/">funding announcement</a> I forgot to mention that Clojurists Together is also going to be funding Clojars.</p>
<p>Note: This work was planned and approved by the Clojurists Together committee over December 2019-January 2020. However we didn&rsquo;t get approval from the SFC until April, so we couldn&rsquo;t announce it until now.</p>
<h2 id="background">Background</h2>
<p>Toby Crawley and I (Daniel Compton) are the maintainers and admins of <a href="https://clojars.org">Clojars</a>. As many of you are aware, Clojars is a critical part of the Clojure ecosystem. A security issue could also affect sister JVM languages as companies often add Clojars as a package repo in Nexus and Artifactory. For the last few years, Clojars has run without a lot of maintenance or attention. Neither Toby nor I have had a lot of free time to spend on Clojars, and we’ve been lucky that there have been no emergencies. However, there are a number of tasks that have built up in this time. Most of them aren&rsquo;t urgent, but if we don’t start paying down our maintenance debt, then Clojars becomes increasingly likely to suffer a security incident or significant outage.</p>
<p>The committee has decided to fund Toby Crawley (A Clojars administrator and previous committee member) to work on maintaining and running the Clojars repository. There are two parts to this work:</p>
<h2 id="shift-to-aws">Shift to AWS</h2>
<p>The first part is a major rearchitecture to move Clojars from Rackspace to AWS. Since January 2016, Rackspace has provided free infrastructure (virtual machines and object storage) for Clojars to run on. Around the end of 2019 Rackspace discounts for OSS projects have been expiring, and we need to move away. We want to publicly thank Rackspace for their support for the last three years. Toby and I decided that AWS was the best place for us to move to. We’ve applied for <a href="https://aws.amazon.com/blogs/opensource/aws-promotional-credits-open-source-projects/">AWS’ OSS funding program</a> and have been accepted.</p>
<p>Toby started on this project over the 2019-2020 Christmas holidays. As part of the move to AWS, Toby has also moved from Sqlite to RDS Postgres, made S3 the primary repository store instead of disk, and many other changes to make Clojars more secure and reliable.</p>
<p>The Clojars committee has approved $10,000 for this project.</p>
<h2 id="ongoing-maintenance">Ongoing maintenance</h2>
<p>The second part is funding Toby as an administrator for Clojars. This involves:</p>
<ul>
<li>OS and system package upgrades</li>
<li>Repo deletion requests</li>
<li>Reviewing and merging PRs</li>
<li>Deploying changes</li>
<li>Monitoring bandwidth usage to spot anything bad</li>
<li>General operational tweaks and improvements</li>
<li>Tuning search algorithms</li>
<li>Security improvements, fixes, and responding to security reports</li>
</ul>
<p>The Clojars committee has approved paying Toby for $1,500/month for six months for January-June ($9,000 total). At that point Toby and the committee will reassess and check if it is working for him, his family, etc. and whether Clojars needs more or less work. There is a backlog of security work which Toby will work to address in this time, after that Clojars may need less time spent on it.</p>
<h2 id="thanks">Thanks!</h2>
<p>Thanks to all of our <a href="/members/">members</a> for your continuing support and making this possible.</p>
<p>Clojars has been providing free JAR hosting to the Clojure community since November 2009. We&rsquo;re pleased to be able to fund Clojars to ensure it stays strong for the coming decade.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2020 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q2-2020-funding-announcement/</link>
      <pubDate>Thu, 23 Apr 2020 14:15:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2020-funding-announcement/</guid>
      <description>Clojurists Together is funding re-frame, Practicalli, CIDER/nREPL/Orchard, and Figwheel</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q2 of 2020 (May-July) we are funding four projects:</p>
<ul>
<li><a href="https://github.com/day8/re-frame">re-frame</a> with Isaac Johnston</li>
<li><a href="https://practicalli.github.io">Practicalli</a> with John Stevenson</li>
<li><a href="https://cider.mx">CIDER/nREPL/Orchard</a> with Bozhidar Batsov</li>
<li><a href="https://figwheel.org">Figwheel</a> with Bruce Hauman</li>
</ul>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. Previously we have supported <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://clojurescript.org">ClojureScript</a>, <a href="https://aleph.io">Aleph</a>, <a href="https://neanderthal.uncomplicate.org">Neanderthal</a>, <a href="https://reagent-project.github.io">Reagent</a>, <a href="https://github.com/ring-clojure/ring">Ring</a>, <a href="https://github.com/tpope/vim-fireplace">Fireplace</a>, and <a href="/projects/">other projects</a>.</p>
<h2 id="funding-details">Funding details</h2>
<p>We support our grantees by paying them a total of $9,000 over three months ($3,000/mo).</p>
<h2 id="re-frame">re-frame</h2>
<p><strong>Disclosure:</strong> Daniel Compton previously worked at Day8 and worked on re-frame. This was disclosed to the committee while discussing the submissions and was not seen as a conflict of interest.</p>
<h3 id="why-is-this-project-important-to-the-clojure-community">Why is this project important to the Clojure community?</h3>
<p>re-frame is one of the most widely used ClojureScript projects with 4.3k stars on GitHub and 1.1 million downloads on Clojars.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding">What are you wanting to achieve with this funding?</h3>
<p>First, some spring cleaning and TLC for the project. Re-frame hasn’t had enough concerted attention recently, and I’d initially like to review and triage all existing open issues and PRs. From this process, I’d like to tackle the highest value set of issues which should be immediately addressed. On completion of this phase, I’d like to cut a new release.</p>
<p>Second, I’d then like to move on to one of the “EPs” written up in the <a href="https://github.com/day8/re-frame/tree/master/docs/EPs">/docs/EPs</a> section of the repo. This step would enhance re-frame with at least one new significant feature (to be decided).  I’m in the fortunate position that I can get advice and opinion from Mike Thompson, the author of re-frame and a coworker at Day8, throughout the process.</p>
<p>It is likely that some of what I do would impact sibling projects such as re-frame-template and re-frame-10x on which I am also an active maintainer. So, I’d be bringing them along for the journey too.</p>
<h2 id="practicalli">Practicalli</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-1">Why is this project important to the Clojure community?</h3>
<p>High quality and up to date information helps any developer using Clojure find the help they need, whether they are experienced or new to Clojure. Finding the time to teach developers how to work with Clojure is time consuming for developers, so a reliable source of information speeds up on-boarding and skilling-up of developers.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-1">What are you wanting to achieve with this funding?</h3>
<p>Create and complete 3 on-line detailed books with extensive video tutorials covering:</p>
<ol>
<li>
<p>Clojure interactive development with Clojure CLI &amp; deps.edn, clojure.core examples, idiomatic code, thinking functionally, testing (unit, performance, generative, spec).</p>
</li>
<li>
<p>Server-side web application development, starting with ring-compojure and scaling up and out through Luminus duct, reitit and pedestal.  Including component lifecycle management (mount, component, integrant), data stores (postgres, redis, firebase, couchbase, kafta), security, access management, etc.</p>
</li>
<li>
<p>Clojure development tools - Emacs/Spacemacs has largely been created and looking to add or work with other tool developers to enhance their developer support content (Calva, Chlorine, Cursive, etc).</p>
</li>
</ol>
<p>Funding will also give me time to go into deeper subjects on the weekly live broadcast I am currently working on.</p>
<p>All content is freely available under a Creative Commons license.  Code examples and projects will be available via the <a href="https://github.com/practicalli">practicalli</a> GitHub organisation.</p>
<h2 id="cidernreplorchard">CIDER/nREPL/Orchard</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-2">Why is this project important to the Clojure community?</h3>
<p>CIDER&rsquo;s the most popular IDE in the Clojure community, and nREPL and CIDER&rsquo;s Orchard are at the heart of most other tools that exist out there.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-2">What are you wanting to achieve with this funding?</h3>
<ul>
<li>Work towards nREPL 0.8 (e.g. built-in completion/info ops)</li>
<li>Work towards CIDER 1.0 (e.g. implementing nREPL&rsquo;s new sideloader)</li>
<li>Finish extracting generic functionality from cider-nrepl to orchard</li>
<li>Improve the documentation for creating nREPL servers and clients</li>
<li>Improve the documentation of CIDER&rsquo;s debugger and how it can leveraged by other editors</li>
<li>Help with the work on new nREPL implementations (e.g. the one for ClojureScript and babashka)</li>
<li>Make CIDER usable with alternative nREPL servers</li>
</ul>
<p>There are many other small improvements that I can potentially tackle, depending on how things go with the main tasks.</p>
<h2 id="figwheel">Figwheel</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-3">Why is this project important to the Clojure community?</h3>
<p>lein-figwheel has 1,093,154 downloads on clojars and figwheel-main has 99,766 downloads</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-3">What are you wanting to achieve with this funding?</h3>
<p>There is a decent backlog of issues for figwheel/lein-figwheel and I have recently taken a sabbatical from my job and I&rsquo;d love to not only work on this backlog but really iron out some glaring figwheel-main usage issues that keep cropping up for people.  On accomplishing that I&rsquo;d like to look at making it even easier to get started with a ClojureScript project. If I get all that done I&rsquo;d like to look at the documentation again and clarify some FAQs like how to deploy a ClojureScript project etc.</p>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied this quarter were:</p>
<ul>
<li>Clojure Goes Fast</li>
<li>clj-kondo, babashka, sci</li>
<li>CIDER, nREPL, Orchard</li>
<li>Practicalli</li>
<li>Fulcro RAD</li>
<li>typed.clj/spec</li>
<li>GraphQLize, HoneyEQL</li>
<li>Spire</li>
<li>re-frame</li>
<li>Figwheel</li>
<li>Rum</li>
<li>Calva</li>
<li>Conjure</li>
<li>Walkable</li>
<li>iSpooge Live</li>
<li>Piggy</li>
<li>Tupelo Forest</li>
<li>Light Table</li>
<li>Saite</li>
<li>Clojure&rsquo;s Boring Web Framework</li>
<li>vim-iced</li>
<li>Chlorine</li>
<li>Datahike</li>
<li>Cloxp 2.0</li>
<li>Perun</li>
<li>Formic</li>
<li>Intro to Programming w/Clojure in Georgian Language</li>
<li>Pathom</li>
<li>Ohmyclj</li>
<li>Klipse</li>
<li>Origami</li>
<li>Oz</li>
<li>form-validator-cljs</li>
</ul>
<h2 id="q2-2020-funding">Q2 2020 Funding</h2>
<p>We had a bunch of great applications from great projects. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, we will re-use that application for future funding cycles. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>March 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/march-2020-monthly-update/</link>
      <pubDate>Wed, 08 Apr 2020 19:55:54 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-2020-monthly-update/</guid>
      <description>Read more updates from Oz, Reagent, Calva, and Ring</description>
      <content:encoded><![CDATA[<h2 id="housekeeping">Housekeeping</h2>
<p>This is the last update from Oz, thanks Christopher! Tim Pope started work on Fireplace on April 1. We&rsquo;re currently receiving proposals for our Q2 2019 funding round. This time around, we&rsquo;re adding two new questions to our application to help us pick projects:</p>
<ul>
<li>&ldquo;Have you been personally impacted by the COVID-19 crisis? How?&rdquo;</li>
<li>&ldquo;Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?&rdquo;</li>
</ul>
<h2 id="oz">Oz</h2>
<p><a href="http://metasoarous.com/blog/oz-clojurists-together-update-5">Oz Updates - Honing in on API updates</a></p>
<p>Picking up from <a href="http://metasoarous.com/blog/oz-clojurists-together-update-4">my latest update</a>, I&rsquo;ve been reviewing the changes proposed in the last post. Along the way, I cleaned up the <a href="http://metasoarous.com/img/posts/oz-clojurists-together-update-5/api-map.png">API diagram</a>.</p>
<p>Note that:</p>
<ul>
<li>The green arrows represent new API functions.</li>
<li>Targets with a <strong><code>*</code></strong> represent side effects.</li>
<li>There&rsquo;s a bit of double-speak going on with <code>filename</code> vs <code>static-files*</code>, but the graph made more sense this way.</li>
</ul>
<p>Specifically regarding the new API functions:</p>
<ul>
<li><code>compile</code> aims to be a new general purpose conversion/compilation function, based on multimethods (more on this below).</li>
<li><code>wrap-html</code> is for taking a hiccup document and wrapping it in an <code>[:html ...]</code> tag with all of the goodies needed for compiling to html.
<ul>
<li>This comes with a slew of new options for controlling the styling/details of the output, as relate to headers and such.</li>
</ul>
</li>
<li><code>embed</code> takes hiccup which might contain Vega-Lite/Vega visualizations and embeds the corresponding viz blocks as html which can be live rendered.
<ul>
<li>This will eventually come with options for how you want to embed; as a live interactive viz, a static image, or both (live viz replaces static once ready).</li>
</ul>
</li>
</ul>
<h3 id="more-oncompile">More on <code>compile</code></h3>
<p>I think the biggest of these breakthroughs is the <code>compile</code> function. I&rsquo;ve had a sense for some time now that the way we think about taking one thing and getting another was in need of some massive overhaul. We already have a <code>html</code> function for rendering hiccup &amp;/or Vega-Lite/Vega as html. And we&rsquo;re looking at having support for static viz compilation and a pdf mode. With all of that going on, I didn&rsquo;t want to start tacking on new API function left and right without thinking about the right way to organize it all.</p>
<p>Here&rsquo;s a map of all the conversions we need to be able to handle:</p>
<p><img src="http://metasoarous.com/img/posts/oz-clojurists-together-update-5/modes-and-formats.png" alt="" title="|"></p>
<p>To handle all of this sanely, I propose a multimethod system where compilers can be registered based on <code>:to</code> &amp; <code>:from</code> entries in an <code>opts</code> map. The default multimethod implementation would first convert the input data to <code>:hiccup</code>, and then convert that hiccup to whatever the intended output format is. This gives us a flexible system where we only have to specify conversions to/from hiccup for any given output type we might want to add in the future, but when appropriate, we can override this when we have a way of implementing it more efficiently.</p>
<p>Note that this all also has to play nice with <code>export!</code>, which is going to get a bit of a makeover in the process, allowing you to export <code>:to</code> a particular format. The default implementation will be to use <code>compile</code> with the appropriate <code>:from</code> and <code>:to</code> settings. However, in cases where we&rsquo;d just be calling out to the vega-cli, we can override to call out to the CLI directly.</p>
<h3 id="options">Options</h3>
<p>Across the API, I&rsquo;ve been reviewing all of the options, and adding specs for them. I&rsquo;m taking the time to do this now to ensure that the overlapping functionality in <code>compile</code>, <code>export!</code>, <code>vega-cli</code> feels internally consistent, and to avoid any conflicts in intended meaning. This is particularly important with a number of functions which expect to be shuttling data back and forth between each other, such as <code>compile</code> and <code>export!</code> as defined above.</p>
<h3 id="crazy-idea">Crazy idea</h3>
<p>One of the crazier ideas that has popped up though (and one on which I&rsquo;d like feedback), is that I&rsquo;d like to make these functions accept options in two different styles:</p>
<pre><code>(export! data filename opts)
(export! data filename &amp; {:as opts})
</code></pre><p>The story here is this: When I inherited forked Oz (from Vizard), it&rsquo;s API used the <code>&amp; {:as opts}</code> variant, and not wanting to break the API for folks who wanted to switch, I stuck with this. At the time, the only real function in the API was the <code>view!</code> function. Given that this was primarily intended for REPL usage, I wasn&rsquo;t too concerned about this.</p>
<p>As Oz grew, I made the decision to stick with the existing pattern, to maintain consistency in the API. However, as more and more of the functionality has come to expand beyond the focus of REPL tooling, this has started to irk me. I like being able to pass option maps as a single argument, as it makes it easier to compose/compute these options and pass in. As mentioned, I didn&rsquo;t want to make the API inconsistent, and I certainly didn&rsquo;t want to break any of it.</p>
<p>The thought occurred to me that I could support both options by defining like this</p>
<pre><code>(defn export!
  ([data filename] (export! data filename {}))
  ([data filename opts]
   ( ...))
  ([data filename opt-k opt-val &amp; {:as more-opts}]
   (export! data filename (assoc more-opts opt-k opt-val))))
</code></pre><p>Having not seen this in the wild much, I kept telling myself it was crazy. But maybe it&rsquo;s crazy like a fox!</p>
<p>And so, with compile and friends (see above) en route, I&rsquo;d like some feedback from the community about whether they think this is a good idea or not. With that in mind, I invite you to contribute to this advisory twitter poll!</p>
<p><a href="https://twitter.com/metasoarous/status/1240085028064727040?s=20">https://twitter.com/metasoarous/status/1240085028064727040?s=20</a></p>
<p>Please leave a vote, and if you have any more specific/nuanced thoughts or concerns, please let me know in a comment there! And thank you in advance for the feedback!</p>
<h3 id="pull-requests">Pull requests!</h3>
<p>I&rsquo;ve been very fortunate this last couple of weeks to have a number of pull requests come in. Some of them have been simple README fixes, others fixes for usage with Shadow-CLJS (which I&rsquo;m considering switching to at some point). Thanks to everyone who has submitted one of these, or even just submitted an issue or comments on an issue letting me know of things that need attention. It&rsquo;s wonderful to have such a helpful community of users :-)</p>
<h3 id="conclusion">Conclusion</h3>
<p>It may feel like things have been moving slowly, but there&rsquo;s been a lot of progress in speccing things out, and hammocking my way through some of the core design problems that Oz faces. And with a number of pull requests having made it in the last few weeks, please expect a release soon which captures all of this great work.</p>
<h2 id="ring">Ring</h2>
<p><strong>March 1-15</strong></p>
<p>The draft spec has now been updated in response to community feedback,
and work on the Ring 2.0 alpha code has begun. The core protocols for
requests and responses have been finished, and work is nearly
complete on the servlet interop functions and Jetty adapter. Once the
tests are all working, the 2.0 branch will be updated.</p>
<p>This leaves websocket support and middleware updates as the next
significant tasks before the first alpha release. Utility namespaces
such as <code>ring.util.request</code> and <code>ring.util.response</code> namespaces will
likely remain Ring 1.0 only, with some of their functionality being
added to the <code>ring.request</code> and <code>ring.response</code> namespaces. I&rsquo;d like
to keep the new namespaces as lightweight as possible, as they&rsquo;ll be
required for anyone using the new protocols.</p>
<p><strong>March 16-31</strong></p>
<p>The servlet interop functions and Jetty adapter have been updated to
support the Ring 2.0 request and response formats. After further
comments by the community, I&rsquo;ve decided to focus a little more on
benchmarking performance for this release, and having looked over the
code I&rsquo;m cautiously optimistic that we can make things a little more
efficient despite the new features.</p>
<p>I&rsquo;ve also decided to test an approach where the default is to support
<em>both</em> Ring 1 and 2 keys in the request map, allowing Ring 1 routes
and Ring 2 routes to be present in the same application. For those
applications that don&rsquo;t need either Ring 1 or Ring 2 support, there
will be an adapter option to force adherence to one version only.</p>
<h2 id="calva">Calva</h2>
<p><strong>March 1-15</strong></p>
<h3 id="debugger">Debugger</h3>
<p>Breakpoints are now found correctly when using the #dbg and #break reader tags, as seen in <a href="https://docs.cider.mx/cider/debugging/debugger.html">Cider&rsquo;s debugging docs</a>. I&rsquo;ve made the functionality around the &ldquo;continue&rdquo; debug option more stable and polished. Some work was done by Peter to improve the token cursor navigation and highlighting concerning reader tags as well, and that has been merged into the debugger branch and helped with finding the location of breakpoints in the editor.</p>
<p>I&rsquo;ve added the feature for evaluations during debug sessions in the context of the debugger. So, for instance, if execution is stopped on a breakpoint, the user can evaluate expressions in the local context, and this can be done in the editor or the REPL window, just as normal evaluations work. When a debug session starts, the REPL window prompt will change to <code>&lt;&lt;debug-mode&gt;&gt;=&gt;</code> to indicate that evaluations will be made in the local context. This gives us the multi-line editing, paredit, and syntax highlighting features of the REPL window to use for debug evaluations, instead of using VS Code&rsquo;s Debug Console.</p>
<p>Maps and collections are not structured yet in the &ldquo;Variables&rdquo; section of the side pane that shows the value of local variables while stopped at breakpoints, but the user can use the above-mentioned features to evaluate data in the editor or in the REPL window, and the pretty printing setting is respected in these cases.</p>
<p>My plans next are to write some tests around this initial core functionality, then write documentation, then do an initial release. This way we can start to get some feedback on the core of the debugger and fix any issues that might arise, plus make sure we&rsquo;re heading in the right direction.</p>
<h3 id="configuration-of-formatting">Configuration of Formatting</h3>
<p>Calva&rsquo;s formatter can now be configured to support different formatting policies - a big thanks to <a href="https://github.com/nbardiuk">nbardiuk</a>. This is something users have been asking for, and we&rsquo;re excited to offer it now! See <a href="https://clojureverse.org/t/calva-gets-configurable-formatting/5596">this post</a> for more information.</p>
<h3 id="other-improvements">Other Improvements</h3>
<p>We are experimenting with leveraging clojure-lsp for static analysis, and have also added more tests for the lexer and token cursor, which further improves the core of Calva.</p>
<p><strong>March 16-31</strong></p>
<h3 id="debugger-1">Debugger</h3>
<p>I fixed some issues involving debugging and the REPL window. This required some modification of code involving the creation of the REPL window, and the handling of nrepl communication.</p>
<p>Terminating the REPL now ends the debug session, since it relies on the REPL.</p>
<p>I also improved the breakpoint-finding code, and this effort is still underway,as I found more cases I needed to account for, particularly around macro characters. I added some logic to our token cursor code to assist with this functionality, and wrote some tests to cover the added logic as well as extra tests to cover some existing logic.</p>
<p>Once the breakpoint-finding code has been improved at least to a satisfiable point, I&rsquo;ll be writing tests for it to ensure that changes to the token cursor or other dependencies in the future will be accounted for and there will be less of a likelihood of debugger regressions.</p>
<p>Documentation will then be written to cover the existing functionality before an initial release is made.</p>
<h3 id="use-of-babashka-on-the-horizon">Use of Babashka on the Horizon</h3>
<p>Soon babashka will have an nrepl server, and with this generic connection enabled, Calva can be used with babashka scripts, much as it can be used with regular Clojure code.</p>
<h2 id="reagent">Reagent</h2>
<p><strong>March 1-15</strong></p>
<p>After reading the previous update, Roman Liutikov (roman01la) messaged me
and mentioned <code>React.memo</code> can be used to wrap functional components and
control when the render function is called. I implemented the same logic
Reagent used with <code>shouldComponentUpdate</code> using this method, and most of
the remaining test cases (where the difference was number of render calls)
were fixed.</p>
<p>After this change, and finally finding the problem with optimized builds and
fixing them, I tested this version of Reagent with a work project, and
didn&rsquo;t find any obvious problems. To help with migration to new Reagent
version, related to moving DOM related functions to separate namespace,
I created Reagent 0.10.0 release. This version marks the functions deprecated,
so library authors have some time to fix calls before functions are removed.</p>
<p><strong>March 16-30</strong></p>
<p>Related to the functional render feature, I implemented first version
of providing options to Reagent. This way existing applications can keep
using the old implementation and Class components, and allow users to choose
if they want to try functional components. Additionally a custom component
can be added, which can be used to control per form if Class or functional
component is created. The first version looks promising, but there are still
a few problems with this. The options have to be provided (at least) to all
<code>render</code>, <code>as-element</code> and <code>reactify-element</code> calls, so in some cases
this can be quite verbose. Probably it is possible to keep one global
variable in Reagent for the default options, and allow users to change that.
Another problem is that several of the caches Reagent uses, need to take
the options into account. I&rsquo;m already testing solution where options are used
to build an object (&ldquo;Compiler instance&rdquo;), and this object can hold the caches.</p>
<p>These changes are also related to the second objective of Clojurist Together grant:
&ldquo;Configurable (Reagent-)hiccup compiler&rdquo; and the first target is to use
configuration for controlling if Class or functional components are created.</p>
<p>Other changes I&rsquo;ve done during the previous two weeks, include improving the
documentation and examples, and adding code coverage reporting to CI and Github.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2020 Survey Results</title>
      <link>https://www.clojuriststogether.org/news/q2-2020-survey-results/</link>
      <pubDate>Fri, 03 Apr 2020 15:36:17 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2020-survey-results/</guid>
      <description>Our call for proposals for new projects will close on Thursday, April 9th, 2020 at 11:59pm PST.</description>
      <content:encoded><![CDATA[<p>Thanks so much for your support and feedback in the latest survey.</p>
<p>Our <a href="/open-source/">call for proposals</a> for new projects will close on Thursday, April 9th, 2020 at 11:59pm PST.</p>
<p>This time around, we&rsquo;re adding two new questions to our application to help us pick projects:</p>
<ul>
<li>&ldquo;Have you been personally impacted by the COVID-19 crisis? How?&rdquo;</li>
<li>&ldquo;Are you part of a group that is affected by systemic bias, particularly in technology? If so, can you elaborate?&rdquo;</li>
</ul>
<p>Note that if you haven&rsquo;t been impacted by either of these, you are still eligible to receive Clojurists Together funding.</p>
<p>We&rsquo;ll be funding four projects $9,000 each over three months ($3,000/mo). This is ideally May-July, but we&rsquo;re able to be a little bit flexible on the start timing.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 60 respondents to the survey, down from 77 in the last survey. The highlights are presented below.</p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things our members were interested in:</p>
<ul>
<li>Error messages</li>
<li>Documentation</li>
<li>Developer experience tools</li>
<li>Build tooling</li>
<li>IDE support</li>
<li>Test tooling</li>
<li>Linters</li>
<li>Profilers</li>
<li>Data analysis/processing frameworks</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>Figwheel</li>
<li>clj-kondo</li>
<li>Kaocha</li>
<li>Reitit</li>
<li>Shadow CLJS</li>
<li>re-frame</li>
<li>Aleph</li>
<li>Manifold</li>
<li>Calva</li>
<li>Cloverage</li>
<li>Chlorine</li>
<li>Conjure</li>
<li>Malli</li>
<li>clj-goes-fast.*</li>
</ul>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<p>Our members also mentioned GraalVM support as something they&rsquo;d like to see improved.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>A sampling of comments:</p>
<ul>
<li>Yes I use Kaocha and shadow-cljs daily and they bring joy to me and my team.</li>
<li>Figwheel Main. I was happy to see James Reeves was supported.</li>
<li>For sure, the new Ring spec looks solid and kickstart a new era for Ring. Calva has had many good additions especially debugger support, same with reagent. Expound is more ready than ever to support spec2.</li>
</ul>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>For company members:</p>
<ul>
<li>15% wanted us to fund 25% mature, 75% speculative</li>
<li>62% wanted us to fund 50% mature, 50% speculative</li>
<li>23% wanted us to fund 75% mature, 25% speculative</li>
</ul>
<p>For developer members:</p>
<ul>
<li>11% wanted us to fund 25% mature, 75% speculative</li>
<li>47% wanted us to fund 50% mature, 50% speculative</li>
<li>38% wanted us to fund 75% mature, 25% speculative</li>
<li>4% wanted us to fund 100% mature, 0% speculative</li>
</ul>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Gathering community, and focusing efforts on most requested things. But not forgetting about upcoming stuff.</li>
<li>Making a real contribution to the Clojure community and various ecosystems more robust and sustainable.</li>
<li>Transparency</li>
<li>Communication with donors</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Get more aggressive about recruiting paying members.</li>
<li>More projects, partial funding, e.g. &ldquo;1 month funding for creating docs &amp; guides&rdquo;</li>
<li>Another marketing round to recruit more funding?</li>
<li>Doing more stuff in the open</li>
</ul>
<p>Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>February 2020 Update</title>
      <link>https://www.clojuriststogether.org/news/february-2020-update/</link>
      <pubDate>Thu, 05 Mar 2020 02:10:55 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/february-2020-update/</guid>
      <description>Read updates from Expound, Oz, Ring, Calva, and Reagent</description>
      <content:encoded><![CDATA[<nav id="TableOfContents">
  <ul>
    <li><a href="#housekeeping">Housekeeping</a></li>
    <li><a href="#around-the-web">Around the web</a></li>
    <li><a href="#expound">Expound</a>
      <ul>
        <li><a href="#caveats">Caveats</a></li>
      </ul>
    </li>
    <li><a href="#oz">Oz</a>
      <ul>
        <li><a href="#feb-2-2020">Feb 2, 2020</a></li>
        <li><a href="#feb-3-2020">Feb 3, 2020</a></li>
        <li><a href="#feb-7-2020">Feb 7, 2020</a></li>
        <li><a href="#feb-7-2020-1">Feb 7, 2020</a></li>
        <li><a href="#feb-26-2020">Feb 26, 2020</a></li>
        <li><a href="#feb-27-2020">Feb 27, 2020</a></li>
        <li><a href="#feb-28th-2020">Feb 28th, 2020</a></li>
        <li><a href="#conclusions">Conclusions</a></li>
      </ul>
    </li>
    <li><a href="#reagent">Reagent</a></li>
    <li><a href="#ring">Ring</a></li>
    <li><a href="#calva">Calva</a>
      <ul>
        <li><a href="#debug-adapter">Debug Adapter</a></li>
        <li><a href="#using-cider-nrepl-debug-middleware">Using cider-nrepl Debug Middleware</a></li>
        <li><a href="#other">Other</a></li>
        <li><a href="#debugger">Debugger</a></li>
        <li><a href="#handling-large-data-sets-and-better-parsing">Handling Large Data Sets and Better Parsing</a></li>
        <li><a href="#other-improvements--fixes">Other Improvements / Fixes</a></li>
      </ul>
    </li>
  </ul>
</nav>

<h2 id="housekeeping">Housekeeping</h2>
<p>We&rsquo;re now one month into our Q2 2020 round, funding Ring, Reagent, Calva, and fireplace.vim. fireplace.vim will be starting later in the grant period, but the rest of the projects started at the start of February.</p>
<p>This is the final update from Ben Brinckerhoff&rsquo;s grant to work on Expound. Thanks Ben! Christopher Small&rsquo;s grant to work on Oz finishes at the end of March.</p>
<h2 id="around-the-web">Around the web</h2>
<p>Clojurists Together was <a href="https://insideclojure.org/2020/02/20/clojure-survey/">mentioned</a> a few times in the <a href="https://clojure.org/news/2020/02/20/state-of-clojure-2020">recent Clojure survey</a>:</p>
<blockquote>
<p>Thank you all for this awesome language and special thanks to Daniel Compton for Clojurists Together.</p>
</blockquote>
<blockquote>
<p>[&hellip;] It was also very nice to see [the] tremendous positive impact Clojurists Together had on the general community!</p>
</blockquote>
<p>lvh was also on the <a href="http://blog.cognitect.com/cognicast/149">Cognicast</a> recently and discussed Clojurists Together and Clojurists Together in-progress move to a new trade association (more to come on this soon). The section on Clojurists Together starts at 39:43.</p>
<h2 id="expound">Expound</h2>
<p><strong>Project Update 5: 2020-02-01 - 2020-02-15</strong></p>
<p>I&rsquo;m taking a break from designing <a href="https://github.com/bhb/expound/issues/189">a better way to customize Expound error messages</a> to work on a version of Expound that will work with <code>clojure/spec-alpha2</code> AKA <code>clojure.alpha.spec</code> AKA <code>spec2</code>.</p>
<p>The new Expound namespace is <code>expound.alpha2</code>. This version will only work with <code>spec2</code> and will NOT be backwards compatible with <code>expound.alpha</code>. Both versions will coexist in the same JAR, so you can use whichever one you want, depending on the version of Spec you use.</p>
<p>In addition to supporting <code>spec2</code>, <code>expound.alpha2</code> will include a number of changes (all of which are subject to change):</p>
<ul>
<li><a href="https://twitter.com/bbrinck/status/1204595098207444993">Hide &ldquo;Relevant specs&rdquo; section by default</a></li>
<li>Remove deprecated <code>expound/def</code> macro (you can still use <code>defmsg</code>)</li>
<li>Make option names more consistent: one option includes the verb &ldquo;show&rdquo; while another includes &ldquo;print&rdquo; and I don&rsquo;t think there&rsquo;s any meaningful difference</li>
<li>Remove headers like &ldquo;Spec failed&rdquo; which add almost no information</li>
<li>Include new API for customizing error messages</li>
<li>Rework internal multi-methods and namespaces to simplify code</li>
</ul>
<p>I&rsquo;m happy to report that my <code>spec2</code> branch has a few passing tests, only 85 or so failing tests to go.</p>
<p><strong>Project Update 6: 2020-02-16 - 2020-02-29</strong></p>
<p>I&rsquo;ve been working on <code>expound.alpha2</code> and I&rsquo;m happy to report I have an early version that works with <code>clojure.alpha.spec</code> AKA <code>spec2</code>.</p>
<p>If you are experimenting with <code>spec2</code> and want to use Expound, you can use commits from the <a href="https://github.com/bhb/expound/pull/186"><code>spec2</code> branch</a>. I won&rsquo;t be releasing JARs for some time, but you can use <code>tools.deps</code> or <a href="https://github.com/reifyhealth/lein-git-down"><code>lein-git-down</code></a> to depend on specific commits.</p>
<p>Here&rsquo;s an example using the &ldquo;movie-times-user&rdquo; example from the <a href="https://github.com/clojure/spec-alpha2/wiki/Schema-and-select">&ldquo;Schema and select&rdquo; wiki page</a></p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">ns </span>example)
(<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[clojure.alpha.spec <span style="color:#e6db74">:as</span> s])
(<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[expound.alpha2 <span style="color:#e6db74">:as</span> expound])

(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::street</span> string?)
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::city</span> string?)
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::state</span> string?) <span style="color:#75715e">;; simplified</span>
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::zip</span> int?) <span style="color:#75715e">;; simplified</span>
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::addr</span> (<span style="color:#a6e22e">s/schema</span> [<span style="color:#e6db74">::street</span> <span style="color:#e6db74">::city</span> <span style="color:#e6db74">::state</span> <span style="color:#e6db74">::zip</span>]))
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::id</span> int?)
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::first</span> string?)
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::last</span> string?)
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::user</span> (<span style="color:#a6e22e">s/schema</span> [<span style="color:#e6db74">::id</span> <span style="color:#e6db74">::first</span> <span style="color:#e6db74">::last</span> <span style="color:#e6db74">::addr</span>]))
(<span style="color:#a6e22e">s/def</span> <span style="color:#e6db74">::movie-times-user</span> (<span style="color:#a6e22e">s/select</span> <span style="color:#e6db74">::user</span> [<span style="color:#e6db74">::id</span> <span style="color:#e6db74">::addr</span> {<span style="color:#e6db74">::addr</span> [<span style="color:#e6db74">::zip</span>]}]))

(<span style="color:#a6e22e">s/explain</span> <span style="color:#e6db74">::movie-times-user</span> {})
<span style="color:#75715e">;; {} - failed: (fn [m] (contains? m :example/id)) spec: :example/movie-times-user</span>
<span style="color:#75715e">;; {} - failed: (fn [m] (contains? m :example/addr)) spec: :example/movie-times-user</span>

(<span style="color:#a6e22e">expound/expound</span> <span style="color:#e6db74">::movie-times-user</span> {})

<span style="color:#75715e">;;-- Spec failed --------------------</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;  {}</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;should satisfy</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;  (fn [m] (contains? m :example/id))</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;or</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;  (fn [m] (contains? m :example/addr))</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;-- Relevant specs -------</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;:example/movie-times-user:</span>
<span style="color:#75715e">;;  (clojure.alpha.spec/select</span>
<span style="color:#75715e">;;   :example/user</span>
<span style="color:#75715e">;;   [:example/id :example/addr #:example{:addr [:example/zip]}])</span>
<span style="color:#75715e">;;</span>
<span style="color:#75715e">;;————————————</span>
<span style="color:#75715e">;;Detected 1 error</span>
</code></pre></div><p>As you can see, there are many rough edges, but it should work for common cases. Please feel free to <a href="https://github.com/bhb/expound/issues">report issues</a>!</p>
<h3 id="caveats">Caveats</h3>
<ul>
<li>The API for <code>expound.alpha2</code> is in flux: breaking changes are expected!</li>
<li>No ClojureScript support</li>
<li><code>fspec</code> is currently broken</li>
<li>Many new features in spec2 may not work, but most of the features ported from spec1 should work fine (except <code>fspec</code>, see above)</li>
</ul>
<h2 id="oz">Oz</h2>
<p><a href="http://metasoarous.com/blog/oz-clojurists-together-update-3">Update 3</a></p>
<h3 id="feb-2-2020">Feb 2, 2020</h3>
<p>I got a deploy to Clojars set up today. However, I am finding testing it out that it&rsquo;s not working. Will have to look into this more tomorrow.</p>
<h3 id="feb-3-2020">Feb 3, 2020</h3>
<p>I&rsquo;ve tracked down the issue from yesterday. It seems that in the process of tweaking my build process to avoid creating an uberjar, I thought it would be safe to remove the line :auto-clean false from my project.clj. This turns out not to be the case, and was found to ultimately be what was causing the JS to not load. (&hellip;)</p>
<h3 id="feb-7-2020">Feb 7, 2020</h3>
<p>Eek! I&rsquo;m only just now getting around to taking the project out of SNAPSHOT and minting an actual release! At long last though, you should now be able to require [metasoarous/oz &ldquo;1.6.0-alpha6&rdquo;]. Again, this release comes with all of the most up to date Vega libraries, and is no longer uberjar&rsquo;d, which will hopefully ease folks development/dependency pains with the project.</p>
<p><a href="http://metasoarous.com/blog/oz-clojurists-together-update-4">Update 4</a></p>
<h3 id="feb-7-2020-1">Feb 7, 2020</h3>
<p>I just finished publishing my latest update and am looking for things to dig into now.</p>
<p>One of the things which has come up recently is the need for increased control of styling and other document header information. In fact, at this very moment this site (metasoarous.com) has the Oz logo as its favicon because that&rsquo;s the only thing it knows how to do :grimacing:</p>
<p>So this is the next thing I&rsquo;ll be working on. (&hellip;)</p>
<h3 id="feb-26-2020">Feb 26, 2020</h3>
<p>Well&hellip; I&rsquo;ve been in Mexico on vacation for the last couple of weeks, and while I had hoped to have some time to work on this, the beaches &amp; tacos have kept me rather more busy than I anticipated. However, I&rsquo;ll be leaving back for Seattle tomorrow and have a bit of time to myself tonight to sip mezcal and continue hacking on html styling.</p>
<p>Last time I started in on this, I realized it&rsquo;s a somewhat thorny design problem. Taking a bit of time off has been a bit helpful though, and in my background mind I&rsquo;ve settled on some particular options for control over styling and layout for now. I&rsquo;ve also been using spec as a sketching/thinking tool for solidifying these ideas, and so will present these options in spec form:</p>
<pre><code>(s/def ::title string?)
(s/def ::description string?)
(s/def ::author string?)
(s/def ::keywords (s/coll-of string?))
(s/def ::shortcut-icon-url string?)

(s/def ::omit-shortcut-icon? boolean?)
(s/def ::omit-styles? boolean?)
(s/def ::omit-charset? boolean?)
(s/def ::omit-vega-libs? boolean?)

(s/def ::hiccup
  (s/and vector?
         #(let [x (first %)]
            (or (keyword x) (string? x)))))

(s/def ::header-extras ::hiccup)

(s/def ::html-opts
  (s/keys :opt-un [::title ::description ::author ::keywords ::shortcut-icon-url ::omit-shortcut-icon? ::omit-styles? ::omit-charset? ::omit-vega-libs? ::header-extras]))
</code></pre><p>The options are now accepted as entries in the opts argument of (oz.core/html spec opts), and do their best to play nice with the options which are currently supported as metadata of the spec argument. In case you didn&rsquo;t know, it&rsquo;s possible to specify hiccup document metadata as markdown metadata like so (in following with the Jekyl pattern):</p>
<pre><code>---
title: A great blog post
published-at: Today
tags: [clojure, oz]
---
## Hello world
Cool blog post, bro.
</code></pre><p>These options will be passed through as metadata on the spec object. Moreover, for options which should affect the html head content, such as [:title :description :author :keywords :tags], this info will get merged into the html-opts for constructing the appropriate html head section. The :tags metadata in particular gets merged in with any keywords which might have been specified explicitly as opts.</p>
<h3 id="feb-27-2020">Feb 27, 2020</h3>
<p>I&rsquo;m now on an airplane on my way back to Seattle, and have been finishing up my implementation of the above, and testing my assumptions about how everything will work together. In particular, I&rsquo;ve gone back and edited out a few of the options out which I&rsquo;m not 100% committed to exposing yet, but may add back in later in some form or another.</p>
<p>As I&rsquo;ve been tinkering around to get things working, I&rsquo;ve realized that the live view currently does not provide correct styling if you are operating offline, since it uses the references to the stylesheets and fonts up on ozviz.io. This has me realizing that ideally the live view server would serve these assets from the project resources. Similarly, for output compiled from export, it may be worth looking at how we can embed these assets directly, so that they aren&rsquo;t as dependent on ozviz.io.</p>
<h3 id="feb-28th-2020">Feb 28th, 2020</h3>
<p>Today I&rsquo;ve been taking another look at my diagram and thinking about how to marry a number of threads of progress I have in mind for Oz&rsquo;s document processing features. In many ways, these threads converge towards a major step up in the abstract conception of what Oz is as a scientific document processing tool.</p>
<ul>
<li>code block highlighting/prettifying</li>
<li>how to flexibly embed visualizations
<ul>
<li>so they can come with pre-rendered images</li>
<li>can &ldquo;come alive&rdquo; (interactive, etc) in an html context</li>
</ul>
</li>
<li>data table components</li>
<li>the ability to extend or customize the base interpretation of Oz hiccup</li>
</ul>
<p>Of course, this is made all the more challenging by the fact that this spec has to get interpreted in multiple ways in multiple places (to static HTML content, to live render view, etc). My initial stab at this is to generalize the processing of hiccup content with a function like this:</p>
<pre><code>(defn process-form
  &quot;Processes a form according to the given processors map, which maps tag keywords
  to a function for transforming the form.&quot;
  [[tag &amp; _ :as form] processors]
  (let [tag (keyword tag)]
    (if-let [processor (get processors tag)]
      (processor form)
      form)))

(defn process
  [spec
   processors]
  (clojure.walk/prewalk
    (fn [form]
      (cond
        ;; If we see a function, call it with the
        ;;  args in form, so that you can
        ;; use fns as components, like Reagent
        (and (vector? form) (fn? (first form)))
        (apply-fn-component form)
        ;; apply processor function if applicable
        (vector? form)
        (process-form form processors)
        ;; Else, assume hiccup and leave form alone
        :else form))
    spec))

(process
  [:div
   [:h1 &quot;Hello&quot;]
   [:foo &quot;What it be like?&quot;]]
  {:foo
   (fn [form]
     (into [&quot;BAR!!!&quot;] (rest form)))})
;; =&gt; [:div [:h1 &quot;Hello&quot;] [&quot;BAR!!!&quot; &quot;What it be like?&quot;]]
</code></pre><p>This is a pretty flexible general purpose approach to processing content, and gives us ways of exposing and overriding defaults as necessary. Some questions remain about how this will get used in different contexts, and how using with a combination of static and live views:</p>
<ul>
<li>Generally, how will these options &ldquo;bubble up&rdquo; to higher level parts of the Oz API?</li>
<li>Will different functions have their own processing defaults?</li>
<li>Is there a better way of organizing or &ldquo;registering&rdquo; processing functions for application in different contexts?</li>
</ul>
<p>These are some pretty big implications to work through as far as how this impacts the overall design and functionality of Oz, and so I&rsquo;m going to take some more time to think through the various use cases and make sure everything makes sense.</p>
<h3 id="conclusions">Conclusions</h3>
<p>This month has been a bit challenging time wise. Still, I&rsquo;ve managed to improve on Oz&rsquo;s static HTML output flexibility and styling. The good news is that I&rsquo;ve been able to secure a bigger chunk of dedicated time to work on the project this month, and am optimistic that I&rsquo;ll be able to get a lot accomplished in the coming weeks!</p>
<p>Please stay tuned :-)</p>
<h2 id="reagent">Reagent</h2>
<p><strong>Update 1</strong></p>
<p>I started right away by testing and implementing the idea I had about creating
functional components from Reagent components (i.e. Hiccup form where first
element is a function). Previously Component Class API was used to trigger
render when dependent RAtoms changed, and state was used to store Reagent
internal state. With new approach, state hooks are used instead:</p>
<p><a href="https://github.com/reagent-project/reagent/pull/477">https://github.com/reagent-project/reagent/pull/477</a></p>
<p>With some tuning, even form-2 and form-3 components can be supported. Of course,
form-3 component still creates Component Class, and hooks won&rsquo;t be usable
inside those. Current status is that 36 tests out of 128 are failing.</p>
<p>I also started investigating how big performance effect the change will have.
Because Reagent needs to effectively emulate Component Class API with
Hooks, to keep backwards compatibility, there will be some performance hit.</p>
<p>During implementation of functional components, I&rsquo;ve also merged some
previously implemented changes to master, and refactored test checks
to provide better failure messages.</p>
<p><strong>Update 2</strong></p>
<p>I&rsquo;ve continued the work in functional components branch, and I managed to fix several of remaining broken tests and commented out rest for now. Some of the fixed tests were related to how Reagent added component stack information into the error messages, which was retrieved from React class component internal properties. I changed the error handling to just mention the name of component where error originated (which can be retrieved for both Class and functional components). React now provides a proper way to get the component stack information for errors using Error Boundaries.</p>
<p>Tests which are now commented out were related to checking how many times a component was rendered when properties changed. These are broken because functional components can&rsquo;t choose if they are rendered after properties change, like Class components using <code>shouldComponentUpdate</code> method. In theory, it is possible to keep track properties and check if they changed, but render call can&rsquo;t be omitted due to how Hooks work. When a component uses Hooks, every render call has to use the same number of Hooks,
and omitting render call if props didn&rsquo;t change breaks this rule. (<a href="https://reactjs.org/warnings/invalid-hook-call-warning.html">https://reactjs.org/warnings/invalid-hook-call-warning.html</a>)</p>
<p>Advanced optimization still breaks some tests, but after those are taken care of, I plan to test some real work projects with this version and to release SNAPSHOT version for others to do some very early testing.</p>
<h2 id="ring">Ring</h2>
<p><strong>Update 1</strong></p>
<p>The previous two weeks have been spent designing a specification for
Ring 2.0 (<a href="https://github.com/ring-clojure/ring/blob/2.0/SPEC-2.md">SPEC-2.md</a>), and writing up an architecture decision
record (<a href="https://github.com/ring-clojure/ring/blob/2.0/doc/adr-spec-2.md">adr-spec-2.md</a>) justifying the design decisions taken. This
is currently just a first draft, and won&rsquo;t be finalized until it&rsquo;s
been extensively tested with an alpha release.</p>
<p>The initial proposal for funding was relatively modest, and after two
weeks of investigation and design work, I believe that this project
can be a little more ambitious and still remain achievable. This
ambition resolves itself into two additional features: support for
websockets and HTTP/2 push promises.</p>
<p>As of writing the first draft of the Ring 2.0 spec is complete. The
ADR is ongoing, with the justification for the websocket and push
promise designs currently still being written.</p>
<p>Once the ADR is complete, the next step is to open a public Github
issue for collecting feedback and constructive criticism from
interested parties.</p>
<p>While that&rsquo;s happening, I&rsquo;ll begin work on an experimental adapter
that implements the draft specification. A working adapter is critical
for testing whether the new specification is viable in practice, and
whether there are any issues with the spec that were missed during the
design process.</p>
<p><strong>Update 2</strong></p>
<p>Over the last two weeks the <a href="https://github.com/ring-clojure/ring/blob/2.0/doc/adr-spec-2.md">ADR</a> for Ring 2.0 has been completed,
and <a href="https://github.com/ring-clojure/ring/issues/393">a Github issue</a> has been posted in order to gather feedback on
the specification from the community.</p>
<p>There&rsquo;s been a good response to the new spec, with some insightful
questions asked. One of the comments has prompted a rethink of the
websocket send method. Other comments have pointed out parts where
the ADR or spec could be extended for clarity.</p>
<p>I&rsquo;m going to try and reply to every comment while I begin work on the
initial Ring 2.0 alpha.</p>
<h2 id="calva">Calva</h2>
<p><strong>Update 1</strong></p>
<p>This first couple of weeks involved mostly information gathering about our primary goal of providing debugging features to Calva.</p>
<h3 id="debug-adapter">Debug Adapter</h3>
<p>It seems best to use <a href="https://code.visualstudio.com/api/extension-guides/debugger-extension">VS Code&rsquo;s debugger extension API</a> since it will be familiar to users of VS Code. It will also help us to display debug-related information like variable values, current point of execution, etc. In order to do this we need to create a debug adapter, which implements the <a href="https://microsoft.github.io/debug-adapter-protocol/">debug adapter protocol</a>.</p>
<p>I spent some time learning about this protocol, looking at other implementations, and reading VS Code&rsquo;s documentation on creating a debug adapter. I also wrote the foundational code for Calva&rsquo;s debug adapter, which so far allows the user to start a debug session with the built-in Start Debugging command (this method of starting will likely change, see below), which starts in attached mode, and disconnect that session.</p>
<h3 id="using-cider-nrepl-debug-middleware">Using cider-nrepl Debug Middleware</h3>
<p>I also spent some time looking at options for providing debugging features in Clojure. Ultimately, cider-nrepl looked to be the best fit:</p>
<ul>
<li>It&rsquo;s very mature and actively maintained (including the debug middleware), and we can get assistance for it when needed.</li>
<li>Calva already utilizes cider-nrepl, so extending that usage for debugging makes sense.</li>
<li>Since the goal is to provide a very similar debugging experience to <a href="https://docs.cider.mx/cider/debugging/debugger.html">Cider&rsquo;s debugger</a>, it makes sense to use what Cider uses.</li>
</ul>
<p>I&rsquo;ve just started to explore how the communication with the debug middleware works and how it will fit into Calva&rsquo;s architecture (this involved gaining more in-depth knowledge of how nREPL itself works). Ideally, a debug session would start when a form containing the #break or #dbg reader macros is evaluated, and would not be started manually by the user. This debug session would also end when that form&rsquo;s evaluation is complete, after performing debug actions like stepping through the code, inspecting values, etc.</p>
<h3 id="other">Other</h3>
<p>My journey into learning nREPL has lead me to see opportunities for our other goal of handling large results gracefully, and I&rsquo;ve relayed that information to Peter, who is doing that work.</p>
<ul>
<li>Version 2.0.75 released
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/552">Support cljs-suitable JavaScript completion</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/548">Fix Printing to Calva REPL prints &lt;repl#7&gt; before each print out</a></li>
</ul>
</li>
<li>Version 2.0.76 released
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/556">Fix Calva locking up when opening files with very long lines</a></li>
</ul>
</li>
</ul>
<p><strong>Update 2</strong></p>
<h3 id="debugger">Debugger</h3>
<p>Evaluating a call to a function that has been evaluated with the #break reader macro in it now causes the VS Code debugger to start automatically. Execution stops at the location of the breakpoint, indicated with the yellow marker and line highlight, and the value of local variables can be seen in the left pane.</p>
<p>I&rsquo;ve implemented the continue debug feature, which continues execution to the next breakpoint, and also made the debugger exit once the current form being debugged has finished evaluating. This also involved using information from cider-nrepl to find the correct location of breakpoints - this part still requires some work, but the basic functionality and flow are there.</p>
<p>I&rsquo;ve also refactored the debugger&rsquo;s communication with cider-nrepl and some other parts of the code as it becomes clearer how the debug adapter and cider-nrepl debug communication flows should work.</p>
<h3 id="handling-large-data-sets-and-better-parsing">Handling Large Data Sets and Better Parsing</h3>
<p>While handling large data sets better is a goal of this funding period, we&rsquo;ve discovered that the foundations of parsing Clojure in Calva need some work, so Peter is giving that side of things much needed attention.</p>
<p>We&rsquo;re also setting up a test harness for our tokenizer, which is important because our TokenCursor implementation is used in many places throughout Calva.</p>
<h3 id="other-improvements--fixes">Other Improvements / Fixes</h3>
<h4 id="version-2078-released---2020-02-28">Version 2.0.78 released - 2020-02-28</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/524">Improve structural navigation through unbalanced brackets</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/566">Fix lexer going into some weird state after flexing certain patterns</a></li>
</ul>
<h4 id="version-2077-released---2020-02-23">Version 2.0.77 released - 2020-02-23</h4>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/561">Make rainbow parens and highlight use the same lexer as Paredit</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/563">Fix: Some character literals throws paredit out of whack</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/549">Fix: Initial expand selection sometimes fails</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/564">Change line comment characters to ;;</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/558">Use editor namespace for custom REPL commands w/o <code>ns</code> specified</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/536">Add support for comment continuation</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>January 2020 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/january-2020-monthly-update/</link>
      <pubDate>Wed, 12 Feb 2020 11:53:57 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/january-2020-monthly-update/</guid>
      <description>Read updates from Expound, Oz, and Deep Diamond</description>
      <content:encoded><![CDATA[<h2 id="housekeeping">Housekeeping</h2>
<p><a href="/news/q1-2020-funding-announcement/">Our next funding round</a> started on February 1st. For Q1 2020 we&rsquo;re funding Ring, Reagent, Calva, and fireplace.vim.</p>
<p>This is the last update from Dragan for his work on Deep Diamond. Ben Brinckerhoff&rsquo;s grant to work on Expound finishes at the end of February, and Christopher Small&rsquo;s grant to work on Oz finishes at the end of March.</p>
<p>David Levi had been selected to work on libpython-clj. However due to other commitments, he wasn&rsquo;t able to continue his work on libpython-clj in the compressed three month grant period and declined funding. We wish David the best and look forward to following developments with libpython-clj. Carin Meier <a href="https://gigasquidsoftware.com/blog/2020/01/10/hugging-face-gpt-with-clojure/">has</a> <a href="https://gigasquidsoftware.com/blog/2020/01/18/parens-for-pyplot/">been</a> <a href="https://gigasquidsoftware.com/blog/2020/01/24/clojure-interop-with-python-nlp-libraries/">writing</a> about how you can interoperate with Python libraries from Clojure. Very cool!</p>
<h2 id="deep-diamond">Deep Diamond</h2>
<h3 id="january-1-15-2020">January 1-15 2020</h3>
<p>In these two weeks of the grant period, I&rsquo;m continuing the work on
cuDNN-based GPU tensors.</p>
<p>I&rsquo;m doing the work on CUDA tensors and cuDNN integration layer, and went
a bit further on achieving the parity and integration with DNNL tensors.</p>
<p>As a part of this, I integrated both cuDNN tensors and DNNL tensors
into the existing Neanderthal convenience API, where possible.</p>
<p>This is a continuation of the work described in the last biweekly report,
and is still not in a stable state. It works (most of the time), but it is not properly tested yet,
and not feature complete. Bugs are expected.</p>
<h3 id="january-16-31-2020">January 16-31 2020</h3>
<p>In these two weeks of the grant period, I made lots of progress regarding the
integration of cuDNN-based tensors and integrating it in the skeleton that
emerged while I worked on DNNL tensors, fully connected layers, and neural network
infrastructure and API.</p>
<p>The (unpolished and only partly tested) work on tensors is pretty much there,
but I still need to create the support for fully connected layers to achieve
parity with the DNNL implementation.</p>
<p>This is still not ready for first release to Clojars (unfortunately, since it would be a
nice output for the funding round), but it is getting there. I&rsquo;ll continue working
on this after this funding period, and expect it to happen in a month or two.</p>
<p>The good news is that the infrastructure work and hard parts are mostly there,
but there is bunch of fighting with DNNL/cuDNN incompatibilities, bugs, etc,
solving and testing the little things. I will work on this while writing the
appropriate chapters of the Deep Learning for Programmers book, so I expect
that the end product would be a polished, tested, and nicely documented API,
and that it will happen relatively quickly.</p>
<h2 id="expound">Expound</h2>
<h3 id="january-1-15-2020-1">January 1-15 2020</h3>
<h4 id="improving-the-display-of-context-values">Improving the display of &ldquo;context&rdquo; values</h4>
<p>Expound error messages display the specific problem within the context of the entire invalid value. For instance, if <code>&quot;456&quot;</code> should be an integer within <code>{:ids [123 &quot;456&quot; 789]}</code>, Expound will print:</p>
<pre><code>  {:ids [... &quot;456&quot; ...]}
             ^^^^^

should satisfy

  int?
</code></pre><p>There are a number of unresolved issues in Expound that all relate to how Expound prints the &ldquo;context&rdquo; value - either by showing too much information (which creates very long error messages) or showing too little (which hides important information about where an invalid value is located).</p>
<p>I&rsquo;ve been doing a lot of design work (writing an ADR and spiking some code) on how I might resolve such issues.</p>
<h4 id="spec-alpha2-support">spec-alpha2 support</h4>
<p>Separately, I&rsquo;ve been beginning to lay some early foundations for <code>expound.alpha2</code> which will support <code>spec-alpha2</code></p>
<ul>
<li>Created a new Expound namespace</li>
<li>Created very basic test that old and new namespaces can be loaded with the corresponding version of spec</li>
<li>Read up on <code>spec-alpha2</code> documentation</li>
</ul>
<h3 id="january-16-31-2020-1">January 16-31 2020</h3>
<h4 id="improving-the-display-of-context-values-1">Improving the display of &ldquo;context&rdquo; values</h4>
<p>I&rsquo;ve continued work on the problem of how to allow users to adapt the error messages for their specific use case.</p>
<p>I drafted an <a href="https://github.com/bhb/expound/blob/master/doc/arch/adr-003.md">ADR</a> (still a work in progress) and spent time spiking out some solutions.</p>
<p>This is a fairly tricky problem and I certainly have lots to learn about designing a &ldquo;data API&rdquo;. If anyone has tips, ideas, or links to prior work, please leave a comment on the <a href="https://github.com/bhb/expound/issues/189">GitHub issue</a> or start a discussion in the <code>#expound</code> channel on <a href="http://clojurians.net">Clojurians Slack</a>.</p>
<h2 id="oz">Oz</h2>
<p>Note: Christopher Small is also blogging about his work, you can find more details on his progress at <a href="http://metasoarous.com/blog">metasoarous.com</a>.</p>
<h3 id="january-1-15-2020-2">January 1-15 2020</h3>
<p>My first funded task for Oz has been to mint new cljsjs releases of the various Vega libraries. The latest Vega-Lite release (4.0.x) in particular comes with quite an impressive set of new features! These include several useful transforms (density plots, regression, loess and quantiles), responsive width/height, image marks, and interactive legends (to name just a few)!</p>
<p>As I&rsquo;ve begun to dig in, I&rsquo;ve decided to keep a sort of running log of my development activities to keep folks up to date on what I&rsquo;ve been working on. Unfortunately, as you&rsquo;ll see below, the process this time around has been somewhat fraught.</p>
<p>Cljsjs has always felt a bit challenging to work with for me. For a family of libraries like Vega, it can be rather cumbersome getting all the right versions, checksums, Google Closure externs all organized into a set of build.boot files, each of which may refer to the versions and such of other build.boot files, and each of which in turn needs its own PR for review, etc.</p>
<p>A while ago I started working on a script for automating this process. It&rsquo;s a beautiful (read: terrifying) bit of bash, of which I&rsquo;m very proud. In general, it&rsquo;s made things quite a bit more manageable for me, but it still seems to take a bit of expertise to wield.</p>
<p>This time around, not only did I hit some of the usual turbulence of working with this system, I also hit a number of miscellaneous issues which have kept me from getting the release out (yet!). However, I&rsquo;m taking this as an opportunity to smooth out this part of the process more generally so that it&rsquo;ll be easier for myself and others in the future. What I&rsquo;d ultimately like to do is empower developers to quickly run this script themselves when they need an updated version of the Vega libs, instead of necessarily having to wait for me to mint a new release of Oz.</p>
<p><a href="http://metasoarous.com/blog/oz-clojurists-together-update-1">Oz Updates - Misadventures with Cljsjs</a></p>
<h3 id="january-16-31-2020-2">January 16-31 2020</h3>
<p><a href="http://metasoarous.com/blog/oz-clojurists-together-update-2">Oz Updates - Finishing up release of updated Vega libraries with Cljsjs</a></p>
<p>Continuing to work on the script for updating new versions of Vega in CLJSJS.</p>
<p><a href="http://metasoarous.com/blog/oz-clojurists-together-update-3">Oz Updates - Finishing Oz release &amp; working on Vega-Leaflet</a></p>
<p>Now that I have Cljsjs releases under way for Vega, I look forward to being able mint a new release of Oz. However, I still have to wait for the releases to come out the other side. So until then, I&rsquo;m going to take advantage of the fact that the Cljsjs build process is fresh in my head, and look at extending it towards some of the other projects I&rsquo;d like Oz to be able to integrate with:</p>
<ul>
<li>Vega-Leaflet</li>
<li>Voyager</li>
</ul>
<p>Unfortunately it appears as if Voyager isn&rsquo;t currently supported. The CLJSJS PRs were merged, and I started exploring Shadow CLJS more. Shadow seems very promising, and may be a better fit for wrapping the core Vega/Vega-Lite functionality than CLJSJS. I&rsquo;m getting close to creating a new release.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2020 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q1-2020-funding-announcement/</link>
      <pubDate>Sun, 26 Jan 2020 11:53:57 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2020-funding-announcement/</guid>
      <description>This quarter we are funding Reagent, Ring, Fireplace, and Calva!</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q1 of 2020 (February-April) we are funding four projects:</p>
<ul>
<li><a href="https://reagent-project.github.io">Reagent</a> with Juho Teperi</li>
<li><a href="https://github.com/tpope/vim-fireplace">fireplace.vim</a> with Tim Pope</li>
<li><a href="https://github.com/ring-clojure/ring">Ring</a> with James Reeves</li>
<li><a href="https://github.com/BetterThanTomorrow/calva">Calva</a> with Brandon Ringe</li>
</ul>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. Previously we have supported <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, <a href="http://www.cider.mx/en/latest/">CIDER</a>, <a href="https://aleph.io">Aleph</a>, <a href="https://neanderthal.uncomplicate.org">Neanderthal</a>, <a href="https://github.com/tpope/vim-fireplace">Fireplace</a>, and <a href="/projects/">other projects</a>.</p>
<h2 id="funding-details">Funding details</h2>
<p>We support our grantees by paying them a total of $9,000 over three months ($3,000/mo).</p>
<h2 id="reagent">Reagent</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community">Why is this project important to the Clojure community?</h3>
<p>Based on Clojars downloads Reagent is the most used ClojureScript React wrapper. Reagent is also one of the most popular ClojureScript projects on GitHub with 3.7k stars, and <a href="https://github.com/day8/re-frame">re-frame</a>, a  framework built on top of Reagent has even more stars.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding">What are you wanting to achieve with this funding?</h3>
<p>I can work on Reagent at work, during our 10% time and in some cases
during customer projects, but this is mostly maintenance and small
fixes, as it is hard to find time for bigger changes.</p>
<p>To implement larger changes I&rsquo;d need some weeks of dedicated time.
Two of the bigger changes I&rsquo;ve been thinking about are:</p>
<ul>
<li>Supporting React hooks</li>
<li>Configurable (Reagent-)hiccup compiler</li>
</ul>
<p>One of the most asked features is if Reagent support for React hooks. Unfortunately hooks are only usable with React functional components. and currently Reagent RAtom implementation uses Stateful Component state. RAtoms need to know which components depend on them, and be able to re-render the component when RAtoms change. This should be possible by storing state and triggering re-render using hooks. The trick will be implement this in a way that doesn&rsquo;t break existing Reagent components, which presume stateful components.</p>
<p>As this affects how Reagent turns Hiccup to React elements and components, I have some ideas on allowing users configure the Reagent Hiccup compiler, similar to what <a href="https://github.com/rauhs/hicada">Hicada</a> does. This would also allow introducing optional features which would break existing Reagent code, by making users opt-in to these. One case would be to make React component interop simpler.</p>
<p>As hooks is the more important feature, I&rsquo;d start by testing out the ideas I have for that, and then see if that it makes sense to implement that alone, or if Hiccup-compiler changes are needed/make sense to implement at the same time.</p>
<p>I think a good outcome would be to have Reagent alpha/rc release with Hooks support with the funding, and even better if I also have time to test ideas for Hiccup-compiler feature.</p>
<h2 id="fireplacevim">fireplace.vim</h2>
<p>Note: Tim has other work commitments for the next few months, and will start work on fireplace once those finish up.</p>
<h3 id="why-is-this-project-important-to-the-clojure-community-1">Why is this project important to the Clojure community?</h3>
<p>Fireplace.vim was used by 10% of Clojure developers in the most recent Clojure survey.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-1">What are you wanting to achieve with this funding?</h3>
<ul>
<li>Leverage the recently added asynchronous APIs for user facing features, starting with eval.</li>
<li>Better automatic configuration for projects, notably Shadow CLJS which is currently a pain to get up and running on.</li>
<li>Attend to various feature requests in the issue tracker (I got the low hanging fruit during the last sponsorship so most of what&rsquo;s left is pretty meaty).</li>
</ul>
<h2 id="ring">Ring</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-2">Why is this project important to the Clojure community?</h3>
<p>Ring is the most commonly used HTTP abstraction layer for Clojure.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-2">What are you wanting to achieve with this funding?</h3>
<p>I&rsquo;d like to bring out a draft spec and experimental alpha for Ring 2.0, in order to better support asynchronous HTTP connections, and to pave the way to support HTTP/2 and HTTP/3 in future. As a secondary objective, I&rsquo;d also like to remove the provided dependency on Java servlets from Ring core.</p>
<h2 id="calva">Calva</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-3">Why is this project important to the Clojure community?</h3>
<p>We&rsquo;ve seen that Calva helps new Clojurists get up and running with Clojure without having to worry so much about tooling. Perhaps more importantly, VS Code has become such a major platform for developers and it&rsquo;s important to have Clojure(Script) support in the developers' editor of choice.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-3">What are you wanting to achieve with this funding?</h3>
<p>We would like to add the ability to work with large data sets. Currently, large data sets can freeze up the REPL session, and this makes Calva unusable for some developers who routinely work with such data. We would also like to add Clojure debugging to Calva. These are the two main goals, but handling large data sets is the priority. If at any point one of these problems seems to require a lot more time than we anticipated, we may shift our focus to handling the one task for the duration of the funding period, if necessary. In addition to those goals, we&rsquo;d like to handle issues here and there and maintain the issue log where needed.</p>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied this quarter were:</p>
<ul>
<li>Conjure</li>
<li>Calva</li>
<li>Reagent</li>
<li>Graphqlize</li>
<li>Ring</li>
<li>Tupelo Forest</li>
<li>iSpooge Live</li>
<li>fireplace.vim</li>
<li>Light Table</li>
<li>Clojure Goes Fast</li>
<li>Saite</li>
<li>Clojure&rsquo;s Boring Web Framework</li>
<li>Practicalli Spacemacs</li>
<li>vim-iced</li>
<li>Chlorine</li>
<li>Typed Clojure</li>
<li>Datahike</li>
<li>Cloxp 2.0</li>
<li>Perun</li>
<li>Formic</li>
<li>Intro to Programming w/Clojure in Georgian Language</li>
<li>Pathom</li>
<li>Ohmyclj</li>
<li>Klipse</li>
<li>Origami</li>
<li>Oz</li>
<li>form-validator-cljs</li>
</ul>
<h2 id="q1-2020-funding">Q1 2020 Funding</h2>
<p>We had a bunch of great applications from great projects. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, we will re-use that application for future funding cycles. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2020 Survey Results</title>
      <link>https://www.clojuriststogether.org/news/q1-2020-survey-results/</link>
      <pubDate>Thu, 09 Jan 2020 19:28:38 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2020-survey-results/</guid>
      <description>We surveyed our members on what they wanted us to support this round. The main things they were interested in were Error messages, Documentation, Developer experience tools, Build tooling, IDE support, Test tooling, Linters, Profilers, and Data analysis/processing frameworks</description>
      <content:encoded><![CDATA[<p>Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter.</p>
<p>The <a href="/open-source/">call for proposals</a> for new projects will close on Wednesday, January 15th, 2019 at 11:59pm PST.</p>
<p>We&rsquo;ll be funding four projects $9,000 each over three months ($3,000/mo).</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 77 respondents to the survey, up from 61 in the last survey. The highlights are presented below.</p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things our members were interested in:</p>
<ul>
<li>Error messages</li>
<li>Documentation</li>
<li>Developer experience tools</li>
<li>Build tooling</li>
<li>IDE support</li>
<li>Test tooling</li>
<li>Linters</li>
<li>Profilers</li>
<li>Data analysis/processing frameworks</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<ul>
<li>ClojureScript compiler</li>
<li>CIDER + orchard ecosystem</li>
<li>Reitit</li>
<li>clj-kondo</li>
<li>re-frame</li>
<li>aleph</li>
<li>Malli</li>
<li>Shadow CLJS</li>
<li>Calva</li>
</ul>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>A sampling of comments:</p>
<ul>
<li>Yes, Shadow is great!</li>
<li>shadow-cljs has seen great improvements and the documentation is pretty great nowadays!</li>
<li>I haven&rsquo;t been getting direct benefits.</li>
<li>Using Cider and clj-http and many other projects with added reliability :)</li>
<li>Yes, Calva is starting to look very promising!</li>
<li>Yes, I use Kaocha every day</li>
</ul>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>We changed this question this time around to ask what percentage of mature to speculative projects people wanted us to fund.</p>
<p>For company members:</p>
<ul>
<li>10% wanted us to fund 25% mature, 75% speculative</li>
<li>60% wanted us to fund 50% mature, 50% speculative</li>
<li>30% wanted us to fund 75% mature, 25% speculative</li>
</ul>
<p>For developer members:</p>
<ul>
<li>6% wanted us to fund 25% mature, 75% speculative</li>
<li>55% wanted us to fund 50% mature, 50% speculative</li>
<li>38% wanted us to fund 75% mature, 25% speculative</li>
<li>1% wanted us to fund 100% mature, 0% speculative</li>
</ul>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Consistency in quality of communication</li>
<li>Nothing to criticise. Maybe sometimes you don&rsquo;t fund projects I&rsquo;m interested in, but at other times you do, which is fine. Just keep doing what you&rsquo;re doing!</li>
<li>Supporting projects makes them also more well known, especially speculative projects, but also add reliability to older projects.</li>
<li>Keeping a transparent, continuous process of growth and development; choosing projects which are actually important; communicating the progress; growing steadily.</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Recurring sponsorships for certain projects (eg cider)</li>
<li>If there were a way to give support by other means than money.</li>
<li>More transparent communication about how projects were chosen. Blog posts or some other requirements about the project work that was done. I feel like to people that are unfamiliar with the project it is very difficult to understand what was actually done.</li>
<li>for some mature projects to have semi-longer support</li>
<li>Get more companies involved, having more ready-made answers for &ldquo;why should we participate&rdquo; to help the devs that are not that inclined to create their own story around this.</li>
</ul>
<p>Stay tuned for some more exciting announcements about Clojurists Together coming soon.</p>
<p>Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>November/December 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/november/december-2019-monthly-update/</link>
      <pubDate>Tue, 31 Dec 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/november/december-2019-monthly-update/</guid>
      <description>November was the first month of our next funding round. libpython-clj and Deep Diamond started in November, Expound started in December, and Oz is starting in January. This is a combined update due to the holiday break.
</description>
      <content:encoded><![CDATA[<p>November was the first month of our next funding round. libpython-clj and Deep Diamond started in November, Expound started in December, and Oz is starting in January. This is a combined update due to the holiday break.</p>
<p>We&rsquo;ve recently rebuilt our website and now have an RSS feed available. You can find a link in the footer of the site.</p>
<h2 id="deep-diamond">Deep Diamond</h2>
<h3 id="november-1-15">November 1-15</h3>
<p>In the first two weeks of the grant period, I&rsquo;ve been working on the Intel DNNL implementation.</p>
<h3 id="november-16-30">November 16-30</h3>
<p>In the second two weeks of the grant period, I&rsquo;ve continued working on the Intel DNNL implementation, and the general API for dense NN layers that use DNNL.</p>
<h3 id="december-1-15">December 1-15</h3>
<p>In these two weeks of the grant period, I&rsquo;ve continued working on
the general API for dense NN layers that use DNNL, and also made some
improvements to the Intel DNNL implementation. I implemented a general
sequential network type and general infrastructure, that can use the
previously implemented DNNL layers and learning algorithms, but is also
ready for other backend implementations (with improvements when necessary).
I also made progress on documentation and examples.</p>
<h2 id="december-16-31">December 16-31</h2>
<p>In these two weeks of the grant period, I&rsquo;m tackling cuDNN-based GPU tensors.
I&rsquo;ve implemented a proof of concept
for an alternative implementation of fully connected layers based on
neanderthal&rsquo;s matrix multiplication, which is a testing bed for
a similar implementation on the GPU, which is needed because
cuDNN does not come with inner product implementation.</p>
<p>I&rsquo;ve also in the middle of work on CUDA tensors and cuDNN integration layer.
Since it&rsquo;s a large task that needs lot of poking around and exploring an
exotic API, most of this is not yet in a consistent enough state to be
commited. I expect to dedicate the following month to taming this beast,
polish it and test it a bit, and set up a consistent infrastructure that
would put Deep Diamond on the track of consistently adding user-facing features.</p>
<h2 id="libpython-clj">libpython-clj</h2>
<h3 id="november-1-15-1">November 1-15</h3>
<p>We wanted to make machine learning and deep learning python libraries available to Clojure developer, using libpython-clj
for a start, we have developed a utility that wraps python code to Clojure code importing functions classes as well as documentation from python to Clojure.
The utility can be found here:
<a href="https://github.com/pycloj/pycloj-exporter">https://github.com/pycloj/pycloj-exporter</a></p>
<p>We have taken some initial decisions on how to transform a python Class into Clojure (a namespace) and how to handle named argument and positional arguments.
The idea is to have an initial paradigm - which will be the basis for an open discussion with the community on the different possibilities.
Using the pycloj-exporter we have created this initial repositories:
<a href="https://github.com/pycloj/pycloj-keras">https://github.com/pycloj/pycloj-keras</a>
<a href="https://github.com/pycloj/pycloj-keras-examples">https://github.com/pycloj/pycloj-keras-examples</a>
<a href="https://github.com/pycloj/pycloj-sklearn">https://github.com/pycloj/pycloj-sklearn</a></p>
<p>Our goals for the current month is to &ldquo;translate&rdquo; tutorials written on python for machine learning and deep learning libraries and show how it can be done with Clojure.</p>
<p>We would also like to improve the automatic translation tools - pycloj-exporter based on the community&rsquo;s input.</p>
<h2 id="expound">Expound</h2>
<h3 id="december-1-15-1">December 1-15</h3>
<p>I&rsquo;ve been focusing on working through the backlog of bugs. I fixed three bugs:</p>
<ul>
<li>Bug with printing failures for multi-specs.</li>
<li>Bug with registering message for set-based specs</li>
<li>Bug with duplicate custom messages in <code>alt</code> or <code>or</code> specs</li>
</ul>
<p>These three bugs are the last known bugs in Expound (not including one bug that is blocked on a <code>clojure.spec</code> bug).</p>
<p>I&rsquo;ve released Expound <a href="https://github.com/bhb/expound/blob/master/CHANGELOG.md#082---2019-12-11">0.8.2</a> which includes these fixes.</p>
<h3 id="december-16-31-1">December 16-31</h3>
<p>Over the past year or so, I&rsquo;ve received a number of feature requests that fall into the following two categories:</p>
<ul>
<li>users want to embed Expound messages in a larger error message or insert extra information into the Expound message</li>
<li>users want to modify how the invalid value is printed</li>
</ul>
<p>Most of my time has been spent doing some design thinking on how I could support these features.</p>
<p>In addition, I&rsquo;ve completed a few small tasks:</p>
<ul>
<li>fixed several boxed math warnings</li>
<li>fixed a bug with using Expound in ClojureScript</li>
</ul>
<p>I&rsquo;ve released Expound <a href="https://github.com/bhb/expound/blob/master/CHANGELOG.md#083---2019-12-29">0.8.3</a> and <a href="https://github.com/bhb/expound/blob/master/CHANGELOG.md#084---2019-12-31">0.8.4</a> which includes these fixes.</p>]]></content:encoded>
    </item>
    
    <item>
      <title>October 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/october-2019-monthly-update/</link>
      <pubDate>Fri, 06 Dec 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2019-monthly-update/</guid>
      <description>October was our third and final month with this round of projects, check out their monthly update!
</description>
      <content:encoded><![CDATA[<p>October was our third and final month with this round of projects, check out their monthly update!</p>
<ul>
<li><a href="http://shadow-cljs.org/">Shadow CLJS</a> with Thomas Heller</li>
<li><a href="https://github.com/noprompt/meander">Meander</a> with Joel Holdbrooks</li>
<li><a href="https://github.com/BetterThanTomorrow/calva">Calva</a> with Peter Strömberg</li>
<li><a href="https://cider.mx/">CIDER</a> with Bozhidar Batsov</li>
</ul>
<h1 id="shadow-cljs">Shadow CLJS</h1>
<p>Released version 2.8.69</p>
<h2 id="inspect">Inspect</h2>
<p>I spent the last few weeks implementing the first version of a new &ldquo;Inspect&rdquo; feature. It was inspired by REBL, fulcro-inspect and re-frame-10x. My first goal with this is to bring the <code>console.log</code> experience from the Browser to all other JS platforms and Clojure itself. <code>console.log</code> in the Browser is great because it is basically a <code>prn</code> on steroids. Instead of getting one large blob of text you get a structured output you can easily inspect visually. It is however limited in the Browser, basically abusing the built-in Browser devtools. &ldquo;Inspect&rdquo; runs in an independent UI (currently the shadow-cljs Web UI) and can be used to inspect any supported runtime. These include react-native, node and Clojure which previously had a rather basic <code>prn</code> experience.</p>
<p>This combines a generic remote Data Viewer along with support for <code>tap&gt;</code> in the runtime to &ldquo;expose&rdquo; new values to the UI. Later versions of &ldquo;Inspect&rdquo; will also include direct REPL integration and some other features found in similar tools.</p>
<p>I&rsquo;m very excited about this feature and it is just getting started. I wrote a bit more about it <a href="https://clojureverse.org/t/introducing-shadow-cljs-inspect/5012">here</a>. This is all still undergoing a lot of changes but has become part of my normal workflow already. I hope others will find it useful as well.</p>
<h2 id="bugfixes">Bugfixes</h2>
<ul>
<li>
<p>Optimized macro reload logic to consume less resources</p>
</li>
<li>
<p>Optimized npm reload logic to consume less resources</p>
</li>
<li>
<p>Fixed an nREPL bug related to cloned sessions (causing problems in cider-nrepl)</p>
</li>
<li>
<p>Updated to most recent releases of the Closure Compiler and Library</p>
</li>
</ul>
<h1 id="meander">Meander</h1>
<h2 id="ux">UX</h2>
<p>Some users had intermittently reported problems with <code>defsyntax</code> and its use of <code>clojure.spec.alpha/conform</code>. After some digging around I discovered the problem was due to a patch to the core specs library which changed the names of some of the keys thus breaking the use of conform in <code>defsyntax</code>. To fix the problem, <code>defsyntax</code> now has its own specs and no longer relies on <code>clojure.core.specs.alpha</code>.</p>
<p>In other areas corrections to or movement of specs were made to improve the quality of life for users using spec instrumentation.</p>
<p>One of the most significant improvements in October came in the form of ClojureScript build size. We had some reports of Meander resulting in very large ClojureScript builds (even with advanced compilation) causing people to be unable to use the library seriously. Fortunately, with the help of Thomas Heller and Jimmy Miller, we were able to completely eliminate the build size problem altogether.</p>
<h2 id="performancecode-generation-improvements">Performance/Code generation improvements</h2>
<p>The performance of n or more patterns when using the <code>search</code> macro by define runtime was given a boost by writing functions specially suited to the task.</p>
<p>Continuing with improvements to reference (the symbols that look like <code>%foo</code>) compilation last month, this month I fixed a subtle bug which could cause code size to increase substantially with by combining cyclic references and <code>or</code> patterns. While patterns would still match as expected, the resulting code size and compiler performance in these cases was unacceptable. Additionally, unused functions are no longer produced by reference code generation.</p>
<p>To reduce code size, the internal process which attempts to merge two nodes in the intermediate representation made some progress. Merging is attempted when two nodes have similar properties. If their properties are the same, then an attempt is made to merge their children. In the past, if any of the submerges failed, the whole merge would fail. This is not the desired outcome. Since the two nodes are similar enough to combine the merge process now combines the two nodes and produces a branch node (a choice between patterns) with the children. This reduces the generated code size significantly and avoids doing extra work.</p>
<p>Substitution got better this month with <code>with</code> pattern enhancements/fixes. Recursive references to map patterns which used memory variables i.e. <code>%m {!k !v &amp; %m}</code> used to stack overflow, now they don&rsquo;t. The substitution compiler now uses the same acyclic reference inlining as the match compiler avoiding the cost of function calls at runtime.</p>
<h2 id="enhancements">Enhancements</h2>
<p>Toward the end of the month I wanted to shift my attention to making the <code>cata</code> pattern matching operator available on the substitution side of <code>rewrite</code> and <code>rewrites</code> clauses. The semantics of the substitution version of the <code>cata</code> pattern is to recursively rewrite with a constructed value via substitution. So <code>(cata [?x ?y])</code> on the substitution side would first construct <code>[?x ?y]</code> then recurse. This provides an elegant way to write non-trivial recursive rewrite systems which are very useful when work with recursively structured data. While my goal was to have it complete by the end of the month, I just couldn&rsquo;t quite pull it off in time. However, this work is near completion and I expect to make it available soon.</p>
<h1 id="calva">Calva</h1>
<h2 id="october-1-15">October 1-15</h2>
<p>Theme: <em>Changes Spree</em></p>
<p>Two weeks, seven new Calva versions. We got into a flow, changing, testing, releasing. Christian Fehse kept a speed where I had a hard tine keeping up with testing and giving feedback. But I managed 😄, and even got a few changes in myself, plus some documentation.</p>
<h3 id="changes">Changes</h3>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/397">Fix Toggle the &ldquo;Use WSL&rdquo; setting requires extension restart to effect definition provider</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/132">Fix Go to Definition and Peek Definition not working on Windows 10 when using WSL</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/401">Fix Highlight extension settings are uninitialized if no Clojure editor active on activation </a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/255">Fix Overly aggressive paredit in REPL window</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/260">REPL window use it own set of paredit hotkeys and these are not configurable</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/394">Fix Completion in REPL window should work like in the editor</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/374">Fix bugs in comment form selection</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/257">Use of undeclared var in REPL window resets the namespace</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/391">Remove warning that extensions use the <code>vscode-resource:</code> scheme directly</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/366"><strong>Support Jack-in without file open for single-rooted workspace</strong></a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/238"><strong>Show argument list of fn</strong></a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/367">Make code more robust in case Jack-in task fails</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/385">Fix dimming out of stacked ignored forms</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/368">The extension should specify the default schemes for document selectors</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/356">Connect warnings and errors as popups</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/383">Don&rsquo;t remove default indents when Calva is not the auto-formatter</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/281"><strong>Support for custom project/workflow commands</strong></a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/362">Insourcing @tonsky&rsquo;s Clojure Warrior, now named Calva Highlight</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/358">Update pprint status bar when configuration changed</a></li>
</ul>
<h3 id="documentation-and-promotion">Documentation and promotion</h3>
<p>I wrote a <a href="https://clojureverse.org/t/it-is-super-easy-to-hack-on-calva-why-dont-you-try-it-out/4953">small blog post</a> about the streamlined, and friendly, Calva contribution process. This had me start thinking about the mess that was supposed to pass for user documentation. It got me to:</p>
<ul>
<li>Move user documentation from the wiki to: <a href="https://calva.readthedocs.io/">https://calva.readthedocs.io/</a></li>
<li>Change <a href="https://github.com/BetterThanTomorrow/calva/wiki">the repo wiki</a> to be about Calva development only.~</li>
</ul>
<h2 id="october-16-31">October 16-31</h2>
<p>Theme: <em>Quality through issue hunting</em></p>
<p>As the Calva user base grows (which is currently happening) the influx of <a href="https://github.com/BetterThanTomorrow/calva/issues">issues</a> is also growing. During the funding period we have been able shrink the total issues count from near the 100s down to, at the time of this writing, 62. This even though close to 150 issues where opened during the same period! The last two weeks of October continued with the issue-squashing.</p>
<p>Also, with help from Michiel Borkent, aka <a href="https://github.com/borkdude">@borkdude</a>, creator of <a href="https://github.com/borkdude/clj-kondo">clj-kondo</a>, we managed to bring the Clojure linting story for VS Code users down to:</p>
<p>– <em>”Install the <a href="https://marketplace.visualstudio.com/items?itemName=betterthantomorrow.calva">Calva Extension</a>.”</em></p>
<p>🎉 Even for Windows users. 🥂</p>
<h3 id="changes-1">Changes</h3>
<ul>
<li>Add setting for whether to open REPL Window on connect or not</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/300">Re-open REPL windows where they were last closed</a></li>
<li>Lexer performance considerably improved. Fixes <a href="https://github.com/BetterThanTomorrow/calva/issues/228">this</a> and <a href="https://github.com/BetterThanTomorrow/calva/issues/128">this</a>)</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/303">REPL colours and logo a bit toned down</a></li>
<li>Removed <code>useWSL</code>configuration option because the use of Calva is fully supported through the <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl">Remote - WSL</a> extension.</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/237">Add commands for interrupting the current evaluation as well as all running evaluations</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/377">Calva asks for user input when <code>stdin</code> needs it (e.g. <code>read-line</code>)</a></li>
<li>Command for clearing the REPL history reworked and now also ”restarts” the REPL window.</li>
<li>Commands are now added to REPL window history only if they are not identical to the previous command on the history stack.</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/411">Fix floating promises in evaluation module</a></li>
<li>REPL Window Evaluation errors now initially hide the stack trace. The user can show it with a click.</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/423">Stop linting, start bundling clj-kondo</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/377">Fix hang when user input is requested</a></li>
<li>Upgrade to <code>cider-nrepl 0.22.4</code></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/396">Add info box for VIM Extension users</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/115">Fix undefined namespace when starting a shadow-cljs cljs REPL Window </a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/399">Make opening the REPL window on connect async</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/404">Fix shadow-cljs menuSelections for Custom Connect Sequences</a></li>
</ul>
<h3 id="documentation">Documentation</h3>
<p>In an effort to help potential contributors to Calva figure out the project, I wrote a sort of a manifest: <a href="https://github.com/BetterThanTomorrow/calva/wiki">The Tao of Calva</a>.</p>
<p>We have also worked on closing some gaps in the developer documentation, adding these articles to the wiki:</p>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/wiki/Coding-Style">Code Style Guidelines</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/wiki/Smoke-Testing">Smoke testing</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/wiki/Testing-VSIX-Packages">Testing VSIX packages</a></li>
</ul>
<h3 id="other">Other</h3>
<p>This report concludes the Clojurists Together 2019 Q3 sponsorship of Calva. We will probably apply again, sometime soon, Calva is far from finished!</p>
<p>Meanwhile, a few days ago I got my GitHub Sponsors profile approved, so now you can <a href="https://github.com/sponsors/PEZ">sponsor me</a> there. Please do!</p>
<h1 id="cider">CIDER</h1>
<ul>
<li>
<p>Shipped CIDER 0.23</p>
</li>
<li>
<p>Shipped cider-nrepl 0.22.4 (fixes several bugs)</p>
</li>
<li>
<p>Shipped orchard 0.5.3 (fixes a small bug with ClojureDocs)</p>
</li>
<li>
<p>Shipped piggieback 0.4.2 (it doesn&rsquo;t blow up in the absence of ClojureScript)</p>
</li>
<li>
<p>Shipped nREPL 0.7.0-alpha2 with support for sideloading (<a href="https://nrepl.org/nrepl/design/middleware.html#_sideloading">https://nrepl.org/nrepl/design/middleware.html#_sideloading</a>)</p>
</li>
<li>
<p>Participated in &ldquo;The REPL&rdquo; :-)</p>
</li>
<li>
<p>Published a couple of CIDER-related blog posts (<a href="https://metaredux.com/posts/2019/10/05/hard-cider-project-specific-configuration.html">https://metaredux.com/posts/2019/10/05/hard-cider-project-specific-configuration.html</a> and <a href="https://metaredux.com/posts/2019/10/07/hard-cider-navigating-cider-buffers-ninja-style.html">https://metaredux.com/posts/2019/10/07/hard-cider-navigating-cider-buffers-ninja-style.html</a>)</p>
</li>
<li>
<p>More details on CIDER 0.23 - <a href="https://metaredux.com/posts/2019/10/08/cider-0-23-lima.html">https://metaredux.com/posts/2019/10/08/cider-0-23-lima.html</a></p>
</li>
<li>
<p>Launched &ldquo;The State of CIDER&rdquo; survey - <a href="https://metaredux.com/posts/2019/11/02/state-of-cider.html">https://metaredux.com/posts/2019/11/02/state-of-cider.html</a></p>
</li>
<li>
<p>Wrote a couple of &ldquo;Hard CIDER&rdquo; blog posts - <a href="https://metaredux.com/posts/2019/11/07/hard-cider-hard-restart.html">https://metaredux.com/posts/2019/11/07/hard-cider-hard-restart.html</a> and <a href="https://metaredux.com/posts/2019/11/02/hard-cider-understanding-the-jack-in-process.html">https://metaredux.com/posts/2019/11/02/hard-cider-understanding-the-jack-in-process.html</a></p>
</li>
<li>
<p>A bunch of small CIDER improvements as documented here <a href="https://github.com/clojure-emacs/cider/blob/master/CHANGELOG.md#master-unreleased">https://github.com/clojure-emacs/cider/blob/master/CHANGELOG.md#master-unreleased</a> Most compatibility with Emacs 25 has been restored and the debugger&rsquo;s menu and keybindings are configurable.</p>
</li>
<li>
<p>Cut a new Orchard release which fixes a bug with empty namespaces (<a href="https://github.com/clojure-emacs/orchard/pull/76)">https://github.com/clojure-emacs/orchard/pull/76)</a>. Cross-project collaboration for the win! :-)</p>
</li>
<li>
<p>Published cider-nrepl&rsquo;s API - <a href="https://docs.cider.mx/cider-nrepl/nrepl-api/ops.html">https://docs.cider.mx/cider-nrepl/nrepl-api/ops.html</a></p>
</li>
<li>
<p>Misc improves to CIDER and cider-nrepl&rsquo;s doc site</p>
</li>
</ul>]]></content:encoded>
    </item>
    
    <item>
      <title>Q4 2019 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q4-2019-funding-announcement/</link>
      <pubDate>Tue, 05 Nov 2019 14:00:00 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q4-2019-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q4 of 2019 (November-January) we are funding four projects: Expound with Ben Brinckerhoff, Deep Diamond (Neanderthal) with Dragan Djuric, Libpython-clj with David Levy, Oz with Christopher Small.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q4 of 2019 (November-January) we are funding four projects:</p>
<ul>
<li><a href="https://github.com/bhb/expound">Expound</a> with Ben Brinckerhoff</li>
<li><a href="https://github.com/uncomplicate/deep-diamond">Deep Diamond (Neanderthal)</a> with Dragan Djuric</li>
<li><a href="https://github.com/cnuernber/libpython-clj">Libpython-clj</a> with David Levy</li>
<li><a href="https://github.com/metasoarous/oz">Oz</a> with Christopher Small</li>
</ul>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. Previously we have supported <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, <a href="http://www.cider.mx/en/latest/">CIDER</a>, <a href="https://aleph.io">Aleph</a>, <a href="https://neanderthal.uncomplicate.org">Neanderthal</a>, <a href="https://github.com/tpope/vim-fireplace">Fireplace</a>, and <a href="/projects/">other projects</a>.</p>
<h2 id="funding-details">Funding details</h2>
<p>We support our grantees by paying them a total of $9,000 over three months ($3,000/mo).</p>
<h2 id="deep-diamond-neanderthal">Deep Diamond (Neanderthal)</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community">Why is this project important to the Clojure community?</h3>
<p>It is the infrastructure for deep learning, machine learning, and other high performance scientific software based on high-performance tensor operations.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding">What are you wanting to achieve with this funding?</h3>
<p>Create a lean, high performance, infrastructure for working with tensors in Clojure, with emphasis on Deep Learning.</p>
<p>This is something that is currently poorly supported on the JVM, let alone Clojure. The state of the art implementation of low-level operations is provided by Nvidia&rsquo;s cuDNN library on Nvidia GPUs and, very recently, by Intel on the CPU through its open source library MKL-DNN (renamed to DNNL). Leading high-level libraries for DL, TensorFlow and PyTorch, build on these libraries with lots of C++/Python cruft on top.</p>
<p>I propose to implement:</p>
<ul>
<li>A clean low-level Clojure-oriented integration with Intel&rsquo;s DNNL (aka MKL-DNN) for tensors on the CPU</li>
<li>A clean and developer-friendly mid-level tensor API for Clojure that integrates well with leading low-level libraries (DNNL and cuDNN)</li>
<li>A user-friendly and developer-friendly high-level API for deep neural networks in Clojure</li>
<li>A developer-friendly implementation of fully-connected (dense) neural network layers in Clojure</li>
<li>An extension infrastructure for various backend implementations, with at least 2 implementations: DNNL-based and pure Neanderthal-based (for fully connected layers)</li>
<li><em>optional</em> A clean low-level integration with Nvidia&rsquo;s cuDNN for tensors on the GPU</li>
<li><em>optional</em> An implementation of convolutional layers on the CPU and/or GPU (DNNL and/or cuDNN)</li>
</ul>
<p>For most of these items, I have already created several prototypes while DNNL was in development, before it was officially released, so I am sure I can deliver nice results during the Clojurists Together funding period. I have already solved most of the tricky problems, and most of my work would consist of revisiting bits and pieces, updating and testing them, and polishing them into a nice, user-friendly, usable library.</p>
<p>Items marked as <em>optional</em> are also going to be provided, but I cannot promise that I&rsquo;ll be able to deliver them during the three-month funding period.</p>
<p>This would serve as:</p>
<ul>
<li>A fast and simple Clojure-first infrastructure library that people can build on top of for everything tensor-related (which includes lots of ML)</li>
<li>A fast and user-friendly deep neural networks implementation for Clojure</li>
<li>A showcase for Clojure&rsquo;s capabilities in expressiveness and performance (it will be as fast or faster than alternatives in Python, Julia, Java, etc.)</li>
</ul>
<p>This would NOT be a port of TensorFlow, or PyTorch, or MXnet, or DL4J to Clojure. It does not even aim for the same features. As an JVM analogy, it would stand in a similar position as Clojure vs Spring framework. It should leverage DNNL and cuDNN to provide high-performance tensor operations similarly to how Clojure leverages JVM, and enable users to then use Clojure to find simpler and more effective ways to build higher-level functionality on top of it, some of which it would also provide.</p>
<h3 id="anything-else-we-should-know">Anything else we should know?</h3>
<p>This project is applied for as part of Neanderthal, since this is the keyword that people in the community associate my work with, but this work kick-starts a separate library, Deep Diamond, that extends Neanderthal, living in its own github repository, <a href="https://github.com/uncomplicate/deep-diamond">uncomplicate/deep-diamon</a>.</p>
<h2 id="expound">Expound</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-1">Why is this project important to the Clojure community?</h3>
<p>Expound is useful for any project that uses spec to validate external or internal data, since it allows developers to more quickly understand spec failures.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-1">What are you wanting to achieve with this funding?</h3>
<ol>
<li>Work through bug backlog</li>
<li>The project has evolved considerably since it started and has added several features. Unfortunately, that means the core is a bit brittle since it is based on building up strings. I&rsquo;d like to refactor the core to build up a representation of the error message as a document, inspired by <a href="https://github.com/brandonbloom/fipp/blob/master/doc/primitives.md">https://github.com/brandonbloom/fipp/blob/master/doc/primitives.md</a>. This refactor will make further features possible like allowing users to remove parts of the error message.</li>
<li>I don&rsquo;t know when spec2 will come out, but I&rsquo;d like to start a branch of Expound which uses spec2 so that when spec2 is released, a compatible version of Expound is also available.</li>
</ol>
<h2 id="oz">Oz</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-2">Why is this project important to the Clojure community?</h3>
<p>Clojure is rapidly gaining momentum as a language for Data Science, with numerous numerical computing and machine learning advancements in the last year or two. In contrast with established players in this space such as R and Python, Clojure has a unique value proposition in offering a robust front-end ecosystem for developing dynamic web applications to visualize and explore data.</p>
<p>However, while ClojureScript offers a first class front-end development experience, data visualization specifically has long been an under-served need in both Clojure &amp; ClojureScript. The ability to flexibly leverage Vega-Lite and Vega, with their Clojuresque data-driven/declarative design, has the potential to close this gap.</p>
<p>Oz has already positioned itself as a leading data visualization tool in the Clojure ecosystem. This funding would let me take the project to the next level, and make it a more powerful and flexible tool. In so doing, I hope to help position our beloved language as a leader in this rapidly growing and increasingly important space.</p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-2">What are you wanting to achieve with this funding?</h3>
<ul>
<li>Static compilation of Vega-Lite/Vega specs to SVG or JPG/PNG formats, enabling generation of PDF and fully-static HTML output (also solving issues with existing Jupyter integration)</li>
<li>Static site generation features around Oz&rsquo;s existing Hiccup and Markdown compilation/rendering abilities</li>
<li>Extend the Reagent API to allow for plugging into Vega signal graph, enabling tighter dataflow integration with the enclosing application</li>
<li>Figwheel style live reloading of Clojure, Hiccup &amp; Markdown files</li>
<li>Interoperability with other notebook environments, such as Nextjournal &amp; Gorilla-REPL, to complement existing Jupyter integration</li>
<li>Miscellaneous: LaTeX support, grid/table components/helpers, resolve outstanding issues, improve documentation</li>
</ul>
<p><strong>Note:</strong> Christopher will work on Oz from January-March to allow him enough time to wrap up existing commitments.</p>
<h2 id="libpython-clj">Libpython-clj</h2>
<h3 id="why-is-this-project-important-to-the-clojure-community-3">Why is this project important to the Clojure community?</h3>
<p>Nowadays, a bridge with Python would be the only practical way to access best-in-class libraries in several fast-growing fields, such as machine learning and probabilistic computing.</p>
<p>Even though the Libpython-clj bridge is already standing and functional, some additional work is necessary to make it actually comfortable to walk over.</p>
<p>Paving the bridge is not only an essential step in making Clojure a viable platform for data science, but also has the potential to make Clojure relevant to the needs and expectations of the huge audiences of new developers and data scientists, who typically study Python as their main language nowadays.</p>
<p>For additional background, one may look into the video of the community meeting we have had about this project:
<a href="https://www.youtube.com/watch?v=ajDiGS73i2o%22">https://www.youtube.com/watch?v=ajDiGS73i2o&quot;</a></p>
<h3 id="what-are-you-wanting-to-achieve-with-this-funding-3">What are you wanting to achieve with this funding?</h3>
<p>Libpython-clj is a new library that allows Clojurians access to the whole Python ecosystem.</p>
<p>The goal of the proposed project is to improve developer experience around Libpython-clj in several aspects:</p>
<ul>
<li>Document important parts of Libpython-clj internals and API.</li>
<li>Use it to turn a chosen Python library (e.g., tensorflow) into a Clojure library.</li>
<li>Match typical Python errors and exceptions with informative Clojure error messages.</li>
<li>Match Python docstrings with corresponding Clojure functions.</li>
<li>Further document the library with tutorials.</li>
<li>Support a user-friendly container-based easy installation.</li>
<li>Reflect on the above process, and assess the resulting developer experience.</li>
<li>Suggest a roadmap for automating the relevant parts of the process to support up-to-date, well documented Clojure wrappers of Python libraries.</li>
<li>Possibly improve relevant aspects of Libpython-clj, such as session management (multiple interpreters) and resource management.</li>
<li>One possible model for this process may be the Panthera Clojure library, that wraps the Pandas Python library. The approach of the current project will by inspired by that, but may be different.</li>
</ul>
<p>Through the process of work, the precise form of API and the library to wrap will be chosen in dialogue with the community. The emerging developer experience will be continuously assessed by implementing realistic use cases, and by communicating the results with the community. Concrete steps will be prioritized accordingly.</p>
<h3 id="anything-else-we-should-know-1">Anything else we should know?</h3>
<p>David Levy, the applicant will be working in coordination with the original author (Chris Nuernberger), with the author of the related Panthera library (Alan Marazzi) and with the <a href="https://twitter.com/scicloj">Scicloj</a> community.</p>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied this quarter were:</p>
<ul>
<li>Fireplace</li>
<li>Light Table</li>
<li>Deep Diamond</li>
<li>Expound</li>
<li><a href="github.com/clojure-goes-fast">Clojure Goes Fast</a></li>
<li>Shadow CLJS</li>
<li>Paravim</li>
<li>Saite</li>
<li>Libpython-clj</li>
<li>Clojure&rsquo;s Boring Web Framework</li>
<li>Practicalli Spacemacs</li>
<li>vim-iced</li>
<li>Chlorine</li>
<li>Typed Clojure</li>
<li>Datahike</li>
<li>Cloxp 2.0</li>
<li>Perun</li>
<li>Formic</li>
<li>Intro to Programming w/Clojure in Georgian Language</li>
<li>Pathom</li>
<li>Ohmyclj</li>
<li>Klipse</li>
<li>Origami</li>
<li>Oz</li>
<li>form-validator-cljs</li>
</ul>
<p>We&rsquo;ve always had lots of great applications, but this quarter in particular there were a bunch of awesome projects that we wished we could have funded. Thanks to everyone who applied!</p>
<h2 id="q4-2019-funding">Q4 2019 Funding</h2>
<p>We had a bunch of great applications from great projects. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, we will re-use that application for future funding cycles. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>September 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/september-2019-monthly-update/</link>
      <pubDate>Mon, 28 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/september-2019-monthly-update/</guid>
      <description>September was our second month with this round of projects, check out their monthly update!</description>
      <content:encoded><![CDATA[<p>September was our second month with this round of projects, check out their monthly update!</p>
<ul>
<li><a href="http://shadow-cljs.org/">Shadow CLJS</a> with Thomas Heller</li>
<li><a href="https://github.com/noprompt/meander">Meander</a> with Joel Holdbrooks</li>
<li><a href="https://github.com/BetterThanTomorrow/calva">Calva</a> with Peter Strömberg</li>
<li><a href="https://cider.mx/">CIDER</a> with Bozhidar Batsov</li>
</ul>
<h2 id="shadow-cljs">Shadow CLJS</h2>
<h3 id="september-1-15">September 1-15</h3>
<ul>
<li>Released shadow-cljs versions 2.8.53 - 2.8.59</li>
<li>Rewrote most of the nREPL implementation to improve compatibility with cider-nrepl.</li>
<li>Added shadow-cljs classpath to print the classpath from the CLI</li>
<li>Fixed an issue causing &ldquo;Too many open files&rdquo; on some systems</li>
<li>Added basic CLJS prepl support</li>
</ul>
<h3 id="sept-16-30">Sept 16-30</h3>
<ul>
<li>Added <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#warnigs-as-errors">:warnings-as-errors</a> to treat certain warnings as errors instead. Mostly intended for CI builds that should fail instead of warn.</li>
<li>Changed the behavior of <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#build-hooks">:build-hooks</a> so thrown exceptions fail the build, instead of just being logged.</li>
<li>Added :devtools {:log-style &ldquo;color: red;&quot;} to allow customizing the styles used for shadow-cljs log messages in the browser during development. Suggestions welcome for a better default color schema. The default blue doesn&rsquo;t play so nice with dark-mode.</li>
</ul>
<h2 id="meander">Meander</h2>
<h3 id="september-1-15-1">September 1-15</h3>
<p>The work for the first half of September saw several improvements to ergonomics, documentation, code generation, and the official release of the epsilon branch of the project.</p>
<ul>
<li>Improving map pattern ergonomics and performance</li>
<li>Previously, the match macro would never allow maps patterns to contain logic variable keys. The reason for this was due to the semantics of match pattern matching which requires that each pattern have one, and only, one possible match. A map pattern with a logic variable key — in isolation — could yield multiple solutions for that logic variable. However, if the map pattern is not in isolation, and the logic variables has been previously bound, then the restriction to disallow variable keys can be relaxed. Not only does this allow the match macro do more than it could before, it also greatly improved performance for these cases as it eliminated needless searches.</li>
<li>Improving code generation</li>
<li>Compilation of sequential pattern matches such as lists and vectors saw a reduction in code size. By doing some simple manipulations of the pattern AST prior to handing it to the match compiler, eliminated extra runtime work. Some literal pattern matching has also been improved.</li>
<li>Improving documentation</li>
<li>With an eye towards the upcoming Strange Loop talk about Meander, numerous documentation changes were made. The previously large README has now been updated to be more of an attention getter, and the formal documentation has been moved to the projects doc folder with the content separated into different files. Virtually all of the core API was documented and formatted such that we could take advantage of the wonderful formatting capabilities of cljdoc.</li>
</ul>
<h3 id="september-16-30">September 16-30</h3>
<p>The weeks between the 16 and the 30th saw some pretty amazing improvements, particularly to the performance of the pattern matcher.</p>
<ul>
<li>Map and set patterns with variable keys/elements saw massive performance boosts by, once again, rewriting the pattern AST and the IR (intermediate representation). While specific details can be found in the commits 51f24ba0, f78296, and ee8845a, I think it is safe to say that map and set patterns containing variable keys should be compiled to code which runs as fast as most hand written code with the same semantics. Coupled with the improvements earlier in the month of September, matching against maps and set patterns are now very fast.</li>
<li>Several big improvements also came by various AST manipulations to with patterns. By inlining non or, acyclic pattern references, the compiler will only generate function code for pattern matches which need recursion or have several branches by way of or patterns. This results in both less code and better runtime performance.</li>
<li>Some minor improvements also include applying beta reduction when safe, leveraging type information when possible, and preventing reflection when using method calls.</li>
<li>A very exciting addition to pattern matcher was a new operator called &ldquo;cata&rdquo; which is short for catamorphism and should not be confused with the Category Theory concept by the same name. The cata operator was borrowed from the paper &ldquo;A Nanopass Framework for Commercial Compiler Development&rdquo; by Andrew Keep where it appears as the square braces. This operator allows for pattern matching to occur recursively over the entire set of match clauses and apply further pattern matching to the result. It is an incredibly powerful tool for performing nested transformations or recursive searches.</li>
</ul>
<h2 id="calva">Calva</h2>
<h3 id="september-1---15--theme-project-maintainability---through-quality">September 1 - 15  Theme: Project Maintainability - through quality</h3>
<p>Documentation</p>
<ul>
<li>Added instructions for how to <a href="https://calva.readthedocs.io/en/latest/workspace-layouts.html">setup your VS Code Workspace layouts to work with Calva</a>.</li>
<li>Updated documentation on how to <a href="https://calva.readthedocs.io/en/latest/connect.html">Connect Calva to the REPL</a>.</li>
<li>Including a page on the subject of <a href="https://calva.readthedocs.io/en/latest/connect-sequences.html#settings-for-adding-custom-sequences">Customizing the Connect Sequence</a>.</li>
<li>More information for <a href="https://calva.readthedocs.io/en/latest/vim.html">VIM Extension</a> users on what to (not) expect when using Calva.</li>
<li>There&rsquo;s a description of the process for integrating changes to Calva (This was the documentation first driver for the CI automation).</li>
<li>Updated documentation on <a href="https://github.com/BetterThanTomorrow/calva/wiki/How-to-Contribute">How to Contribute code to Calva</a>.</li>
</ul>
<p>Continuous Integration</p>
<ul>
<li>We have reworked our integration and release process a bit. Or, rather, just trying to get it less ad hoc. And we are now taking help from Circle CI to automate much of it. Circle CI now does the following:</li>
<li>Unit tests are run on all updates of the Calva repository.</li>
<li>PR&rsquo;s automatically renders a build of a Calva extension, and the VSIX package is made publicly available for contributors and maintainers to download and test.</li>
<li>Pre-release are built and pushed to GitHub Releases at will.</li>
<li>New Calva versions are built, pushed to GitHub Releases, and published to the VS Code Extension Marketplace.</li>
</ul>
<p>This is a total bliss, I tell ya.</p>
<p>Jack-in and Connect</p>
<ul>
<li>The Customizable Connect Sequences are released, including the No-prompting Jack-in mentioned in the last report. It has been iterated on and some bugs are also squashed.</li>
<li>Fix Figwheel Main deps added to non-cljs projects</li>
<li>Support connecting to Leiningen and CLI project using shadow-cljs watcher</li>
<li>Support for launching with user aliases/profiles</li>
</ul>
<p>Other</p>
<ul>
<li>More accurate code completion lookups (by giving the nREPL completion middleware more context for the lookup).</li>
<li>By PR: Keep focus in editor when evaluating to the REPL Window</li>
<li>By PR: Close java processes when closing or reloading VS Code. (On Windows, where VS Code fails to clean up Jack-in processes for us.)</li>
<li>Fix REPL Window namespace being reset to user.</li>
<li>Provide JavaScript completion in ClojureScript code. (by upgrading to <code>cider-nrepl 0.22.1</code> and thus gaining the power of suitable).</li>
<li>Fix Printing of preformatted results in REPL window (By a small change to the Calva Clojure lexer.)</li>
</ul>
<h3 id="september-16---30-theme-project-maintainability---through-reinforcements">September 16 - 30 Theme: Project Maintainability - through reinforcements</h3>
<p>A Growing Team</p>
<p>I have the pleasure to announce that Christian Fehse has accepted to join the Calva Team. Christian showed with his many PRs, that he understands the Calva project and that he cares about that it is a maintainable project.</p>
<p>More PRs</p>
<p>My work has shifted focus a bit the latest period. I have committed less code myself, as the PRs poured in and I instead try to help with getting that work integrated. It&rsquo;s pretty good, Calva improves much faster this way.</p>
<p>Things done From the CHANGELOG</p>
<p>New features in <strong>bold</strong>:</p>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/326">Revert disconnecting and jacking out on closing of REPL window</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/328">Add command for connecting to a non-project REPL</a></li>
<li><strong><a href="https://github.com/BetterThanTomorrow/calva/pull/336">Add hover to inline result display, containing the full results</a></strong></li>
<li><strong><a href="https://github.com/BetterThanTomorrow/calva/issues/329">Better inline evaluation error reports with file context</a></strong></li>
<li><strong><a href="https://github.com/BetterThanTomorrow/calva/issues/337">Enhancement REPL window handling / nREPL menu button</a></strong></li>
<li><strong><a href="https://github.com/BetterThanTomorrow/calva/issues/218">Print async output, and a setting for where it should go</a></strong></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/280">Fix REPL window prompt does not always reflect current ns</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/321">Escape HTML in stdout and stderr in REPL window</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/341">Add content security policy to webview and remove image load error</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/327">Add pretty print mode</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/349">Add command for evaluating top level form as comment</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/347">Stop writing results from <strong>Evaluate to Comment</strong> to output pane</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/33">Adding selected calva commands to the editors context menu</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/353">Fix bug with painting all existing result decoration with the same status</a></li>
<li><a href="https://github.com/BetterThanTomorrow/calva/issues/354">Fix bug with reporting errors using off-by-one line and column numbers</a></li>
</ul>
<p>Not showing in the CHANGELOG</p>
<ul>
<li>The development process has been vastly simplified. Showing here: <a href="https://github.com/BetterThanTomorrow/calva/wiki/How-to-Contribute">How to Contribute</a></li>
<li>We have added the tests for Calva&rsquo;s Clojure grammar to the CI pipeline</li>
</ul>
<h2 id="cider">CIDER</h2>
<h3 id="september-1-15-2">September 1-15</h3>
<ul>
<li>I&rsquo;ve started work on CIDER 0.23 which is going to be a relative small update. All details are in the changelog, there are just a couple of outstanding PRs that need to be wrapped before I can cut the release.</li>
<li>I&rsquo;ve added DocSearch integration to nrepl.org</li>
<li>I&rsquo;ve started work on the new documentation site for cider-nrepl ()</li>
<li>I&rsquo;ve been working with Shen Tian on a Clojure spec for nREPL (merged) and sideloading of missing classes/resources automatically (PR in progress)</li>
<li>On the piggieback front we&rsquo;ve got a PR that needs some cosmetic tweaks to handle gracefully the lack of ClojureScript</li>
<li>I&rsquo;ve been discussing with Thomas Heller how to improve the nREPL integration for shadow-cljs and the potential creation of a piggieback alternative. I&rsquo;m quite excited about the possible outcome here.</li>
<li>I&rsquo;ve started working a couple of blog posts for &ldquo;Hard CIDER&rdquo;, and I should start publishing something soon</li>
<li>I&rsquo;ve also started working on a &ldquo;State of CIDER&rdquo; survey, but it got blocked by the poor state of free survey tools (now I&rsquo;m torn between sending the survey in chunks or limiting the number of people who can respond). Or just going with Google Forms. :D</li>
</ul>
<h3 id="september-16-30-1">September 16-30</h3>
<ul>
<li>Shipped CIDER 0.23</li>
<li>Shipped cider-nrepl 0.22.4 (fixes several bugs)</li>
<li>Shipped orchard 0.5.3 (fixes a small bug with ClojureDocs)</li>
<li>Shipped piggieback 0.4.2 (it doesn&rsquo;t blow up in the absence of ClojureScript)</li>
<li>Shipped nREPL 0.7.0-alpha2 with support for <a href="https://nrepl.org/nrepl/design/middleware.html#_sideloading">sideloading</a></li>
<li>Participated in &ldquo;The REPL&rdquo; :-)</li>
<li>Published a couple of CIDER-related blog posts <a href="https://metaredux.com/posts/2019/10/05/hard-cider-project-specific-configuration.html">hard-cider-project-specific-configuration</a>
and <a href="https://metaredux.com/posts/2019/10/07/hard-cider-navigating-cider-buffers-ninja-style.html">hard-cider-navigating-cider-buffers-ninja-style</a>)</li>
<li><a href="https://metaredux.com/posts/2019/10/08/cider-0-23-lima.html">More details on CIDER 0.23</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q4 2019 Survey Results and Call for Proposals</title>
      <link>https://www.clojuriststogether.org/news/q4-2019-survey-results-and-call-for-proposals/</link>
      <pubDate>Tue, 22 Oct 2019 20:30:50 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q4-2019-survey-results-and-call-for-proposals/</guid>
      <description>We surveyed our members to see what they wanted us to focus on. Our next funding round for new projects will close on Saturday, July 26th, 2019 at 11:59pm PST. We&amp;rsquo;ll be funding four projects $9,000 each over three months ($3,000/mo).</description>
      <content:encoded><![CDATA[<p>Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter.</p>
<p>The <a href="/open-source/">call for proposals</a> for new projects will close on Saturday, October 26th, 2019 at 11:59pm PST.</p>
<p>We&rsquo;ll be funding four projects $9,000 each over three months ($3,000/mo).</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 61 respondents to the survey, down slightly from 65 in the last survey. The highlights are presented below.</p>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things people were interested in:</p>
<ul>
<li>developer experience tools</li>
<li>IDE support</li>
<li>build tooling</li>
<li>documentation</li>
<li>error messages</li>
<li>test tooling</li>
<li>linters</li>
</ul>
<p>Error messages stood out for our company members in particular with 75% of respondents across a broad range of companies highlighting improvements to error messages.</p>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>ClojureScript, Cloverage, Duct/Integrant, Neanderthal, Reagent, clj-kondo, cljsjs, expound, leiningen, orchestra, re-frame, shadow-cljs, spec, test.chuck/test.check.</p>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>A sampling of comments:</p>
<ul>
<li>&ldquo;I use Fireplace and Shadow CLJS every day, so having those funded was awesome.&rdquo;</li>
<li>&ldquo;CIDER is getting better and is more sustainable.&rdquo;</li>
<li>&ldquo;no, because i am mostly a back end dev&rdquo;</li>
<li>&ldquo;No, but that&rsquo;s all right&rdquo;</li>
<li>&ldquo;Yes, the new Figwheel and Shadow CLJS are much better&rdquo;</li>
</ul>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>3/4 of company members wanted us to fund a mix of established and speculative projects, with the remainder wanting to focus on established projects. 83% of developer members wanted us to fund a mix, with 15% wanting us to fund established projects and one person wanting us to only fund speculative projects.</p>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Very good communication</li>
<li>Transparency</li>
<li>Providing significant funding to important or young high potential projects</li>
<li>Asking for feedback. Making choices transparent</li>
<li>Being so transparent on how you are selecting the projects and allocating the funds, and the whole transparent operation of Clojurists Together.</li>
<li>It exists and is being worked on!</li>
<li>Surveys about more than who to fund</li>
<li>Funding great projects, keeping the donors informed, fostering a community.</li>
</ul>
<p>Could do better:</p>
<ul>
<li>communicate the importance of the work, doubling down on some important projects</li>
<li>Recurring, monthly sponsorship of certain &ldquo;essential&rdquo; projects (e.g. leiningen and cider come to mind)</li>
<li>The developments on Fireplace and CIDER were of no use for us, because we use Cursive. I hope the next projects won&rsquo;t only benefit VIM/Emacs users.</li>
<li>Larger support for Clojure/Script open source: collect &ldquo;help wanted&rdquo; issues, put one money bin as bounties for anyone to fix those. There are tens/hundreds of repos &amp; maintainers that need some help, but don&rsquo;t apply as the needs are small.</li>
<li>Highlight community contributions outside the funded projects, potentially reward with a one-time &ldquo;gift&rdquo;. Potentially do this monthly.</li>
<li>Keep a shortlist of &ldquo;maybe one day&rdquo; projects. Others can suggest things from there or add to it.</li>
<li>Make it easier to modify pledges, provide a way to pay once a year with a services invoice (EU), so that we can deduct the expense.</li>
<li>Work with larger Patreon, GitHub donations community</li>
</ul>
<p>We are currently working on a number of changes to how Clojurists Together runs. Once these are complete, this will open up a bunch of new possibilities for us which we haven&rsquo;t been able to do yet. We don&rsquo;t have an exact date for when this is going to be ready, but it is coming soon. For members interested in learning more, please reach out and we&rsquo;re happy to give you a preview.</p>
<p>Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>August 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/august-2019-monthly-update/</link>
      <pubDate>Tue, 10 Sep 2019 00:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/august-2019-monthly-update/</guid>
      <description>August was our first month with this new round of projects, check out their monthly update!</description>
      <content:encoded><![CDATA[<p>August was our first month with this new round of projects, check out their monthly update!</p>
<ul>
<li><a href="http://shadow-cljs.org">Shadow CLJS</a> with Thomas Heller</li>
<li><a href="https://github.com/noprompt/meander">Meander</a> with Joel Holdbrooks</li>
<li><a href="https://github.com/BetterThanTomorrow/calva">Calva</a> with Peter Strömberg</li>
<li><a href="https://cider.mx">CIDER</a> with Bozhidar Batsov</li>
</ul>
<h2 id="shadow-cljs">Shadow CLJS</h2>
<p>Released shadow-cljs versions 2.8.42 up to 2.8.51.
Released shadow-cljs versions 2.8.52</p>
<h3 id="upgraded-target-react-native-support">Upgraded <code>:target :react-native</code> support</h3>
<p>Changed the way the <code>:react-native</code> build target emits code so that during development source maps work in some limited fashion (ie. only when using Debug JS remotely in Chrome). This is meant to work around the <a href="https://github.com/facebook/metro/issues/104">limitation</a> that metro itself currently has regarding source maps directly.</p>
<p>Enhanced the code processing so that <code>js/require</code> calls are automatically detected and don&rsquo;t require any additional configuration. More info in the <a href="https://clojureverse.org/t/upgrading-the-react-native-support/4669">related discussion</a> on Clojureverse.</p>
<p>Added the groundwork to allow code-splitting to work with <code>react-native</code> builds so that parts of the code can be loaded lazily when needed (to boost initial startup speed). The JS side of things is done but it also requires work on the <code>react-native</code> side as described <a href="https://facebook.github.io/react-native/docs/performance#ram-bundles-inline-requires">here</a>. Hope to create an actual working example of this in the future. <strong>I am looking for beta testers willing to dive into this.</strong></p>
<h3 id="bugfixesfeatures">Bugfixes/Features</h3>
<ul>
<li>Smoothed out some rough edges in the nREPL code which would not display compiler warnings when loading files via <code>load-file</code> or <code>require</code> properly</li>
<li>Simplified the nREPL middleware setup, mostly for internal purposes. Will only require updating the middleware config when using <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#_embedded_nrepl_server">embedded mode</a></li>
<li>Enhanced the macro reload logic: previously macro dependencies would not be watched and therefore would only trigger rebuilds when macros themselves were changed. This should now be more reliable since more namespaces are tracked</li>
<li>Introduced <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#alt-node-modules">:js-package-dirs</a></li>
<li>Optimized the CLI parsing so everything coming after run|clj-run was passed to that directly instead of being interpreted as arguments for shadow-cljs itself (eg. <code>shadow-cljs run your.helper/fn --foo</code> would error out). Previously this required adding an additional <code>--</code> separator after <code>run</code></li>
<li>removed log spam if CLJ macro namespaces were renamed or deleted</li>
<li>[ongoing] cleaning up the internal REPL implementation</li>
</ul>
<h3 id="documentation">Documentation</h3>
<ul>
<li>Started a section about <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#publish">Publishing Libraries</a> using Leiningen</li>
<li>Started a section about <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#repl-troubleshooting">REPL troubleshooting</a></li>
<li>Added a brief section about <a href="https://shadow-cljs.github.io/docs/UsersGuide.html#jvm-opts">:jvm-opts</a></li>
<li>Blogged about <a href="https://code.thheller.com/blog/shadow-cljs/2019/08/25/hot-reload-in-clojurescript.html">Hot Reload in ClojureScript</a></li>
</ul>
<h2 id="meander">Meander</h2>
<p>Much of the work I&rsquo;ve been doing is getting the new version of Meander, epsilon, ready for release. This has involved numerous internal architectural changes, bug fixes, and documentation additions.</p>
<p>One of the most important changes to the library was to qualify (namespace) the core pattern matching and pattern substitution operators such as <code>and</code>, <code>or</code>, <code>scan</code>, etc. Prior to epsilon these operators were available via their unqualified symbols. This led to some friction for folks. From now forward, beginning with epsilon, these operators will be fully qualified and available from the namespace <code>meander.epsilon</code>.</p>
<p>With qualified operators I also further developed a syntax extension mechanism which allows for controlled extension of the pattern matching and/or substitution syntax. This will also be available from the <code>meander.epsilon</code> namespace as <code>defsyntax</code>. This macro allows new symbolic, syntax to be defined.</p>
<p>With the syntax extension and definition mechanism in place, I was able to begin working on real documentation. Because the <code>defsyntax</code> macro compiles to code which emits a <code>defn</code>, which in turn compiles to code which emits a <code>def</code>, we can attach real meta data such as <code>:doc</code> and <code>:arglists</code> to the vars. So now, not only can we define operators via the provided extension mechanism, we can also document them. And that&rsquo;s exactly what I spent a good deal of time doing. To date, I&rsquo;ve fully documented all but two operators and I expect those will be documented during the week.</p>
<p>Apart from the operator qualification and documentation efforts, Meanders epsilon branch also received several bug fixes to the improvement of the pattern matching compiler. Meanders Clojure spec definitions have also been given attention and mistakes preventing the use of instrumentation have now been corrected.</p>
<p>Another small but (hopefully) useful addition is the allowance of the search operator to return results in breadth first order. Prior to this option, results were always returned in depth first order. I anticipate the further allowance of configuration to search in the future.</p>
<p>Within the week I plan to release Meander epsilon. During the weeks ahead I intended to aggressively enhance the pattern matching and substitution compilers, put in place infrastructure for guides and tutorials, and begin putting together a rewrite specific compiler if time permits.</p>
<p>Since the last update the epsilon branch of the project has seen a few important improvements and fixes. The two primary improvements have been to pattern matching and to substitution.</p>
<p>For map pattern matching, keys can be logic variables if Meander can determine that the pattern could not have more than one solution. For example, if we know that we have an already solved for a logic variable earlier on in a pattern match, it may be used as a key in the map. This improvement also had transitive effects to our code generation for searching as well. Previously, if a map had logic variables keys we emitted search code regardless. This meant that in some cases we were producing code that was doing more work than necessary.</p>
<p>For substitution, code generation has also been improved as Meander is employing a different approach. We&rsquo;re now emitting much smarter, faster, and in some cases (dramatically) shorter code. To do this, the substitution compiler collects and returns data as it compiles so that at each point in the compilation there is an accumulation of knowledge which can be used to make better decisions. The generated code is also subsequently optimized by rewriting it to eliminate redundant code by applying functional identities.</p>
<h2 id="calva">Calva</h2>
<h3 id="august-1---15">August 1 - 15</h3>
<p>Theme: <em>Project Maintainability</em></p>
<p>This has many aspects, including: <em>Cooperation with other tool smiths, Code factoring, User documentation, and Ease of use.</em></p>
<h4 id="orchard-task-force">Orchard task force</h4>
<p>Since CIDER and Calva are sharing a lot of the tooling, we have been trying to figure out how to pool our efforts into <a href="https://metaredux.com/posts/2018/11/09/ciders-orchard-the-heart.html">The Orchard</a>. Bozhidar Batsov has formed a task force with people building libraries and tools for, and/or using, Orchard related things. Kevin and I have joined from the Calva team and we now try to apply an <strong>Orchard first</strong> mindset when designing how to add certain features.</p>
<ul>
<li>So far, a concrete improvement to Calva out of this is that when helping to test a new version of <code>cider-nrepl</code>, which adds code completion of JavaScript interop powered by <a href="https://github.com/rksm/clj-suitable">suitable</a>, we realized that Calva isn&rsquo;t taking full advantage of the completion features provided. Next release of Calva will:
<ul>
<li><strong>NEXT RELEASE</strong> Use top level form context when collecting code completion candidates_.</li>
</ul>
</li>
</ul>
<h4 id="documentation-1">Documentation</h4>
<ul>
<li>The <a href="https://github.com/BetterThanTomorrow/calva/wiki">Calva wiki</a> has gotten some needed attention. (All too little still, but anyway.)</li>
<li>A <a href="https://www.youtube.com/watch?v=a2vRDYXDAug">video showing how to Jack in using a Custom CLJS REPL</a>. This was mainly an experiment to try to learn some about how to produce tutorial videos.</li>
<li>Some features are being added <strong>documentation first</strong>, meaning we write the user documentation for the feature first and use that to know what needs to be done. See below for an example. We intend to continue with this habit.</li>
</ul>
<h4 id="refactoring-calva">Refactoring Calva</h4>
<p>We&rsquo;re preparing for making some major cleanings up of the Calva code base. And even while we have yet to start any of those efforts we are already cleaning up while we are working with updating Calva. This means the project is more maintainable now than it was two weeks ago, and we intend to continue in this spirit of Kaizen. A more drastic change is that we:</p>
<ul>
<li><strong>DONE</strong>: Moved all REPL Window code into the Calva repository and archived the <code>repl-interactor</code> repository for now.</li>
</ul>
<h4 id="jack-inconnect">Jack in/Connect</h4>
<p>We&rsquo;ve continued with the strong focus on making it easy to connect Calva to your Clojure project.</p>
<ul>
<li><strong>RELEASED</strong>: <a href="https://github.com/BetterThanTomorrow/calva/blob/master/CHANGELOG.md#2028---01082019">https://github.com/BetterThanTomorrow/calva/blob/master/CHANGELOG.md#2028---01082019</a> Operating system peculiarities. Especially Windows, with its cmd.exe and Powershell and Git Bash and MINGW and WSL and… You get the picture. Jack-in has been really hard to get working reliably, but I think we got it nailed down now. (There is still some bugs on Linux, that we have yet to figure out.)</li>
<li><strong>RELEASED</strong>: <a href="https://github.com/BetterThanTomorrow/calva/pull/275">Reworked how Calva deals with figuring out the current project root</a>. This used to be a setting in the workspace, but now it is determined based on the file in the active editor. This change also made it easier to use multi-project workspaces (Mainly because of supporting custom settings per project in the workspace).</li>
<li><strong>RELEASED</strong>: <a href="https://github.com/BetterThanTomorrow/calva/pull/279">Support launching with Leiningen aliases</a>, while also improving how we deal with <code>main</code> arguments when launching with <code>deps.edn</code> aliases.</li>
<li><strong>IN PROGRESS</strong>: <a href="https://github.com/BetterThanTomorrow/calva/pull/289">Support for launching with user aliases/profiles</a>. A test build with this feature is out and it is probably going to be release within a few days.</li>
<li><strong>IN PROGRESS</strong>: Support of custom Jack-in and connect sequences. This is taking the recently added <em>Custom CLJS REPL</em> feature several steps further. It is done in a <a href="https://github.com/BetterThanTomorrow/calva/issues/282">documentation first</a> manner. This also cleans up a lot of all too complicated code as we are redefining the built-in connect sequences using the same configuration mechanism as the custom ones.</li>
<li><strong>IN PROGRESS</strong>: <a href="https://github.com/BetterThanTomorrow/calva/issues/281">Custom workflow Clojure commands</a>. This is a feature inspired from Cursive that has been worked with on and off for quite a while. Right now it is more <em>on</em> and it might be released before August ends.</li>
</ul>
<h4 id="refactoring-tooling">Refactoring tooling</h4>
<p>We&rsquo;ve investigated our options for adding refactoring tools.</p>
<ul>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/269">Using <code>nrepl-refactor</code></a> to add a <em>Clean namespace form</em> feature is going to get included in Calva soon. But <em>Find symbol references</em>, seems a bit farther away yet. It is being discussed within that Orchard task force.</li>
<li><a href="https://github.com/kstehn/clojure-lsp-client">Experiment with `clojure-lsp</a>. Which reveals that a lot of functionality is ready to be tapped by Calva from <a href="https://github.com/snoe/clojure-lsp">clojure-lsp</a></li>
</ul>
<h4 id="various">Various</h4>
<ul>
<li><strong>DONE</strong>: Calva Legacy was removed from the VS Code Extension Marketplace, along with Calva Paredit and Calva Formatter. Maintainability bliss.</li>
<li><strong>RELEASED</strong>: Quite a few bug fixes.</li>
</ul>
<h2 id="august-15---31">August 15 - 31</h2>
<p>Theme: <em>Project Maintainability - through ease of use</em></p>
<h4 id="jack-in-and-connect-sequences">Jack-in and Connect Sequences</h4>
<p>We want to try help contribute to the community such that fewer Clojure and ClojureScript projects out there need to specify their editor tooling dependencies and setup. To this end Calva has a Jack-in feature that supports the most common project types and cljs repl types. It also supports customizing the cljs repl configuration so that projects with special cljs types can use Jack in as well. But there are still too many projects out there not supported by Calva Jack in, and this is what we have been working on almost solely.</p>
<p>We are adding something we call Connect Sequences, more on that below. When this is released we will be able to say we enabled the following:</p>
<ul>
<li>Support for configuring custom connect sequences. These can be:
<ul>
<li>Clojure only, supporting <a href="https://leiningen.org/">Leiningen</a>, <a href="https://clojure.org/reference/deps_and_cli">Clojure CLI</a>, and <a href="http://shadow-cljs.org">shadow-cljs</a>.</li>
<li>Clojure + ClojureScript, supporting <a href="https://figwheel.org/">Figwheel Main</a>, shadow-cljs, Nashorn, <a href="https://github.com/bhauman/lein-figwheel">lein-figwheel</a>, and fully customized cljs repl types.</li>
</ul>
</li>
<li>Much improved custom cljs repl configuration.</li>
<li>Improved help for the user to get the cljs repl connected.</li>
<li>Improved ClojureScript <em>Build switching</em>. (Since Calva only allows for two REPL connections (yet), one for Clojure and one for ClojureScript. It instead makes it easy to attach the ClojureScript repl connection to different ClojureScript builds in your project.)</li>
<li>A feature to add custom Clojure code to be evaluated when the Clojure repl has been attached. Maybe your project needs to start a web server before attempting to start a web client and connect a ClojureScript repl?</li>
<li>All built in ClojureScript repls are written using the custom repl type configuration. (This is a huge win when it comes to maintainability.)</li>
<li>Nashorn added as a built in ClojureScript repl type.</li>
<li><a href="https://github.com/BetterThanTomorrow/calva/pull/289">Support for launching with user aliases/profiles</a></li>
</ul>
<p>Except for the last one, this all works in development, and we are cleaning up the code and considering to add this additional feature, before release:</p>
<ul>
<li><strong>No-prompting Jack-in</strong>. A way to ”answer” all Jack-in prompts as part of the custom Connect Sequence configuration.</li>
</ul>
<p>The custom Connect Sequence feature is developed <a href="https://github.com/BetterThanTomorrow/calva/issues/282">documentation first</a>. And you can follow the commits in <a href="https://github.com/BetterThanTomorrow/calva/pull/285">this PR</a>. (The reason there is awfully little feedback there, is because that happens offline).</p>
<h4 id="other">Other</h4>
<p>Other than jack-in, time has been spent mostly in support and general talking to users. Plus:</p>
<ul>
<li><strong>RELEASED</strong> Use top level form context when collecting code completion candidates_.</li>
<li><strong>DONE</strong> Insourced the REPL Window (npm) repository into the Calva code base. Since Calva is the only project using it. This might be extracted again if someone turns up willing to maintain it as a project of its own.</li>
<li><strong>DONE</strong> Refactored the updated completion context some, to make the code easier to understand.</li>
<li><strong>IN PROGRESS</strong>: <a href="https://github.com/BetterThanTomorrow/calva/pull/289">Support for launching with user aliases/profiles</a>. Test results in and it seems to be a useful implementation. However, we are now moving this configuration into the new Jack-in and connect sequences feature. (See above.)</li>
</ul>
<h2 id="cider">CIDER</h2>
<ul>
<li>CIDER now provides improved code completion for ClojureScript (powered by the suitable library)</li>
<li>Orchard now provides access to data from ClojureDocs</li>
<li>I&rsquo;ve started replacing the Grimoire integration with ClojureDocs integration</li>
<li>I&rsquo;ve cut a new release of Drawbridge that adds support for custom http headers</li>
<li>I&rsquo;ve removed the hard Clojure dep from sayid and refactor-nrepl</li>
<li>I&rsquo;ve reorganized a bit some namespaces in the most recent beta of Orchard, so it&rsquo;s easier to understand their purpose</li>
<li>sayid&rsquo;s legacy landing page was converted to a README and the content was improved</li>
<li>I&rsquo;ve investigated a thread leak issue in nREPL and some Java 9+ compatibility issues in CIDER</li>
<li>We&rsquo;ve kicked off a Dev Tooling for Clojure task force with some other tool writers with the goal to collaborate better with each other.</li>
</ul>
<ul>
<li>released cider-nrepl 0.22</li>
<li>released CIDER 0.22</li>
<li>released Orchard 0.5</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>July 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/july-2019-monthly-update/</link>
      <pubDate>Tue, 06 Aug 2019 00:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-2019-monthly-update/</guid>
      <description>Daniel has just come back from Belgium to speak at Heart of Clojure about building stable foundations. The talk was recorded and will be coming out sometime in the future. We met lots of Clojurists Together supporters at the conference and had a stand there to talk about the work we are able to fund thanks to our members.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together">Clojurists Together</h2>
<p>Hi CT Community -</p>
<p>Daniel has just come back from Belgium to speak at Heart of Clojure about building stable foundations. The talk was recorded and will be coming out sometime in the future. We met lots of Clojurists Together supporters at the conference and had a stand there to talk about the work we are able to fund thanks to our members.</p>
<p><img src="/images/july-2019/hoc-projects.jpg" alt="Heart of Clojure talk"></p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Daniel&#39;s favourite slide :) Developer members of Clojurists Together <a href="https://twitter.com/hashtag/heartofclojure?src=hash&amp;ref_src=twsrc%5Etfw">#heartofclojure</a> <a href="https://t.co/6qNgPtwivT">pic.twitter.com/6qNgPtwivT</a></p>&mdash; Kimmo Koskinen (@KimmoKoskinen) <a href="https://twitter.com/KimmoKoskinen/status/1157577433790451712?ref_src=twsrc%5Etfw">August 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>(Daniel also had slides thanking our company members but we didn&rsquo;t get any photos of them. If you have any, let us know!)</p>
<p>You&rsquo;ll notice that the Clojurists Together has started to get a fresher look. We&rsquo;ve been very fortunate to receive some design assistance from <a href="https://github.com/paintparty">@paintparty</a> to improve the visual design and information architecture of the site. Thanks!</p>
<p>Fireplace has completed a wonderful quarter with Clojurists Together culminating in a release of <a href="https://github.com/tpope/vim-fireplace/releases/tag/v2.0">version 2.0</a>. Tim has done a ton of great work and we are grateful for the opportunity to support him.</p>
<p>Just a reminder that Daniel is speaking about Clojurists Together again soon. Catch him at <a href="https://thestrangeloop.com">Strange Loop</a> talking about <a href="https://thestrangeloop.com/2019/a-stitch-in-time---the-future-of-oss-sustainability.html">A Stitch in Time - The future of OSS Sustainability</a>
<br /> September 12-14 in St. Louis, Missouri, USA</p>
<p>Thanks for your continued support of Clojurists Together.</p>
<h3 id="boot-update">Boot update</h3>
<p>Keen observers of Clojurists Together may remember that we funded Matthew Ratzke this quarter to work on version 3 and 4 of Boot. However, other things came up and it turned out Matthew wasn&rsquo;t able to work on Boot during this time period. We cancelled this grant with no money paid out, but would love to support Boot sometime again in the future.</p>
<h3 id="fireplace-update">Fireplace update</h3>
<h4 id="july-1-15">July 1-15</h4>
<p>This update is mostly responding to user feedback and bug reports from
the async overhaul.</p>
<p>Commits:</p>
<ul>
<li>Fix :Connect nrepl://</li>
<li>Set title on stacktrace location list</li>
<li>Provide :Stacktrace stub to open location list</li>
<li>Enable :RunTests! to skip opening quickfix window</li>
<li>Tweak stdout/stderr display in :Last</li>
<li>Show message id in :Last location list</li>
<li>Tighten up trailing newline display after eval</li>
<li>Fix potential display issue with :RunTests status message</li>
<li>Add url attribute to session object</li>
<li>Close quickfix window on :RunTests success</li>
<li>Handle early transport exit</li>
<li>Reduce quickfix window agitation on :RunTests</li>
<li>Avoid &ldquo;no matching autocommands&rdquo; warning</li>
<li>Show success/failure message after :RunTests completion</li>
<li>Only open :RunTests quickfix window if still active list</li>
<li>Restore version 8 check due to additional requirements</li>
<li>Allow Vim versions lower than 8.0 with job support</li>
<li>Restore plugin file name</li>
<li>Extract autoload file</li>
<li>Centralize activation</li>
<li>Support massaging location list</li>
<li>Eliminate inadvertent public functions</li>
<li>Allow namespace aliases to contain a dot</li>
<li>Support keywords ending in apostrophe</li>
<li>Use UUID for message id</li>
<li>Fix session creation</li>
<li>Fix precedence of overridden session id</li>
<li>Tighten handling of session id</li>
</ul>
<h4 id="july-16-31">July 16-31</h4>
<p>Did a second pass through the issue tracker, all that&rsquo;s left is a
handful of feature requests. Did some polishing and released 2.0.</p>
<p>Commits:</p>
<ul>
<li>fireplace.vim 2.0</li>
<li>README updates</li>
<li>Document API</li>
<li>Return empty string not user ns for .BufferNs() default</li>
<li>Always use user namespace for :CljEval and :CljsEval</li>
<li>Document :CljEval as a replacement for :Piggieback</li>
<li>Provide .Query()</li>
<li>Support message({&hellip;}, v:t_list, callback)</li>
<li>Tweak :CljEval (&hellip;/cljs-repl &hellip;) workflow</li>
<li>Fix doc typo</li>
<li>Add camel case instance method API</li>
<li>Add interrupt handling to #wait()</li>
<li>Enable multiple message callbacks</li>
<li>Provide fireplace#wait()</li>
<li>Lazily connect in #platform(), #clj(), and #cljs()</li>
<li>Fix broken eval API</li>
<li>Provide asynchronous #query()</li>
<li>Support true, false, and null in #query()</li>
<li>Provide asynchronous .Eval()</li>
<li>Restore info op backed :Doc for cljs only</li>
<li>Qualify clojure.core symbols in implicit require</li>
<li>Restore automatic detection of user invoked piggieback</li>
<li>Centralize resolution of buffer namespace</li>
<li>Use jobs for Java spawning eval</li>
<li>Purge disconnected channels</li>
<li>Fix potential collision with global function names</li>
<li>Provide completion for :CljEval and :CljsEval</li>
<li>Provide global :CljEval and :CljsEval commands</li>
<li>Introduce #native() as a #platform() replacement</li>
<li>Make #cljs() automatic piggieback lazy</li>
<li>Add #clj and #cljs() accessors</li>
<li>Hard code clojure.core in eval for #info()</li>
<li>Remove last vestiges of &ldquo;connection&rdquo; attribute</li>
<li>Restore simplified interactive :Connect</li>
<li>Default nrepl://host to port 7888</li>
<li>Retrieve Projectionist config at activation time</li>
<li>Fix omnicomplete on Neovim</li>
<li>Revert &ldquo;Automatically require piggieback&rdquo;</li>
<li>Automatically require piggieback</li>
<li>Add interface for supporting other protocols</li>
<li>Rename Python script</li>
<li>Use clojure.repl/doc rather than custom doc output</li>
<li>Replace host/port arguments with URL</li>
<li>Remove keepalive file</li>
<li>Remove obsolete Python code</li>
<li>Provide fireplace#omnicomplete(callback, symbol)</li>
<li>Remove eval fallback for completion</li>
<li>Add abstraction for requiring nREPL op</li>
<li>Make stacktrace retrieval an on demand operation</li>
<li>Emphasize cider-nrepl in documentation</li>
<li>Don&rsquo;t fire FireplacePreConnect when acting on explicit buffer</li>
<li>Use cljc preference for all files except .clj/.cljs</li>
<li>Provide option configure default cljc platform</li>
<li>Use ClojureScript for cljc files if already initialized</li>
<li>Try to be smart about user evaling cljs-repl function</li>
<li>Encapsulate check for ClojureScript filename</li>
<li>Use pretty print for :Eval!</li>
<li>Query projectionist for default ClojureScript REPL</li>
<li>Remove Nashorn :Piggieback default</li>
<li>Discard ClojureScript session if user evals :cljs/quit</li>
<li>Fix return value of #register_port_file()</li>
<li>Output mutiple eval values</li>
<li>Remove eval() from session layer</li>
<li>Show both stdout and stderr in :Last</li>
<li>Close Piggieback nREPL session when removing it</li>
<li>Remove stacktrace handling from session layer eval</li>
<li>Remove dead stacktrace retrieval code from spawning eval</li>
<li>Remove v:none for nvim compatibility (for real)</li>
<li>Remove v:none for nvim compatibility</li>
<li>Provide single message temporary session interface</li>
<li>Guard against Vim with broken if_pyth</li>
<li>Test waters removing old fireplace#message() interface</li>
<li>Return dict not bare id from message creation</li>
<li>Standardize error handling for no REPL connection</li>
<li>Include message in ClojureScript stacktrace for symmetry</li>
<li>Eliminate calls to old single arity variant of message()</li>
<li>Return session not transport from #register_port_file()</li>
<li>Make jar contents retrieval more robust</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2019 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2019-funding-announcement/</link>
      <pubDate>Tue, 06 Aug 2019 00:00:00 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2019-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q3 of 2019 (August-October) we are funding four projects: Shadow CLJS with Thomas Heller, Meander with Joel Holdbrooks, Calva with Peter Strömberg, and CIDER with Bozhidar Batsov.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q3 of 2019 (August-November) we are funding four projects:</p>
<ul>
<li><a href="http://shadow-cljs.org">Shadow CLJS</a> with Thomas Heller</li>
<li><a href="https://github.com/noprompt/meander">Meander</a> with Joel Holdbrooks</li>
<li><a href="https://github.com/BetterThanTomorrow/calva">Calva</a> with Peter Strömberg</li>
<li><a href="https://cider.mx">CIDER</a> with Bozhidar Batsov</li>
</ul>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. Previously we have supported <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, <a href="http://www.cider.mx/en/latest/">CIDER</a>, <a href="https://aleph.io">Aleph</a>, <a href="https://neanderthal.uncomplicate.org">Neanderthal</a>, and <a href="https://github.com/tpope/vim-fireplace">Fireplace</a>.</p>
<h2 id="funding-details">Funding details</h2>
<p>We support our grantees by paying them a total of $9,000 over three months ($3,000/mo).</p>
<h2 id="shadow-cljs">Shadow CLJS</h2>
<h3 id="why-is-shadow-cljs-important">Why is Shadow CLJS important?</h3>
<blockquote>
<p>Shadow-cljs is a fully featured CLJS build tool with seamless integration into the npm ecosystem.</p>
</blockquote>
<h3 id="thomas-plans-for-the-next-three-months-are">Thomas' plans for the next three months are:</h3>
<blockquote>
<p>Finalize and properly document react-native/expo support. More detailed documentation for all build targets with proper up-to-date examples, including proper deployment examples using common platforms.</p>
</blockquote>
<h2 id="meander">Meander</h2>
<h3 id="why-is-meander-important">Why is Meander important?</h3>
<blockquote>
<p>Meander provides a uniquely transparent way of performing data manipulation that aims to be declarative, performant, and safe. These properties are important because they enable Clojure developers to write correct data manipulation code using a common language which encourages collaboration and thoughtful design without sacrificing dynamism. And because Meander has been designed with both transparency and accuracy in mind, Clojure code written with it can be an asset to a development team and, thus, a business.</p>
</blockquote>
<h3 id="joels-plans-for-the-next-three-months-are">Joel&rsquo;s plans for the next three months are:</h3>
<blockquote>
<p>I plan to invest heavily in my next version of the library: epsilon. My primary goals for this funding would be to improve the performance of the code emitted by the pattern matching and substitution compilers, begin working on a compiler specifically for rewriting (matching + substitution), and greatly improving the documentation.</p>
</blockquote>
<h2 id="calva">Calva</h2>
<h3 id="why-is-calva-important">Why is Calva important?</h3>
<blockquote>
<p>VS Code is the editor of choice for many developers and having good Clojure and ClojureScript support on the platform helps newcomers find the joy of Clojure faster. VS Code also is easier to use than many other development environments, and by leveraging this, Calva can make Clojure more accessible generally.</p>
</blockquote>
<h3 id="peters-plans-for-the-next-three-months-are">Peter&rsquo;s plans for the next three months are:</h3>
<p>With the latest major release of Calva it was made easier to use and also much easier to start with, for people not familiar with the tooling dependencies in Clojure and ClojureScript development.</p>
<p>But it is clear from the questions people pose and the help they require that there is still work to do to make it easier and less confusing to start with Clojure using Calva.</p>
<p>My time with Calva during funding will be spent on the following tasks:</p>
<ul>
<li>Easier Clojure and ClojureScript on-boarding, mainly through documentation and video material, but also by ironing out some rough edges in Calva.</li>
<li>Support for inspecting and using local variables during interactive development.</li>
<li>Basic refactoring support.</li>
<li>Scratching some of the pet itches users experience, like: interrupting long running processes, displaying function argument lists during typing code, repl prompt improvements.</li>
</ul>
<p>I&rsquo;d also like to find some time to:</p>
<ul>
<li>Improve the shadow-cljs support, which needs some special attention.</li>
<li>Improve the help with examining large result data structures.</li>
</ul>
<h2 id="cider">CIDER</h2>
<h3 id="why-is-cider-important">Why is CIDER important?</h3>
<blockquote>
<p>CIDER is a very popular programming environment and its infrastructure (nREPL, cider-nrepl, piggieback and orchard) powers many of the other tools out there (e.g. vim-fireplace, vim-iced, calva, etc). Improvements to CIDER and its foundational pieces generally benefits most of the Clojure community.</p>
</blockquote>
<h3 id="bozhidars-plans-for-the-next-three-months-are">Bozhidar&rsquo;s plans for the next three months are:</h3>
<ul>
<li>Improve the projects home page and documentation portal with a focus on improved onboarding for newcomers</li>
<li>Add cider-nrepl documentation to the documentation portal</li>
<li>Improve the nREPL docs portal (e.g. add search, more info or writing extensions, etc)</li>
<li>Add support for client-side dep injection to nREPL</li>
<li>Clean up the APIs of orchard and cider-nrepl and make them more uniform</li>
<li>Improve the api docs for orchard and cider-nrepl</li>
<li>Make the indentation in clojure-mode a bit more flexible (e.g. support using <code>;</code>)</li>
<li>Various small cleanups and improvements to CIDER in preparation for a 1.0 release (e.g. making it easier to specify a custom form to start a ClojureScript REPL, make the shortcuts in the debugger customizable, inject ClojureScript deps in jack-in, etc)</li>
<li>Learn more about ClojureScript, so I can improve the support for it :-)</li>
<li>2-3 monthly instalments in the &ldquo;Hard CIDER&rdquo; blog series</li>
<li>An &ldquo;Intro to CIDER&rdquo; screencast</li>
</ul>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied this quarter were:</p>
<ul>
<li>Clojure&rsquo;s Boring Web Framework</li>
<li>Practicalli Spacemacs</li>
<li>vim-iced</li>
<li>CIDER</li>
<li>Chlorine</li>
<li>Meander</li>
<li>Typed Clojure</li>
<li>Calva</li>
<li>datahike</li>
<li>cloxp 2.0</li>
<li>perun</li>
<li>Fulcro</li>
<li>Formic</li>
<li>Intro to Programming w/Clojure in Georgian Language</li>
<li>Pathom</li>
<li>Origami</li>
<li>Klipse</li>
<li>Fireplace</li>
<li>LightTable</li>
<li>Shadow CLJS</li>
<li>ohmyclj</li>
</ul>
<h2 id="q3-2019-funding">Q3 2019 Funding</h2>
<p>We had a bunch of great applications from great projects. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, we will re-use that application for future funding cycles. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2019 Survey Results and Call for Proposals</title>
      <link>https://www.clojuriststogether.org/news/q3-2019-survey-results-and-call-for-proposals/</link>
      <pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2019-survey-results-and-call-for-proposals/</guid>
      <description>We surveyed our members again and asked them what they wanted us to focus on. Our next funding round closes on Wednesday, July 17th, 2019 at 11:59pm PST.</description>
      <content:encoded><![CDATA[<p>Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter.</p>
<p>The <a href="/open-source/">call for proposals</a> for new projects will close on Wednesday, July 17th, 2019 at 11:59pm PST.</p>
<p>We are checking our funding levels to work out how many projects we will be able to fund this quarter. We plan to fund each project at $3,000 USD/month for 3 months ($9,000 USD total). ~We&rsquo;ll update this post when we have final figures on how many projects we can fund before we select the projects.~</p>
<p>We&rsquo;ll be funding four projects this quarter due to having extra cash built up that we hadn&rsquo;t previously spent. We will be funding each project for $9,000 over three months.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 64 respondents to the survey, up from 57 in the last survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 62 (93%)</li>
<li>ClojureScript - 45 (67%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (93%)</li>
<li>ClojureScript Browser (67%)</li>
<li>ClojureScript Node Server (13%)</li>
<li>Clojure JVM Client (7%)</li>
<li>ClojureScript Desktop Application (8%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things people were interested in:</p>
<ul>
<li>developer experience tools (49%)</li>
<li>build tooling (37%)</li>
<li>documentation (19%)</li>
<li>error messages (33%)</li>
<li>IDE support (30%)</li>
<li>test tooling (24%)</li>
<li>linters (34%)</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>shadow-cljs, Duct Framework, Core.typed, CIDER, Clojuredocs, clj-doc, Eastwood, Cloverage, buddy, clj-kondo, Reagent, re-frame, FIgwheel Main, Cursive, Leiningen, Calva, Chlorine, Sente, Nippy, Rum, core.async, incanter, clj-pdf</p>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>A sampling of comments:</p>
<ul>
<li>&ldquo;Not yet, but I&rsquo;ve used both Aleph and Fireplace in the past, and I appreciate work going into them!&rdquo;</li>
<li>&ldquo;Yes I use Neanderthal and it is improving.&rdquo;</li>
<li>&ldquo;No, because I don&rsquo;t use many of the funded projects, and those I do use (CIDER and clj-http) I was already pretty happy with. But, I give because if more people do that, the ecosystem can be a better place for everybody.&rdquo;</li>
<li>&ldquo;Fireplace in particular is a core tool as a Vim clojurian, so 👍&rdquo;</li>
<li>&ldquo;Yes: we very recently adopted Kaocha at work and are liking that.&rdquo;</li>
</ul>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>69% of respondents wanted us to fund a mix of established and speculative projects, and 18% wanted us to only fund established projects.</p>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Communication</li>
<li>Community Building</li>
<li>Transparency</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Promotion for increasing members</li>
<li>Describe reasons for projects chosen</li>
<li>Refunding of old projects</li>
</ul>
<p>If you&rsquo;d like to see more companies sponsor Clojurists Together, please reach out to them and encourage them to join.</p>
<p>Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>June 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/june-2019-monthly-update/</link>
      <pubDate>Mon, 01 Jul 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/june-2019-monthly-update/</guid>
      <description>It&amp;rsquo;s been a successful second month with our selected Q2 project, Fireplace, check out the updates below. The Call for Proposals for Q3 Projects at Clojurists Together is now open!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together">Clojurists Together</h2>
<p>Hi CT Community -</p>
<p>It&rsquo;s been a successful second month with our selected Q2 project, Fireplace, check out the updates below.</p>
<p>The <a href="https://www.clojuriststogether.org/open-source/">Call for Proposals</a> for Q3 Projects at Clojurists Together is now open!</p>
<p>Just a reminder that Daniel is speaking about Clojurists Together again soon. Catch him at one of the following local events:</p>
<p><a href="https://heartofclojure.eu/">Heart of Clojure</a> - <a href="https://heartofclojure.eu/program#daniel-compton">Money for Nothing: The past and future of funding OSS</a>
<br /> August 2nd in Leuven, Belgium</p>
<p><a href="https://thestrangeloop.com">Strange Loop</a> - <a href="https://thestrangeloop.com/2019/a-stitch-in-time---the-future-of-oss-sustainability.html">A Stitch in Time - The future of OSS Sustainability</a>
<br /> September 12-14 in St. Louis, Missouri, USA</p>
<p>Thanks for your continued support of Clojurists Together.</p>
<h3 id="fireplace-update">Fireplace update</h3>
<p>Job support at an API level is live on master for both Vim and Neovim.
The first user facing feature to take advantage of this is the test
runner, which is now fully asynchronous.</p>
<p>Commits:</p>
<ul>
<li>Warn, don&rsquo;t error, on missing eval value</li>
<li>Replace load-file hack with eval file/line/column</li>
<li>Remove nREPL version check</li>
<li>Use native quickfix title support</li>
<li>Tighten match for stacktrace entry</li>
<li>Process test results incrementally</li>
<li>Use quickfix list id if available</li>
<li>Accept job style errors</li>
<li>Remove hack for newlines in shell arguments</li>
<li>Make python socket connection lazy</li>
<li>Eliminate interactive host/port input</li>
<li>Tweak regexp to better match URL</li>
<li>Accept a bang to :Connect</li>
<li>Fix yet another Python 3 buffering issue</li>
<li>Fix convolution getting Boot class path</li>
<li>Fix infinite loop on disconnect</li>
<li>Fix syntax error</li>
<li>Preliminary support for Vim 8 and Neovim jobs</li>
</ul>
<p>This update brings us a handful of miscellaneous user facing features
plus a lot of refactoring to get the data model in line with async
support.</p>
<p>Commits:</p>
<ul>
<li>Make omnicomplete (sort of) async</li>
<li>Try tightening polling loop</li>
<li>Eliminate session.process()</li>
<li>Eliminate session.prepare()</li>
<li>Retool stacktrace retrieval</li>
<li>Move interrupt handling from eval to all ops</li>
<li>Track sessions at transport level</li>
<li>Rename nrepl namespace to session</li>
<li>Rename s:nrepl to s:session</li>
<li>Move class path retrieval to transport layer</li>
<li>Add support for spec-form and spec-example</li>
<li>Fix documented option names</li>
<li>Better ClojureScript REPL configuration</li>
<li>Return request id for asynchronous message</li>
<li>Support :Connect ./.nrepl-port</li>
<li>Return transport rather than session when registering port file</li>
<li>Update Piggieback support for transport object</li>
<li>Move describe to transport layer</li>
<li>Move message handing logic to transport layer</li>
<li>Rewrite connection namespace as transport namespace</li>
<li>Further tighten quickfix stacktrace match</li>
<li>Remove outdated documentation references to if_pyth</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>May 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/may-2019-monthly-update/</link>
      <pubDate>Thu, 06 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/may-2019-monthly-update/</guid>
      <description>This month we present the first updates from one of our Q2 Projects - Fireplace!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>Hi CT Community -</p>
<p>This month we present the first updates from one of our Q2 Projects - Fireplace!</p>
<hr>
<p><img src="/images/may-2019/bay-area-clojure.jpeg" alt="Daniel talking at Bay Area Clojure"></p>
<p>Last month, Our Project Leader Daniel Compton spoke about Clojurists Together at the <a href="https://www.meetup.com/The-Bay-Area-Clojure-User-Group/events/261141279/">Bay Area Clojure Meetup</a>, and at the <a href="https://www.meetup.com/Clojure-nyc/events/260728030/">Clojure NYC Meetup</a>. It was great to be able to meet people and talk about Clojurists Together with the community.</p>
<p><img src="/images/may-2019/clojure-nyc.jpeg" alt="Daniel talking at Clojure NYC"></p>
<p>We were excited to see <a href="https://twitter.com/devonzuegel">Devon Zuegel</a> mentioned Clojurists Together at GitHub Satellite as part of the inspiration for their new <a href="https://github.com/sponsors">GitHub Sponsors</a> program!</p>
<p><img src="/images/may-2019/github-satellite.jpeg" alt="GitHub Sponsors"></p>
<p>Daniel is also speaking about Clojurists Together again soon! Catch him at one of the following local events:</p>
<p><a href="https://heartofclojure.eu/">Heart of Clojure</a> - <a href="https://heartofclojure.eu/program#daniel-compton">Money for Nothing: The past and future of funding OSS</a>
<br /> August 2nd in Leuven, Belgium</p>
<p><a href="https://thestrangeloop.com">Strange Loop</a> - <a href="https://thestrangeloop.com/2019/a-stitch-in-time---the-future-of-oss-sustainability.html">A Stitch in Time - The future of OSS Sustainability</a>
<br /> September 12-14 in St. Louis, Missouri, USA</p>
<p>Thanks for your continued support of Clojurists Together!</p>
<h2 id="fireplace-update">Fireplace update</h2>
<h3 id="may-1---15">May 1 - 15</h3>
<p>This first period has been lots of housekeeping and bug fixes.
Much of it has been centered on the relatively small bit of Python
code used for the nREPL network connection, which has needed attention
to Python 3 support now that Python 2 is finally starting to disappear
in the wild.</p>
<p>I also did a spike on async job support and determined it is indeed
viable. It&rsquo;s not pushed yet but most of the associated refactoring is.</p>
<p>Raw list of commits:</p>
<ul>
<li>Fix ambiguous use of relative path for port file</li>
<li>Update installation instructions</li>
<li>Require Vim 8</li>
<li>Change shell argument encoding from Bencode to JSON</li>
<li>Fix typo</li>
<li>Fix string encoding issue with Python 3</li>
<li>Eliminate string eval retrieving Python result</li>
<li>Further fixes to string encoding handling</li>
<li>Fix nrepl_connection.vim reload with Python 3</li>
<li>Simplify Python version specific socket code</li>
<li>Fix dropped messages due to buffering - <a href="https://github.com/tpope/vim-fireplace/issues/278">#278</a></li>
<li>Work around if_pyth handling of Vim integers</li>
<li>Use JSON to output return value for parsing by Vim</li>
<li>Allow opting out of pretty print</li>
<li>Fix bdecode error handling</li>
<li>Add public configuration for Python executable</li>
<li>Use :python3 for listing jar contents</li>
<li>Make combine() idempotent</li>
<li>Use pythonx if available</li>
<li>Remove zip.vim hack</li>
<li>Clean up fireplace#source()</li>
<li>Move bencode from VimL to Python</li>
</ul>
<h3 id="may-16---31">May 16 - 31</h3>
<p>This time around is more of the same: assorted housekeeping and async
job progress. I&rsquo;ve finished my &ldquo;low hanging fruit&rdquo; pass through the
issue tracker and have cut a maintenance release. With a little luck,
I&rsquo;ll have the initial job support on master by the next update.</p>
<p>Commits:</p>
<ul>
<li>Remove transport level support for old pprint</li>
<li>Don&rsquo;t make assumptions about colons in host name</li>
<li>Remove dead code</li>
<li>Fix reload issues</li>
<li>Add conventional defaults for matching responses to request</li>
<li>Grant access to Python traceback</li>
<li>Separate argument generation from shell escaping</li>
<li>Stream value responses</li>
<li>Fix accidental return of None</li>
<li>Add hard Vim 8 requirement</li>
<li>Streamline messaging API</li>
<li>Loosen match for classpath in errorformat</li>
<li>Use quickfix &ldquo;module&rdquo; to tighten up stacktrace display</li>
<li>fireplace.vim 1.2</li>
</ul>
<p>Related issues: <a href="https://github.com/tpope/vim-fireplace/issues/276">#276</a>, <a href="https://github.com/tpope/vim-fireplace/issues/290">#290</a>, <a href="https://github.com/tpope/vim-fireplace/issues/329">#329</a>, <a href="https://github.com/tpope/vim-fireplace/issues/336">#336</a>,</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>April 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/april-2019-monthly-update/</link>
      <pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/april-2019-monthly-update/</guid>
      <description>Here is our final Q1 monthly update from projects, Neanderthal and Aleph - thanks so much for all your hard work this quarter.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>Hello CT Community -</p>
<p>Here is the final update from our Q1 projects. We appreciate the work of Neanderthal and Aleph.</p>
<p>Our Project Leader, Daniel Compton, is speaking about Clojurists Together soon! Catch him at one of the following local events:</p>
<p><a href="https://www.meetup.com/Clojure-nyc/events/260728030/">NYC Meetup: Funding OSS- Clojurists Together</a>
<br /> May 15th in New York City, NY
<br /> 6:30 - 8:30pm</p>
<p><a href="https://heartofclojure.eu/">Heart of Clojure</a>
<br /> August 2nd in Leuven, Belgium</p>
<p>Thanks for your continued support of Clojurists Together!</p>
<h2 id="neanderthal-update">Neanderthal update</h2>
<ol start="13">
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-13-Initializing-Weights">Simple Neural Network Training API</a>
April 3, 2019
The stage has been set for wrapping up the simplest version of a complete neural network API, and its key part that offers the entry for the /learning/ functionality - the training API.</p>
</li>
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-14-Learning-Regression">Initializing Weights</a>
April 10, 2019
As the iterative learning algorithm has to start somewhere, we have to decide how to initialize weights. Here we try a few techniques and weight their strengths and weaknesses until we find one that is good enough.</p>
</li>
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-15-Weight-Decay">Learning a Regression</a>
April 15, 2019
A great moment has arrived. We are going to apply our neural networks implementation to a regression problem. The network is going to learn a known function, which enables us to see how well it learns, and why it doesn&rsquo;t do a great job. We are also going to get some hints for improvements. But, hey, it works!</p>
</li>
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-16-Momentum">Weight Decay</a>
April 23, 2019
In this article we explore a simple but useful technique for keeping weights from growing too big. Weight Decay is useful as a regularization technique that improves generalization, and can help with improving even the basic learning on the technical level.</p>
</li>
<li>
<p>Momentum
April 29, 2019
Today we are going to implement momentum, a ubiquitous learning optimization technique. What&rsquo;s more, we&rsquo;ll do it without any performance penalty. Find out how many lines of Clojure code it will take.</p>
</li>
<li>
<p>GPU Accelerated Neural Networks in 6 Lines of Clojure
Waiting to be published next week
Is it possible to program a fast implementation of neural networks in 6 lines of any language? What about neural networks
that run on both CPU and GPU?</p>
</li>
</ol>
<h3 id="promoting-neanderthal-in-the-non-clojure-community">Promoting Neanderthal in the non-Clojure community</h3>
<p>During the Clojurists Together funding period, I have published 17 long articles. 6 articles got some nice publicity by reaching the frontpage of Hacker News.</p>
<p>From February 1st to April 29th, the articles had 57,294 views by 28,570 unique users. This data is from Google Analytics <em>after the bots and spam were heavily filtered out</em>, so the reported traffic seems genuine. Cloudflare shows much higher numbers, as expected.</p>
<p>I plan to continue writing on this topic and release a series of beautifully typeset books that use Clojure to explain the attractive and popular topics of Deep Learning, Data Analysis, GPU programming and HPC to wider programming community. This series roughly cover a third of the book &ldquo;Deep Learning for Programmers&rdquo; that I will open for early access in May.</p>
<h3 id="general-bug-fixes-and-improvements-to-the-neanderthal-suite-of-libraries">General bug fixes and improvements to the Neanderthal suite of libraries</h3>
<p>During these 3 months, I released versions 0.22.0, 0.22.1, and 0.23.0, which contain new functions useful in deep learning and general high performance programming and upgraded the underlying OpenCL engine.</p>
<p><br /></p>
<h2 id="aleph-update">Aleph Update</h2>
<ol>
<li><a href="https://github.com/ztellman/aleph/pull/510">MQTT support</a></li>
</ol>
<p>The biggest and the most time-consuming chunk of the effort. Right now the implementation covers MQTT3.1 client publish flows (including fire-and-forget and at-most-once use cases). Subscriptions are still in progress. Flow control is implemented on top of Manifold&rsquo;s stream put/take operations. It makes code easier to read/maintain, but probably not the most performant approach. Potentially we can get better performance implementing flows as Netty handlers. To make the final decision I still need to implement both and run performance tests to compare both approaches.</p>
<ol start="2">
<li><a href="https://github.com/ztellman/aleph/pull/505">Helper to extract SSL session</a></li>
</ol>
<p>This information is critical to have when working with mutual TLS. TCP connection exposes SSL session through the field in <code>def-map-type</code>. Exposing new field with Java-object value for HTTP might introduce problems with backward compatibility because Java objects usually play badly with print/read/eval cycles. I think helper covers the use case tho’.</p>
<ol start="3">
<li><a href="https://github.com/ztellman/aleph/pull/508">Activity logger for HTTP &amp; TCP servers</a></li>
</ol>
<p>API looks the same way it looks for clients. :log-activity param includes LoggingHandler as a top-level handler. There’s still an open question on how to log activity for each child handler (read “for each open connection”). Not to confuse users, I would probably merge both loggers to be instantiated using the same configuration key. So you don’t need to know what “handler” and “childHandler” are.</p>
<ol start="4">
<li><a href="https://github.com/ztellman/aleph/pull/509">Accurate handling of proxy exceptions</a></li>
</ol>
<p>The previous implementation throws ProxyConnectionTimeoutException in case of any proxy connection error. Which is obviously misleading. The fix provided is capable of dealing with 3 different types of exceptions: connection timeout, HTTP proxy exception with input headers attached (introduced <a href="https://github.com/netty/netty/pull/8824),">https://github.com/netty/netty/pull/8824),</a> generic connection exception (e.g. &ldquo;disconnect&rdquo;, &ldquo;no response&rdquo; etc). Note, that HTTP proxy response headers usually are the only available source of debugging information, so it’s critical to keep them available for end users.</p>
<ol start="5">
<li><a href="https://github.com/ztellman/aleph/pull/471">FileNotFoundException is finally fixed</a></li>
</ol>
<p>The branch is merged with other changes from master, I think file regions support was the biggest blocker there. The response format is updated in order to hide exception details. Now server return by default generic error. Mostly due to safety reasons.</p>
<ol start="6">
<li><a href="https://github.com/ztellman/aleph/pull/506">Properly initialize per-message deflate handshaker</a></li>
</ol>
<p>The problem was originally reported and discussed in <a href="https://github.com/ztellman/aleph/issues/494">https://github.com/ztellman/aleph/issues/494</a>. In short words, WebSocket server compression didn’t work because the server was not able to communicate available extensions during the handshake. To be able to test the result of the handshake, the result was exposed through the stream description (<a href="https://github.com/ztellman/aleph/pull/498">https://github.com/ztellman/aleph/pull/498</a>) and after some communication with Netty’s community, the initial problem was solved in a somewhat “hacky” way by firing HTTP request through the pipeline after WebSocket deflator was added. It would be great if we could bury this state propagation deeper not exposing the event to the rest of the pipeline e.g. using EmbeddedChannel, but that’s almost impossible to do because the handler itself is not marked to be Sharable, so it fails to be added to more than one pipeline. The solution works even tho’ it’s not beautiful enough.</p>
<ol start="7">
<li><a href="https://github.com/ztellman/aleph/pull/507">Update Netty to 4.1.36</a></li>
</ol>
<p>“WebSocket client handshaker to support &ldquo;force close&rdquo; after timeout” <a href="https://github.com/netty/netty/pull/8896">https://github.com/netty/netty/pull/8896</a> was merged into Netty 4.1.35.Final. The idea behind that PR was to introduce force timeout for WebSocket client instead of waiting for the server to close the connection forever. Initially I was going to implement this functionality for Aleph but finally ended with Netty’s PR. It took quite some time to polish and merge, but as soon as Netty version is bumped in Aleph, I’m going to port force close settings here. BTW, it will work even without exposed settings as the timeout defaults to 10 seconds in Netty.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2019 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q2-2019-funding-announcement/</link>
      <pubDate>Tue, 30 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2019-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q2 of 2019 (May-July) we are funding two projects: Boot with Matthew Ratzke, and Fireplace with Tim Pope.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q2 of 2019 (May-July) we are funding two projects: <a href="https://boot-clj.com">Boot</a> with Matthew Ratzke, and <a href="https://github.com/tpope/vim-fireplace">Fireplace</a> with Tim Pope.</p>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This funding cycle is our fifth. Previously we have supported <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, <a href="http://www.cider.mx/en/latest/">CIDER</a>, <a href="https://aleph.io">Aleph</a>, and <a href="https://neanderthal.uncomplicate.org">Neanderthal</a>.</p>
<h2 id="funding-details">Funding details</h2>
<p>We were able to increase our support for projects in the last quarter from $5,400 over three months ($1,800/mo), to $9,000 over three months ($3,000/mo).</p>
<h2 id="boot">Boot</h2>
<p>Boot is one of the main build tools used in the Clojure ecosystem and was used by 10% of Clojure developers in the most recent <a href="https://www.surveymonkey.com/results/SM-S9JVNXNQV/">Clojure survey</a>. It lets you build flexible build processes with Clojure code.</p>
<h3 id="matthews-plans-for-the-next-three-months-are">Matthew&rsquo;s plans for the next three months are:</h3>
<ul>
<li>Restructuring - I want to separate boot into libraries that more closely resemble their intended function:
<ul>
<li>Fileset (in-progress)</li>
<li>Pods</li>
<li>Tasks</li>
<li>Environment</li>
<li>Boot &ldquo;App&rdquo;</li>
</ul>
</li>
<li>Remove Included code from other projects (ie. remove all boot.from.* namespaces)</li>
<li>Remove Deprecated Code</li>
<li>Optimize the Internal Libraries with minimal changes to Public API</li>
</ul>
<p>Matthew has also written more about the <a href="https://medium.com/degree9/boot-future-boot-e1948562d8d3">Future of Boot</a> and <a href="https://www.youtube.com/watch?v=xqGmE4KyhzQ">spoke</a> at Dutch Clojure Days on the same topic.</p>
<h2 id="fireplace">Fireplace</h2>
<p>Fireplace is a vim plugin for Clojure. It adds REPL integration and was used by 10% of Clojure developers in the most recent Clojure survey.</p>
<h3 id="tims-plans-for-the-next-three-months-are">Tim&rsquo;s plans for the next three months are:</h3>
<ul>
<li>Work through the issue tracker. Answer outstanding questions,
implement the low hanging fruit, close anything old and invalid, be
frank about the wontfixes, and categorize everything else.</li>
<li>Implement support for Vim 8 and Neovim job support. If this goes
well (doesn&rsquo;t turn out to be untenable), it will probably account for
the bulk of the time.</li>
<li>Assess the state of the ClojureScript ecosystem and see what
improvements can be brought to Fireplace&rsquo;s support.</li>
<li>Work through sibling plugin <a href="https://github.com/tpope/vim-salve">salve.vim&rsquo;s</a> issue tracker.</li>
</ul>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied this quarter were:</p>
<ul>
<li>Fulcro</li>
<li>Boot</li>
<li>Calva</li>
<li>Formic</li>
<li>Intro to Programming w/Clojure in Georgian Language</li>
<li>Pathom</li>
<li>Origami</li>
<li>Klipse</li>
<li>Fireplace</li>
<li>LightTable</li>
<li>Shadow CLJS</li>
<li>ohmyclj</li>
</ul>
<h2 id="q2-2019-funding">Q2 2019 Funding</h2>
<p>We had a bunch of great applications from great projects; we would have liked to fund several more projects if we had the money. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, you can re-use that application to <a href="/open-source/">apply</a> for Q3 2019. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>March 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/march-2019-monthly-update/</link>
      <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-2019-monthly-update/</guid>
      <description>The second month of updates from Neanderthal and Aleph is here. Thanks for your continued support of Clojurists Together!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>Hello CT Community -</p>
<p>The second month of updates from Neanderthal and Aleph is here.</p>
<p>Thanks for your continued support of Clojurists Together!</p>
<h2 id="neanderthal-update">Neanderthal update</h2>
<ol start="10">
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-10-The-Backward-Pass-CDU-GPU-CUDA-OpenCL-Nvidia-AMD-Intel">Deep Learning from Scratch to GPU - 9 - The Activation and its Derivative</a>
<br /> March 20, 2019
We implement the key part of the backward pass, the computation of the error of a layer. Along the way, we set up the infrastructure for the complete implementation of backpropagation.</p>
</li>
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-11-A-Simple-Neural-Network-API">Deep Learning from Scratch to GPU - 10 - The Backward Pass (CUDA, OpenCL, Nvidia, AMD, Intel</a>
<br /> March 25, 2019
We complete the basic implementation of the backward pass of backpropagation and gradient descent.</p>
</li>
<li>
<p><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-12-A-Simple-Neural-Network-Training-API">Deep Learning from Scratch to GPU - 11 - A Simple Neural Network Inference API</a>
<br /> March 28, 2019
The time is ripe for wrapping what we have built so far in a nice Neural Network API. After all, who would want to assemble networks by hand?</p>
</li>
</ol>
<h2 id="aleph-update">Aleph Update</h2>
<p>I&rsquo;ve spent quite a lot of time working through comments for previous PRs and keeping those changes in a mergable state. At the end of the day a few PRs made their way to master and I hope to see more following.</p>
<h3 id="websockets">WebSockets</h3>
<ul>
<li>
<p><a href="https://github.com/ztellman/aleph/issues/494">Issue</a> with WebSocket per-message deflate extension handshaker turned out to be way more complex than I’ve expected. I had an idea to close the gap of inconsistent APIs on Netty&rsquo;s side: <a href="https://github.com/netty/netty/pull/8973">“Decouple WebSocket server extension handshaker from read I/O“</a>. But as these changes didn&rsquo;t get through, I&rsquo;m going to implement workaround in Aleph&rsquo;s codebase.</p>
</li>
<li>
<p>Expose more information about handshake result both on the client and on  the server, e.g. subprotocols and extensions <a href="https://github.com/ztellman/aleph/pull/498">#498</a>.</p>
</li>
<li>
<p>WebSocket client handshake processing flow changes, <a href="https://github.com/ztellman/aleph/pull/498">#498</a>. This change effectively reverts one of my old PRs with regards to how aggregated HTTP request is process when doing WebSocket handshake. Previously I thought that this approach leads to memory leaks, which turned out not to be the case. New implementation should be more performance and obviously has less memory overhead.</p>
</li>
<li>
<p>A few updates to WebSocket client force close after given timeout functionality <a href="https://github.com/netty/netty/pull/8896">submitted to Netty</a>.</p>
</li>
<li>
<p>I also spent tons of hours investigating performance of <code>netty/source</code> and <code>netty/sink</code> in turms of latencies, throughput, backpressure. I was looking into Netty&rsquo;s <code>autoRead</code> semantic, how Aleph deals with it and if we can improve performane oding <code>flush</code> on <code>readComplete</code>. To make story short: we can. In cases when you send/receive a lot of small chunks. I&rsquo;m still not sure how to expose this in the framework tho'. Talking about small chunks of data&hellip; I did the same investigation for UDP.</p>
</li>
</ul>
<h3 id="files">Files</h3>
<ul>
<li>
<p><a href="https://github.com/ztellman/aleph/pull/497">#497</a> Use <code>HttpUtil</code> to manage &ldquo;Content-Length&rdquo; header, small internal improvement.</p>
</li>
<li>
<p>Even more fixes for Keep-Alive connections management for Netty&rsquo;s <a href="https://github.com/netty/netty/pull/8966">examples</a>, I think it makes sense to refactor part of the Aleph and move Keep-Alive logic into a separate channel handler so I would be easier to extend/fix (e.g. to close the connection after the error response).</p>
</li>
<li>
<p><a href="https://github.com/kachayev/nasus">Nasus</a> (static files server) got a few more features: CORS headers, symlics support, Basic Auth.</p>
</li>
</ul>
<h3 id="performance">Performance</h3>
<ul>
<li>HTTP client timeouts were reimplemented with <code>HashedWheelTimer</code>s that are designed specifically to handler tons of I/O events, <a href="https://github.com/ztellman/aleph/pull/499">#499</a>. That&rsquo;s a huge performance improvement for projects with higher RPS rates. The reasons for that were described in <a href="https://github.com/ztellman/aleph/issues/479">#479</a>, thanks to <a href="https://github.com/alexander-yakushev">Alexander Yakushev</a> for brining this up.</li>
</ul>
<h3 id="mqtt">MQTT</h3>
<p>I&rsquo;ve started this as an experiment.. but now part of client-side logic is implemented: connect/disconnect logic, publish messages to topics, acknowledgements flow for at least once QoS level. There&rsquo;re still a lot of things missing but end-to-end example already works. I hope I&rsquo;ll manage to pack those into a separate PR pretty soon.</p>
<p>Stay tuned!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2019 Survey Results and Call for Proposals</title>
      <link>https://www.clojuriststogether.org/news/q2-2019-survey-results-and-call-for-proposals/</link>
      <pubDate>Sun, 07 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2019-survey-results-and-call-for-proposals/</guid>
      <description>Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter. Project applications for our Q2 2019 round close on 15th Apr, midnight PST. The selections will be announced shortly afterwards. The Q2 2019 projects will start on May 1.</description>
      <content:encoded><![CDATA[<p>Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter.</p>
<p>Project applications for our Q2 2019 round close on 15th Apr, midnight PST. The selections will be announced shortly afterwards. The Q2 2019 projects will start on May 1.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 56 respondents to the survey, down from 67 in the last survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 55 (98%)</li>
<li>ClojureScript - 43 (77%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (96%)</li>
<li>ClojureScript Browser (73%)</li>
<li>ClojureScript Node Server (10%)</li>
<li>Clojure JVM Client (13%)</li>
<li>ClojureScript Desktop Application (13%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things people were interested in:</p>
<ul>
<li>developer experience tools (52%)</li>
<li>build tooling (43%)</li>
<li>documentation (43%)</li>
<li>error messages (39%)</li>
<li>IDE support (41%)</li>
<li>test tooling (30%)</li>
<li>linters (29%)</li>
</ul>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>shadow-cljs, CIDER, ClojureScript, re-frame, clojure.spec, fulcro, Pathom</p>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>About 2/3 of responses have seen direct benefits.</p>
<ul>
<li>&ldquo;Yes, have used Kaocha at work, looks really good. I haven&rsquo;t used the other libraries so can&rsquo;t comment.&rdquo;</li>
<li>&ldquo;No&hellip; but maybe someday! Aleph is strategic to keep warm because Netty is the sort of project that may suddenly come out with a CVE fix.&rdquo;</li>
<li>&ldquo;Really liked the Neanderthal blog series&rdquo;</li>
<li>&ldquo;Yes I use Figwheel all the time. I&rsquo;m in the process of using Kaocha as the test runner for all my projects.&rdquo;</li>
</ul>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>75% of respondents wanted us to fund a mix of established and speculative projects, and 25% wanted us to only fund established projects. This is roughly the same as our Q4 2018 survey. In Q1 2019 the mix was 80/20.</p>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Communication</li>
<li>Community Building</li>
<li>Transparency</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Funding models and exploring different project time amounts</li>
<li>Update website</li>
<li>Fund more projects</li>
</ul>
<p>We&rsquo;re still looking at ways we can tailor our funding to better match the needs of OSS projects. We were hoping to offer different funding models for our Q2 funding round, but weren&rsquo;t able to get it ready in time.</p>
<p>If you&rsquo;d like to see more companies sponsor Clojurists Together, please reach out to them and encourage them to join.</p>
<p>Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>February 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/february-2019-monthly-update/</link>
      <pubDate>Tue, 12 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/february-2019-monthly-update/</guid>
      <description>This month we present the first update from our new projects, Neanderthal and Aleph. Thanks to everyone for your continued support of Clojurists Together!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>Hello CT Community -</p>
<p>This month we present the first update from our new projects, Neanderthal and Aleph. Thanks to everyone for your continued support of Clojurists Together!</p>
<h2 id="funding-update">Funding update</h2>
<p>Since our <a href="/news/q1-2019-funding-announcement/">Q1 project selection</a> we are very pleased to announce that we have been able to raise the amount we can fund projects from $1,800/month to $3,000/month. This is thanks to the growth in member support, particularly in the last few months of 2018. A special thanks to all our members, this was due to you.</p>
<h2 id="neanderthal-update">Neanderthal update</h2>
<p>During the first month of funding, I have published 7 detailed posts, around 8,000 words in total:</p>
<ol>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-0-Why-Bother">Deep Learning in Clojure from Scratch to GPU - Part 0 - Why Bother?</a>
<br /> February 1, 2019 -
An introduction to a series of tutorials about Deep Learning in Clojure funded by Clojurists Together. Start with an empty clj file and build a fast neural network that runs on the GPU, built with nothing else but plain Clojure and Neanderthal. The series is a companion to a free online book Neural Networks and Deep Learning.</li>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-1-Representing-Layers-and-Connections">Deep Learning from Scratch to GPU - 1 - Representing Layers and Connections</a>
<br /> February 6, 2019 -
Here we start our journey of building a deep learning library that runs on both CPU and GPU.</li>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-2-Bias-and-Activation-Function">Deep Learning from Scratch to GPU - 2 - Bias and Activation Function</a>
<br /> February 11, 2019 -
We continue building our network by adding the activation function and bias.</li>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-3-Fully-Connected-Inference-Layers">Deep Learning from Scratch to GPU - 3 - Fully Connected Inference Layers</a>
<br /> February 14, 2019 -
It&rsquo;s time to formalize some structure of our layers into a layer type.</li>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-4-Increasing-Performance-with-Batch-Processing">Deep Learning from Scratch to GPU - 4 - Increasing Performance with Batch Processing</a>
<br /> February 18, 2019 -
We increase performance many times by computing a group of (vector) inputs as one (matrix) batch.</li>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-5-Sharing-Memory">Deep Learning from Scratch to GPU - 5 - Sharing Memory</a>
<br /> February 21, 2019 -
Sharing and reusing memory buffers is inescapable if we want high performance. It is a sharp but powerful tool.</li>
<li><a href="https://dragan.rocks/articles/19/Deep-Learning-in-Clojure-From-Scratch-to-GPU-6-CUDA-and-OpenCL">Deep Learning from Scratch to GPU - 6 - CUDA and OpenCL</a>
<br /> February 28, 2019 -
We generalize the network code and run it on the GPU. On an Nvidia GPU with CUDA, and on an AMD GPU with OpenCL. Even more - we mix both CUDA and OpenCL, just because we can.</li>
</ol>
<h2 id="aleph-update">Aleph Update</h2>
<h3 id="part-i">Part I</h3>
<p>A lot has happened these last few weeks. The key focus was on implementing new features, so let&rsquo;s enumerate all of them.</p>
<h3 id="websockets">WebSockets</h3>
<ul>
<li><a href="https://github.com/ztellman/aleph/pull/422">#422</a> &ldquo;Handle WebSocket handshake timeouts&rdquo;.</li>
</ul>
<p>Initially implemented by <a href="https://github.com/shilder">Denis Shilov</a>. Thanks a lot! I&rsquo;ve reimplemented the functionality partially to avoid usage of Manifold&rsquo;s timer. Mostly because of performance considerations. I&rsquo;ve also opened <a href="https://github.com/netty/netty/issues/8841">the same issue</a> for Netty as this functionality is not covered by built-in websocket protocol handlers. And it was already implemented <a href="https://github.com/netty/netty/pull/8856">here</a> by <a href="https://github.com/qeesung">Qin Shicheng</a>.</p>
<ul>
<li><a href="https://github.com/ztellman/aleph/pull/481">#481</a> &ldquo;Fine-grained websocket close handshake API&rdquo;.</li>
</ul>
<p>This PR introduces new <code>http/websocket-close!</code> API to close the connection providing custom status code and optional reason text. Application level protocols usually use those to define and handle different reasons for closing the connection.</p>
<ul>
<li><a href="https://github.com/netty/netty/pull/8896">Netty&rsquo;s #8896</a> &ldquo;WebSocket client handshaker to support force close after timeout&rdquo;.</li>
</ul>
<p>RFC 6455 defines that, generally, a WebSocket client should not close a TCP connection as far as a server is the one who&rsquo;s responsible for doing that. In practice tho', it&rsquo;s not always possible to control the server. Server&rsquo;s misbehavior may lead to connections being leaked (if the server does not comply with the RFC). RFC 6455 #7.1.1 says &ldquo;In abnormal cases (such as not having received a TCP Close from the server after a reasonable amount of time) a client MAY initiate the TCP Close.&rdquo;. The PR mentioned extends WebSocket client handshaker with additional param <code>forceCloseTimeoutMillis</code> and processing of the timeout when configured.</p>
<p>Usually I do this in a different order: implementing something in Aleph and after that porting the same functionality to Netty. But this time I went another road and started with Netty. After the next release I&rsquo;m going to reuse the implementation. Current version of Aleph simply closes the connection right after the <code>CloseFrame</code> was flushed (never letting the server to reply back).</p>
<p><a href="https://github.com/dspearson">Dominic Pearson</a> also submitted <a href="https://github.com/ztellman/aleph/pull/488/">#488</a> to give the user ability to specify name resolver when setting up a new client WebSocket connection. Thanks a lot!</p>
<p>I&rsquo;ve also reimplemented acquire/release cycles for all Websocket frames both for the client and the server. Unfortunately, it&rsquo;s still possible to catch unreleased buffers warning when running tests (pretty randomly). So I&rsquo;m going to merge all updates around WebSockets protocol handling into a separate branch to do my best to find what causes the leak.</p>
<h3 id="large-requests--responses">Large requests &amp; responses</h3>
<ul>
<li><a href="https://github.com/ztellman/aleph/pull/432">#432</a> &ldquo;Attempt to provide correct API for multipart resources management&rdquo;.</li>
</ul>
<p>I hope this one is final. The problem with multipart requests API is that the user should be very careful about resources allocation/deallocation cycle (remember, most probably this API is used for handling large file uploads&hellip; meaning you definitely don&rsquo;t want to screw this up). Aleph has a little chance to help because of the underlying async execution model. And Netty&rsquo;s implementation is far from being perfect too (I think mostly with the same reasoning). Previous implementation was designed with a single &ldquo;deallocate&rdquo; point. But after some testing I found a problem with the approach introduced earlier. I&rsquo;ve reimplemented public API using <code>io.netty.util.ReferenceCounted</code> and relying on <code>netty/release</code> for each consumed chunk. The API that exposes a single <code>.close</code> method for the entire decoder object lacks flexibility as the user cannot deallocate memory from a specific chunk (potentially freeing a lot of space as soon as possible) while all other chunks are still in processing&hellip; So, I think that releasing them one-by-one is the best option in terms of resources usage even tho' it might be a bit confusing from the first glance (well, nothing special if you have some experience with Netty/C/C++/Rust etc, but probably not something you&rsquo;re doing in Clojure on a daily basis).</p>
<ul>
<li><a href="https://github.com/ztellman/aleph/pull/473">#473</a> &ldquo;HTTP client to support body decompression&rdquo;.</li>
</ul>
<p>This was a question of parity with <code>clj-http</code> API. <code>clj-http</code> automatically includes &ldquo;Accept-Encoding&rdquo; header to each request and decompress the response when it comes back being compressed. Mentioned PR introduces support for <code>:decompress-body?</code> param (switched OFF by default to provide backward compatibility). When set to <code>true</code> works pretty much the same way <code>clj-http</code> does: includes headers, checks the response &ldquo;Content-Encoding&rdquo; header, and decompresses the body when necessary before spitting it out.</p>
<ul>
<li><a href="https://github.com/ztellman/aleph/pull/482">#482</a> &ldquo;Custom 100-Continue handler&rdquo;.</li>
</ul>
<p>Server now accepts new <code>:continue-handler</code> param to control response flow for requests with &ldquo;Except: 100-Continue&rdquo; header. By default Aleph just accepts all requests automatically sending &ldquo;HTTP/1.1. 101 Continue&rdquo; response and resuming reading the body after that. Now you can provide as a <code>:continue-handler</code> a function that given specific request should decide whether the client should proceed or not. You can also provide a custom rejection response if the standard &ldquo;417 Expectation Failed&rdquo; somehow doesn&rsquo;t work for you.</p>
<ul>
<li><a href="https://github.com/ztellman/aleph/pull/485">#485</a> &ldquo;http/file API to send region of the file&rdquo;.</li>
</ul>
<p>Aleph server understands if your handler sends <code>java.io.File</code> object as a <code>:body</code> (using zero-copy transfer when possible). The PR mentioned gives you ability to send part of the file. The use case here is range queries support. Hopefully I&rsquo;ll prepare some documentation on this (or a new example) in the next few weeks. It also extends body coercer to support <code>java.nio.file.Path</code>.</p>
<h3 id="name-resolvers">Name resolvers</h3>
<p>Previously Aleph supported two name resolvers &ldquo;out of the box&rdquo; (well&hellip; you still can plug in your own): sync JDK&rsquo;s (default one) and async Netty&rsquo;s DNS client. A new name resolver was introduced in <a href="https://github.com/ztellman/aleph/pull/487">#487</a>. <code>netty/static-name-resolver</code> creates an address resolver from a static mapping from domain names to IP addresses. Similar to what curl &ndash;resolve <mapping> does. Now you can do</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#66d9ef">def </span>resolver (<span style="color:#a6e22e">netty/static-name-resolver</span> {<span style="color:#e6db74">&#34;aleph.io&#34;</span> <span style="color:#e6db74">&#34;50.116.0.25&#34;</span> <span style="color:#e6db74">&#34;*.netty.io&#34;</span> <span style="color:#e6db74">&#34;104.28.8.44&#34;</span>}))
(<span style="color:#a6e22e">http/connection-pool</span> {<span style="color:#e6db74">:connection-options</span> {<span style="color:#e6db74">:name-resolver</span> resolver}})
</code></pre></div><p>The next thing I want to do here is to expand the functionality with composite resolvers, so you can say &ldquo;look in this mapping, if nothing found use DNS over 1.1.1.1&rdquo;.</p>
<h3 id="kqueue">KQueue</h3>
<p>Long-lived feature request, implemented in <a href="https://github.com/ztellman/aleph/pull/480">#480</a>.</p>
<p>Overall it works the same way <code>:epoll?</code> works for TCP, HTTP, WebSockets, UDP and DNS by specifying <code>:kqueue?</code> option. <code>false</code> by default, to be consistent with <code>epoll?</code>. At first glance it feels a bit weird to carry two arguments <code>epoll?</code> and <code>kqueue?</code> here and there, but on the other hand that gives me the ability to switch ON both native transports whenever possible (both will not be available on the same host anyways).</p>
<p>Netty <code>4.1.33.Final</code> has a weird <a href="https://github.com/netty/netty/issues/8849">issue</a> with KQueue selector which <a href="https://github.com/netty/netty/pull/8881">seems to be fixed</a> already.</p>
<p>And interesting problem with deps managemented I&rsquo;ve spotted in <a href="https://github.com/ztellman/aleph/issues/475">#475</a>. <code>io.netty/netty-transport-native-kqueue</code> dependency should also be specified with appropriate classifier (&ldquo;osx-x86_64&rdquo;). In the PR I&rsquo;ve updated <code>project.clj</code> to include classifiers right away, both for Epoll and KQueue JARs. Generally, this should work, apart from the fact, your JAR would be roughly 180kb larger. It also may lead to some problems with transitive dependencies from other libraries, but I don&rsquo;t have a lot of experience with classpath resolution order when using classifiers. The obvious advantage here: less confusion for users when working with native transports.</p>
<h3 id="unix-sockets">Unix sockets</h3>
<p>Another long-lived feature request, implemented in <a href="https://github.com/ztellman/aleph/pull/480">#480</a>.</p>
<p>Unix domain socket support was added for TCP &amp; HTTP both for client and server. Works only with native transports (Epoll or KQueue), Netty does not support it with NIO (yet?).</p>
<p>TCP API:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">user=&gt; (<span style="color:#66d9ef">def </span>s1 (<span style="color:#a6e22e">tcp/start-server</span> (<span style="color:#66d9ef">fn </span>[s _] (<span style="color:#a6e22e">s/connect</span> s s)) {<span style="color:#e6db74">:unix-socket</span> <span style="color:#e6db74">&#34;/tmp/tcp-server.sock&#34;</span> <span style="color:#e6db74">:kqueue?</span> true}))
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;user/s1</span>
user=&gt; (<span style="color:#66d9ef">def </span>c1 <span style="color:#f92672">@</span>(<span style="color:#a6e22e">tcp/client</span> {<span style="color:#e6db74">:unix-socket</span> <span style="color:#e6db74">&#34;/tmp/tcp-server.sock&#34;</span> <span style="color:#e6db74">:kqueue?</span> true}))
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;user/c1</span>
user=&gt; (<span style="color:#a6e22e">s/put!</span> c1 <span style="color:#e6db74">&#34;hello&#34;</span>)
&lt;&lt; <span style="color:#960050;background-color:#1e0010">…</span> &gt;&gt;
user=&gt; <span style="color:#f92672">@</span>(<span style="color:#a6e22e">s/take!</span> c1)
<span style="color:#f92672">#</span>object[<span style="color:#e6db74">&#34;[B&#34;</span> <span style="color:#ae81ff">0</span>x2eb44ff0 <span style="color:#e6db74">&#34;[B@2eb44ff0&#34;</span>]
user=&gt; (<span style="color:#a6e22e">.close</span> s1)
nil
</code></pre></div><p>HTTP API:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">user=&gt; (<span style="color:#a6e22e">require</span> <span style="color:#f92672">&#39;</span>[aleph.http <span style="color:#e6db74">:as</span> http])
nil
user=&gt; (<span style="color:#66d9ef">def </span>s1 (<span style="color:#a6e22e">http/start-server</span> (<span style="color:#66d9ef">fn </span>[_] {<span style="color:#e6db74">:status</span> <span style="color:#ae81ff">200</span> <span style="color:#e6db74">:body</span> <span style="color:#e6db74">&#34;OK&#34;</span>}) {<span style="color:#e6db74">:unix-socket</span> <span style="color:#e6db74">&#34;/tmp/server1.sock&#34;</span> <span style="color:#e6db74">:kqueue?</span> true}))
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;user/s1</span>
user=&gt; (<span style="color:#66d9ef">def </span>p (<span style="color:#a6e22e">http/connection-pool</span> {<span style="color:#e6db74">:connection-options</span> {<span style="color:#e6db74">:unix-socket</span> <span style="color:#e6db74">&#34;/tmp/server1.sock&#34;</span> <span style="color:#e6db74">:kqueue?</span> true}}))
<span style="color:#f92672">#</span><span style="color:#e6db74">&#39;user/p</span>
user=&gt; (-&gt; (<span style="color:#a6e22e">http/get</span> <span style="color:#e6db74">&#34;http://domain/info&#34;</span> {<span style="color:#e6db74">:pool</span> p}) deref <span style="color:#e6db74">:status</span>)
<span style="color:#ae81ff">200</span>
</code></pre></div><p>When connecting to unix domain socket, we still require a valid parsable URL (host + scheme). We need a hostname to acquire a connection from the pool, setup TLS <code>server_name</code> extension (when not provided manually) and render &ldquo;Host&rdquo; header (this might be required by the server). <code>curl</code> has the same problem, so I think that&rsquo;s a reasonable trade-off. Quite a few tools use <code>http+unix://&lt;socket-file&gt;/&lt;path&gt;</code> to convey both unix socket filepath and &ldquo;fake&rdquo; domain, if that&rsquo;s interesting for users we can always implement this on top of the existing functionality later on. Proxy options are rejected when connecting to unix domain socket, DNS resolver is set to <code>:noop</code> to bypass any attempts to resolve host before sending the request (we do just the same when sending requests through proxies).</p>
<h3 id="ssl-sni">SSL, SNI</h3>
<p>A lot of new functionality was introduced in <a href="https://github.com/ztellman/aleph/pull/487">#487</a>.</p>
<ul>
<li>
<p>Extended version of <code>netty/ssl-client-context</code> and <code>netty/ssl-server-context</code> to manage <code>SslContext</code> objects w/o Java interop (no need to juggle with <code>into-array &lt;some class&gt;</code> any longer).</p>
</li>
<li>
<p><code>ssl-context</code> now can be configured passing a map of options instead of calling a helper or juggling with Java interop. So you can do e.g.</p>
</li>
</ul>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#e6db74">:ssl-context</span> {<span style="color:#e6db74">:private-key</span> &lt;&gt;
              <span style="color:#e6db74">:protocols</span> [<span style="color:#e6db74">&#34;TLSv1.1&#34;</span> <span style="color:#e6db74">&#34;TLSv1.2&#34;</span>]}
</code></pre></div><p>Options coercer covers pretty much all possible configuration params.</p>
<ul>
<li>
<p>Client catches SSL handshake exceptions and returns them to the caller instead of silently closing the connection after the timeout. It&rsquo;s hard to imagine how you can workaround the error in runtime.. but it makes debugging way easier than it was before.</p>
</li>
<li>
<p>Server does not log a full stack trace for failed SSL handshake, just a single line warning. It might be useful for development somehow&hellip; but dealing with a wall of similar stacktraces on prod is far from being fun.</p>
</li>
<li>
<p><code>http/connection-pool</code> accepts new optional <code>:sni</code> param to provide a fine-grained control over <code>server_name</code> TLS extension (see more <a href="https://en.wikipedia.org/wiki/Server_Name_Indication">&ldquo;Server Name Indication&rdquo;</a>). Now you can specify different value for a <code>server_name</code> (if it&rsquo;s not equal with the host) the same way OpenSSL <code>--servername</code> param works. You can also switch it OFF. Usually including this extension is not a problem, but you should remember that this extension would be sent over the network unencrypted. If you don&rsquo;t want to reveal the host you&rsquo;re working with to intermediaries&hellip; set <code>{:sni :none}</code> when creating a new connections pool.</p>
</li>
<li>
<p>Server now accepts <code>:sni</code> option with the mapping from domain name (to be matched with <code>server_name</code> TLS extension value) to a specific <code>SslContext</code>. This is helpful when you need to support &ldquo;virtual hosts&rdquo; on the same IP address or if you want to provide mutual TLS authentication for different clients. When provided, Aleph automatically spins up SNI handler. Note, that <code>server_name</code> is an optional extension, so you still should provide default <code>SslContext</code> (this fact is forced by the implementation details both by Netty and JDK).</p>
</li>
</ul>
<h3 id="small-operational-improvements">Small operational improvements</h3>
<ul>
<li>
<p>The solution for <code>PersistentArrayMap</code> class not found&hellip; issue was merged into master and released with <code>0.4.7-alpha5</code>.</p>
</li>
<li>
<p>DNS resolver now <a href="https://github.com/ztellman/aleph/pull/477">works correctly</a> on Epoll transport, thanks <a href="https://github.com/alexander-yakushev">Alexander Yakushev</a> for discovering the problem.</p>
</li>
<li>
<p><a href="https://github.com/ztellman/aleph/pull/491">Pretty-print</a> Aleph server object to show the bind address, port and the transport used.</p>
</li>
</ul>
<h3 id="experiments">Experiments</h3>
<p>Now about more crazy stuff and ideas&hellip;</p>
<ul>
<li>HTTP/2 server</li>
</ul>
<p>This one I was planning on doing for a long-long time. There&rsquo;s a <a href="https://github.com/ztellman/aleph/issues/251">feature request</a> about HTTP/2 (with quite a few upvotes). Last week I&rsquo;ve managed to implement <a href="https://twitter.com/kachayev/status/1097657637485903878">basic support for HTTP/2 protocol</a> on the server in a way that it&rsquo;s able to reuse the same handler both for HTTP/1.1 and HTTP/2 (no need to change the implementation on the user&rsquo;s side). It uses ALPN extension to announce support for http/1.1 and h2 letting the client to deside. When client chooses h2 it translates HTTP/2 stream and data frames into Ring-like request and passes it to the same handler. Full support for all h2 features (like settings, priorities, ping/pong frames, server pushes etc) is still under a question as they&rsquo;re not covered by Ring&rsquo;s spec. Will see how far we can go. I&rsquo;m still not sure about merging this functionality into Aleph, just playing around.</p>
<ul>
<li>QUIC</li>
</ul>
<p><a href="https://blog.cloudflare.com/the-road-to-quic/">QUIC</a> is a new transport protocol that aims to &ldquo;replace&rdquo; TCP overcoming some limitations. To make the story short, you can put HTTP/3 = HTTP/2* over QUIC (* simplifications applied). My investigative attempt to implement a QUIC client with Aleph, Netty and Manifold was <a href="https://twitter.com/kachayev/status/1100747943521464320">quite successful</a>. It&rsquo;s far from being practically useful tho'. Apart from non-trivial crypto based on &ldquo;unofficial&rdquo; forked version of OpenSSL, full implementation should handle congestion control (for TCP you usually rely on your OS). I keen to go on pursuing production-level quality and features coverage. Most probably as a transport layer in Netty first.</p>
<hr>
<p>Stay tuned!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>January 2019 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/january-2019-monthly-update/</link>
      <pubDate>Mon, 11 Feb 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/january-2019-monthly-update/</guid>
      <description>We are happy to announce the conclusion of Q4 2018 and the beginning of our Q1 2019 funding round where we are funding Aleph and Neanderthal. These are the final progress reports for projects Datascript and Kaocha. Special thanks to Nikita and Arne for all your hard work!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>Hello CT Community -</p>
<p>We are happy to announce the conclusion of Q4 2018 and the beginning of our Q1 2019 funding round where we are funding Aleph and Neanderthal. These are the final progress reports for projects Datascript and Kaocha. Special thanks to Nikita and Arne for all your hard work!</p>
<h2 id="datascript-update">Datascript update</h2>
<h3 id="extend-query-language">Extend query language</h3>
<ul>
<li>Completed an implementation of or/or-join/not/not-join predicates in Datascript datalog and accompanying 0.17.1 release. The original ticket for this request was opened back in 2015, so it was about time that got fixed. It was also highly requested and probably one of the last things that was lacking in Datascript from Datomic API.</li>
<li>Support <code>:as</code> in Pull API an attr-with-opts syntax (<a href="https://github.com/tonsky/datascript/issues/270">#270</a>, PR <a href="https://github.com/tonsky/datascript/pull/271">#271</a>, thx @Jumblemuddle)</li>
<li>Support idents expansion (PR <a href="https://github.com/tonsky/datascript/pull/245">#245</a>, thx bamarco)</li>
<li>Calling transaction fns through idents directly (PR <a href="https://github.com/tonsky/datascript/pull/185">#185</a>, thx @refset)</li>
</ul>
<h3 id="optimizing-query-execution-speed">Optimizing query execution speed</h3>
<p>BTreeSet is a foundation of DataScript. Getting faster implementation will automatically improve everything: lookups, queries, transactions, serialization etc.</p>
<p>Transient BTreeSet will further improve transactions speed, taking advantage of the fact that database is not exposed to external observers during single transaction, meaning we can mutate some things in place and save a lot on CPU and GC time.</p>
<p>So far results are quite promising, with transact up to 6x times faster than before on JVM. I also developed a custom benchmark suite to compare different implementation strategies against each other.</p>
<p>All research is already in DataScript repo. What’s left before those gains are available for DataScript users is some massaging to get it to play nice with Clojure (implement required interfaces etc). I scheduled this work to be completed in the first week of February.</p>
<h3 id="miscellaneous">Miscellaneous</h3>
<ul>
<li>Extensive docstrings for most core functions, published at <a href="https://cljdoc.org/d/datascript/datascript">https://cljdoc.org/d/datascript/datascript</a></li>
<li>Move AOTed builds to separate artifacts (related: #241, #279, #280)</li>
<li>Implement <code>clojure.data/diff</code> on <code>datascript/DB</code> (#281)</li>
<li>Drop Clojure 1.7 and 1.8 support</li>
<li>Fix externs.js syntax (PR #216, thx @thheller)</li>
<li>JS API correctly handles nested maps with <code>{&quot;:db/id&quot;}</code> in transactions (#228, thx @serebrianyi)</li>
<li>Made Clojure 1.10 the default build target.</li>
<li>Adopted Kaocha test runner.</li>
<li>Fixed four minor reported issues, <a href="https://github.com/tonsky/datascript/issues/285">#285</a>, <a href="https://github.com/tonsky/datascript/issues/287">#287</a>, <a href="https://github.com/tonsky/datascript/issues/283">#283</a>, <a href="https://github.com/tonsky/datascript/issues/289">#289</a>.</li>
<li>Did a bit of research of different implementation strategies and developed faster JVM BTreeSet implementation with transient support.</li>
</ul>
<h2 id="kaocha-update">Kaocha Update</h2>
<p>A lot has happened these last two weeks. There&rsquo;s also been an uptick in activity on Github and Slack, which I&rsquo;m very happy about. It&rsquo;s going to take a village to deliver Kaocha&rsquo;s full potential. I&rsquo;ve converted most of my personal notes into Github issues so people can see what&rsquo;s going, and jump in if they feel so inclined.</p>
<p>Watch mode has seen a big overhaul to address several issues with it, and
implement some features that were requested. It will report much more clearly on
syntax errors, and it now watches and reloads your <code>tests.edn</code>, so you can add
plugins and change configuration on the fly.</p>
<p>Pressing enter will cause a full reload and re-run, and you can now configure
glob patterns to be ignored, so e.g. temporary files from your editor don&rsquo;t
trigger a reload.</p>
<p>There are several new plugins included. One is a &ldquo;version-filter&rdquo;, this lets you specify with metadata that tests require a certain minimum or maximum version of Clojure and/or Java. If the current version being used falls outside that range than the test is skipped. This is especially useful for open source projects that want to target a wide range of Clojure and Java versions, and need to account for differences in behavior across these platforms.</p>
<p>The notifier plugin integrates Kaocha with your system notifications, so a
bubble pops up whenever a test run passes or fails. Ryan McCuaig implemented the
first version as a hook function, I converted it to a plugin and made it
configurable. I&rsquo;ve been using it non-stop since then, it works really great with
<code>--watch</code>.</p>
<p>A binding plugin got added, so you can configure dynamic vars directly from
<code>tests.edn</code>. Eventually I decided to roll this functionality into Kaocha itself,
to make sure it integrates on all levels. This can now also be used to configure
Kaocha&rsquo;s stacktrace filtering, which before was hard coded.</p>
<p>I also addressed a bunch of smaller usability issues. The randomization seed now only gets printed when a test run fails. The <code>:kaocha.plugin</code> namespace is now implied when configuring plugins, so built-in plugins can be enabled with less typing. A few other configuration keys have been given similar shorthands.</p>
<p><code>--focus-meta</code> will now be ignored if no tests with the given metadata are found. This means you can leave a certain focus tag configured, and use it when you need to.</p>
<p>The Cucumber integration has been updated to be compatible with the latest cucumber-jvm.</p>
<p>Kaocha-junit-xml will now also render errors that happen at higher levels in the testable hierarchy. Certain things like syntax errors cause a test failure on the test suite level, rather than on the test var levels, which before wasn&rsquo;t visible in the junit.xml output.</p>
<p>To round off I&rsquo;d like to mention a few outside contributions. Daniel Compton improved the error when a plugin can&rsquo;t be found, Magnar Sveen added a new <code>pre-report</code> hook that can be used by plugins, and then used it to implement <a href="https://github.com/magnars/kaocha-noyoda">kaocha-noyoda</a>. Michiel Borkent implement a <a href="https://github.com/borkdude/speculative-kaocha-plugin">kaocha plugin for Speculative</a>. Please keep them coming! I&rsquo;d be more than happy to review and help out with pull requests! A number of issues have been labeled as &ldquo;good first issue&rdquo;, these are fairly small and self contained issues that can provide a good introduction to the Kaocha codebase.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2019 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q1-2019-funding-announcement/</link>
      <pubDate>Wed, 23 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2019-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q1 of 2019 (February-April) we are funding two projects: Neanderthal with Dragan Djuric, and Aleph with Oleksii Kachaiev.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q1 of 2019 (February-April) we are funding two projects: <a href="https://neanderthal.uncomplicate.org">Neanderthal</a> with Dragan Djuric, and <a href="https://aleph.io">Aleph</a> with Oleksii Kachaiev.</p>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This funding cycle is our fifth. Previously we have supported <a href="https://github.com/tonsky/datascript">datascript</a>, <a href="https://github.com/lambdaisland/kaocha">kaocha</a>, <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, and <a href="http://www.cider.mx/en/latest/">CIDER</a>.</p>
<h2 id="funding-details">Funding details</h2>
<p>We&rsquo;re still working on funding details for this quarter and will update this post and announce the amounts once they are finalised.</p>
<p><strong>Update</strong>: We are very happy to announce that due to the growth in member support, particularly over the last few months of 2018, we have been able to increase our support for projects from $5,400 over three months ($1,800/mo), to $9,000 over three months ($3,000/mo).</p>
<h2 id="neanderthal">Neanderthal</h2>
<p>Neanderthal is a fast native-speed matrix and linear algebra library written in Clojure. Matrices and linear algebra are the infrastructure for high performance scientific software, including machine learning. Dragan is going to be working on adding higher-level tutorials that give people the bigger picture and shows them good practices.</p>
<h3 id="dragans-plans-for-the-next-three-months-are">Dragan&rsquo;s plans for the next three months are:</h3>
<ul>
<li>Writing an introductory series Deep Learning from the ground up with Clojure (a companion to <a href="http://neuralnetworksanddeeplearning.com/">Neural Networks and Deep Learning</a> but with Clojure + Neanderthal + CPU + GPU)</li>
<li>Trying (and I hope succeeding) to integrate Nvidia&rsquo;s cuSolver into Neanderthal&rsquo;s CUDA GPU engine (provides some key LAPACK functions that are currently only available on the CPU)</li>
<li>Working on promoting Neanderthal and the Uncomplicate suite of libraries in the non-Clojure programming/ML community</li>
<li>General improvements to the documentation and tutorials for Neanderthal</li>
<li>General bug fixes and improvements to the Neanderthal suite of libraries</li>
</ul>
<h2 id="aleph">Aleph</h2>
<p>Aleph is one the best options for creating high-performance communication systems in Clojure, including but not limited to HTTP &amp; websocket clients &amp; servers. It is based on <a href="https://netty.io">Netty</a>, a high performance network application framework. A partial list of projects/companies who rely on Aleph to be maintained can be found at <a href="https://github.com/ztellman/aleph/issues/450">ztellman/aleph#450</a>.</p>
<p>Development of Aleph also has an impact on the entire server-side libraries ecosystem, including direct influence by backporting bug fixes to such projects like clj-http (Clojure), Netty (Java) and potentially Ring (Clojure); and indirect influence by pushing boundaries and expending interest in the field.</p>
<h3 id="oleksiis-plans-for-the-next-three-months-are">Oleksii&rsquo;s plans for the next three months are:</h3>
<ul>
<li>Stabilize and release a new version with latest development (quite a few new features)</li>
<li>Tweak internals of the library and interactions with Netty to ease operational burden, to improve performance and to make sure Aleph can stay robust in all use cases</li>
<li>Adding missing parts of the websocket protocol (pings, issues with resources cleanup)</li>
<li>Dealing with large requests (100-continue handling, finishing multipart upload for client/server, safety limitations &amp; timeouts, client-level decompress)</li>
<li>Tests coverage for tricky features (requests pipelining, read-level backpressure)</li>
<li>Operational improvements (connections management, graceful shutdown)</li>
<li>SSL-related improvements (better way to manage contexts, SNI)</li>
<li>Adding a more stable way for handling errors &amp; error responses</li>
<li>Other bug fixes and improvements from <a href="https://github.com/ztellman/aleph/issues">https://github.com/ztellman/aleph/issues</a></li>
</ul>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied this quarter were (in alphabetical order):</p>
<ul>
<li>Aleph</li>
<li>Boot</li>
<li>Calva</li>
<li>Form Validator CLJS</li>
<li>Hoplon</li>
<li>Klipse</li>
<li>A fork of Light Table</li>
<li>Neanderthal</li>
<li>Shadow CLJS</li>
</ul>
<h2 id="q1-2019-funding">Q1 2019 Funding</h2>
<p>We had a bunch of great applications from great projects; we would have liked to fund several more projects if we had the money. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, you can re-use that application to <a href="/open-source/">apply</a> for Q1 2019. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>December 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/december-2018-monthly-update/</link>
      <pubDate>Wed, 16 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/december-2018-monthly-update/</guid>
      <description>Thanks again to those who participated in our Q1 2019 survey, we greatly value your feedback.
Project applications for our Q1 2019 round close on 15th Jan, midnight PST. The selections will be announced shortly afterwards. The Q1 2019 projects will start on February 1.
This month we have updates again from Datascript and Kaocha.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>Hello all!</p>
<p>Thanks again to those who participated in our <a href="https://www.clojuriststogether.org/news/q1-2019-survey-results/">Q1 2019 survey</a>, we greatly value your feedback.</p>
<p>Project <a href="https://www.clojuriststogether.org/open-source/">applications</a> for our Q1 2019 round close on 15th Jan, midnight PST. The selections will be announced shortly afterwards. The Q1 2019 projects will start on February 1.</p>
<h2 id="datascript-update">Datascript update</h2>
<p>The most noticeable thing that happened in December so far is an implementation of or/or-join/not/not-join predicates in Datascript datalog and accompanying 0.17.1 release. The original <a href="https://github.com/tonsky/datascript/issues/50">ticket</a> for this request was opened back in 2015, so it was about time that got fixed. It was also highly requested and probably one of the last things that was lacking in Datascript from Datomic API. Well, now it’s there, feel free to use it. I also added/merged <a href="https://github.com/tonsky/datascript/pull/245">support for idents expansion</a>, and the <a href="https://github.com/tonsky/datascript/commit/34c122e0b5192bb58a797137fbb1f6bd1b236e6d">ability to call transaction fns through idents directly</a>.</p>
<p>I’m pacing my work unevenly, so nothing much happened in DataScript in second half of December. I started experimenting with persistence API and best datastructures for that, but that’s about it. Most of the action will be happening in January.</p>
<h2 id="kaocha-update">Kaocha Update</h2>
<p>Kaocha-cljs saw it&rsquo;s first official release last week! This is a major milestone
in Kaocha&rsquo;s mission to be a universally applicable test tool. So far it&rsquo;s tested
with Nodejs and using a browser REPL as the backend, although in theory any
environment that can provide a ClojureScript REPL can be used to execute the
actual tests.</p>
<p>The general coordinating and reporting of the test run still happens on the
Clojure side, as with other Kaocha test types, so that you can use your existing
Kaocha reporters and plugins and use them with ClojureScript.</p>
<p>kaocha-cloverage has been split out of the main kaocha artifact and into its own
project, which received two bugfix releases these past two weeks.</p>
<p>Kaocha itself also saw three new releases with a combination of bugfixes,
supporting code for the ClojureScript test type, and improvements. A small but
nice touch is that an equality assertion with only one value is now considered a
failure.</p>
<p>I find it&rsquo;s quite easy to get your parentheses wrong and write something like
this, which trivially passes.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">is</span> (= <span style="color:#e6db74">:this-doesnt-test-anything</span>) (keyword <span style="color:#e6db74">&#34;this-doesnt-test-anything&#34;</span>))
</code></pre></div><p>This is similar to the existing feature where a test without assertions is
considered a failure.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure">(<span style="color:#a6e22e">deftest</span> keyword-test
  (= <span style="color:#e6db74">:this-doesnt-test-anything</span> (keyword <span style="color:#e6db74">&#34;this-doesnt-test-anything&#34;</span>)))
</code></pre></div><p>Kaocha-cucumber saw two releases with a combination of bug fixes and ergonomic
improvements.</p>
<ul>
<li>The test identifiers are now based on the feature and scenario names, rather than on line numbers.</li>
<li>In case of failures or when using the documentation reporter it&rsquo;s more clear which feature/scenario executed.</li>
<li>Cucumber tags on features are converted to metadata so they can be used for filtering.</li>
<li>Loaded step definitions are cached, so in case of watch or repl use you get a nice speedup.</li>
</ul>
<p>Finally Kaocha-junit-xml saw two smaller releases, one to address a compatibility issue with Kaocha-cucumber.</p>
<p>The big thing for this period has been the first release of Boot integration for
Kaocha. With that addition the three major Clojure tools (Leiningen, Boot,
Clojure CLI) are all supported.</p>
<p>For the main part this works identically to Kaocha on Leiningen or Clojure CLI,
accepting the same command line arguments and <code>tests.edn</code> configuration, and
producing the same output.</p>
<p>One difference is that command line options that are added by plugins can&rsquo;t be
used directly, due to constrains posed by Boot&rsquo;s <code>deftask</code>. To work around this
kaocha-boot accepts a new <code>--options</code> flag which takes an EDN map of additional
options.</p>
<p>Kaocha now also includes a TAP (test anything protocol) reporter function. This
was requested early on, and should make Kaocha usable in a greater number of
CI/automation scenarios.</p>
<p>The junit.xml output has been improved (again), to provide clearer failure
messages.</p>
<p>Kaocha-cljs now captures the exception type and message on the JavaScript side,
so these can be accurately reported by Kaocha&rsquo;s (Clojure/JVM-based) reporter
functions, or plugins like kaocha-junit-xml.</p>
<p>A few smaller improvements have been added to Kaocha. The <code>--help</code> output no
longer assumes you are using Clojure CLI. The <code>--print-invocations</code> plugin&rsquo;s
output has been tidied up by not adding a redundant <code>--config-file tests.edn</code>,
an issue with incorrect file/line reporting on Java9+ has been addressed, and an
extra <code>--print-env</code> option has been added to the <code>kaocha.plugin.alpha/info</code>
plugin, which prints out the Clojure and Java/JVM version in use.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2019 Survey Results and Call for Proposals</title>
      <link>https://www.clojuriststogether.org/news/q1-2019-survey-results-and-call-for-proposals/</link>
      <pubDate>Wed, 09 Jan 2019 08:30:50 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2019-survey-results-and-call-for-proposals/</guid>
      <description>Happy New Year Clojurists Together community!
Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter.
Project applications for our Q1 2019 round close on 15th Jan, midnight PST. The selections will be announced shortly afterwards. The Q1 2019 projects will start on February 1.</description>
      <content:encoded><![CDATA[<p>Happy New Year Clojurists Together community!</p>
<p>Thanks so much for your support and feedback in the latest survey. We value your opinions and always take suggestions into account as we make changes from quarter to quarter.</p>
<p>Project <a href="https://www.clojuriststogether.org/open-source/">applications</a> for our Q1 2019 round close on 15th Jan, midnight PST. The selections will be announced shortly afterwards. The Q1 2019 projects will start on February 1.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 67 respondents to the survey, up from 56 in the last survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 61 (97%)</li>
<li>ClojureScript - 51 (82%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (94%)</li>
<li>ClojureScript Browser (74%)</li>
<li>ClojureScript Node Server (20%)</li>
<li>ClojureScript Mobile (18%)</li>
<li>Clojure JVM Client (15%)</li>
<li>ClojureScript Desktop Application (8%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things people were interested in: developer experience tools (55%), build tooling (52%), documentation (49%), error messages (44%), IDE support (35%), test tooling (30%), linters (30%), data analysis/processing framework (26%).</p>
<p>If you work on any of these kinds of projects, please look at applying for funding.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<p>CIDER, Clojure.spec, Re-frame, REPLs, Leiningen, Hiccup, Reagent, Aleph, Re-natal, Figwheel, LightTable, Datahike were all mentioned several times.</p>
<p>If you&rsquo;re a maintainer of any of these projects, please consider applying.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>About half of the respondents to this question had seen direct benefits, and half hadn&rsquo;t.</p>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>80% of respondents wanted us to fund a mix of established and speculative projects, and 20% wanted us to only fund established projects. This is roughly the same as our Q4 2018 survey. In Q3 2018 the mix was 70/30.</p>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Communication &amp; Community Updates</li>
<li>Democracy in project selection</li>
<li>Transparency</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Funding models and exploring different project time amounts</li>
<li>Organisation promotion</li>
<li>More collaboration with the greater Clojure community</li>
</ul>
<p>We have plans to explore different project funding models in future rounds. Due to the Christmas holidays we didn&rsquo;t have time for it this round. If you have any specific suggestions of funding models or durations you&rsquo;d like us to consider, please get in touch.</p>
<p>If you&rsquo;d like to see more companies sponsor Clojurists Together, please reach out to them and encourage them to join.</p>
<p>Thanks!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>November 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/november-2018-monthly-update/</link>
      <pubDate>Wed, 12 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/november-2018-monthly-update/</guid>
      <description>We are happy to close the month of November with a successful start to the fourth quarter at Clojurists Together. Our Q4 projects, Datascript and Kaocha, are well on their way.
In November we elected new board members at CT- thanks to everyone who participated in the elections. A warm welcome to Nola Stowe, Fumiko Hanreich, and Laurens Van Houtven!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>We are happy to close the month of November with a successful start to the fourth quarter at Clojurists Together. Our Q4 projects, Datascript and Kaocha, are well on their way.</p>
<p>In November we elected new board members at CT- thanks to everyone who participated in the elections. A warm welcome to Nola Stowe, Fumiko Hanreich, and Laurens Van Houtven!</p>
<p>We are proud to say that this year at ClojureConj, we had our own stall! Thanks to CT friend and board member, Bridget, for your efforts.</p>
<p><img src="/images/ClojureConj.jpg" alt="ClojureConj"></p>
<p>Special thanks to Erik Assum for the shoutout to Clojurists Together in his talk at <a href="https://skillsmatter.com/skillscasts/12774-are-you-writing-java-in-clojure">Clojure eXchange 2018</a> recently.</p>
<p><img src="/images/CTNov2018.jpg" alt="CTNov2018"></p>
<h2 id="datascript-update">Datascript update</h2>
<p>I spent most of November working on docstrings and long-overdue PRs and issues. At a glance:</p>
<ul>
<li>23 commits</li>
<li>3 released versions</li>
</ul>
<h4 id="0168">0.16.8</h4>
<ul>
<li>Extensive docstrings for most core functions, published at <a href="https://cljdoc.org/d/datascript/datascript">https://cljdoc.org/d/datascript/datascript</a></li>
</ul>
<h4 id="0169">0.16.9</h4>
<ul>
<li>Move AOTed builds to separate artifacts  (related: #241, #279, #280)</li>
</ul>
<h4 id="0170">0.17.0</h4>
<ul>
<li>Implement <code>clojure.data/diff</code> on <code>datascript/DB</code> (#281)</li>
<li>Drop Clojure 1.7 and 1.8 support</li>
<li>Fix externs.js syntax (PR #216, thx @thheller)</li>
<li>Support <code>:as</code> in Pull API an attr-with-opts syntax (#270, PR #271, thx @Jumblemuddle)</li>
<li>Support idents expansion (PR #245, thx bamarco)</li>
<li>JS API correctly handles nested maps with <code>{&quot;:db/id&quot;}</code> in transactions (#228, thx @serebrianyi)</li>
<li>Calling transaction fns through idents directly (PR #185, thx @refset)</li>
</ul>
<p>I’m looking at query OR/NOT predicates as my next target.</p>
<h2 id="kaocha-update">Kaocha Update</h2>
<h3 id="nov-1---15">Nov. 1 - 15</h3>
<p>It&rsquo;s been a busy two weeks! My initial focus has been on things
that improve Kaocha&rsquo;s own development process, as well as usability
improvements.</p>
<p>A first step was to implement the Ant JUnit XML format. This is a (somewhat)
standardized format to provide information about which tests ran, what their
results were, how long they took, etc. Many Continuous Integration tools can
parse this format to provide rich metrics.</p>
<p>Kaocha&rsquo;s own tests are run by CircleCI, which becomes a lot more useful when
provided with a junit.xml report.</p>
<p>This feature is available as a plugin: <a href="https://github.com/lambdaisland/kaocha-junit-xml">lambdaisland/kaocha-junit-xml</a>.</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">bin/kaocha --plugin junit-xml --junit-xml-file report.xml
</code></pre></div><p>I also wanted to get some insight into Kaocha&rsquo;s own test coverage. Despite
working on test tooling I&rsquo;m not always disciplined enough to immediately write
exhaustive tests, and I too suffer from the Clojure curse of developing things
at the REPL and not going the extra mile of converting those expressions into
tests.</p>
<p>Gamefication to the rescue! I integrated Kaocha with
<a href="https://github.com/cloverage/cloverage">Cloverage</a>, which will measure which
forms and lines are evaluated during a test run. The integration is again a
plugin, which allows you to configure Cloverage either with command line
options, or through <code>tests.edn</code></p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-clojure" data-lang="clojure"><span style="color:#f92672">#</span>kaocha/v1
{<span style="color:#e6db74">:plugins</span> [kaocha.plugin/cloverage]
 <span style="color:#e6db74">:cloverage/opts</span>
 {<span style="color:#e6db74">:output</span> <span style="color:#e6db74">&#34;target/coverage&#34;</span>
  <span style="color:#e6db74">:codecov</span> true
  <span style="color:#e6db74">:low-watermark</span> <span style="color:#ae81ff">70</span>}}
</code></pre></div><p>With this in place I managed to set up <a href="http://codecov.io/">codecov.io</a>, which
keeps track of how coverage evolves, as well as providing colorful badges for
the README.</p>
<p>The Cloverage plugin is currently still included in the main Kaocha repository
but will be split out soon. In general plugins that require extra dependencies
will be separate projects, so people who don&rsquo;t use them don&rsquo;t pay the cost.</p>
<p>Finally I implemented a <a href="https://docs.cucumber.io/">Cucumber</a> test type. This is
the first fully supported test type after clojure.test. With Cucumber you write
your tests in lightly marked up natural language. It&rsquo;s a bit of an oddity, and
can invoke <a href="https://twitter.com/andreiursan/status/1058181414603104256">strong reactions</a>, but it&rsquo;s
quite popular in some circles.</p>
<p>Cucumber will be powering Kaocha&rsquo;s integration (or &ldquo;feature&rdquo;) tests. Before
these were written as directories with a bunch of text files like <code>args</code>, <code>out</code>,
and <code>err</code>, which were used by a shell script to invoke Kaocha and diff the
output. With Cucumber the result <a href="https://github.com/lambdaisland/kaocha/blob/eb984b796157b21d19dca05f9c585d434e747310/test/features/command_line/fail_fast.feature">is a single file</a>
which acts as a form of executable documentation. The Ruby testing tool RSpec
uses this with great results, when you look <a href="https://relishapp.com/rspec/rspec-core/v/3-8/docs/command-line/failure-exit-code-option-exit-status">at their docs</a>
you hardly realize you&rsquo;re also looking at their integration tests.</p>
<p>Finally I made some changes to <a href="https://github.com/lambdaisland/kaocha/issues/14">improve startup time</a>, and minor usability
improvements, like allowing plugins in the <code>kaocha.plugin</code> namespace to be
specified without a namespace prefix</p>
<pre><code># before
bin/kaocha --plugin kaocha.plugin/print-invocations
# after
bin/kaocha --plugin print-invocations
</code></pre><h3 id="nov-16---30">Nov. 16 - 30</h3>
<p>After the flying start of the first two weeks, these past two weeks have been
about consolidating the work done so far, fixing issues and polishing up the
handful of plugins and test formats that are already available.</p>
<p>The output of the JUnit.xml plugin has been tightened up. Originally it was only
tested on CircleCI, but a user reported the Azure Devops Pipeline didn&rsquo;t like
the output it was generating. This was in part due to <code>clojure.xml/emit</code> not
doing any escaping, so it was extremely easy to generate invalid XML.</p>
<p>I learned some new things about XML along the way and made sure the output is
always compliant with JUnit.xml&rsquo;s XSD schema.</p>
<p>Kaocha is also starting to see contributions, just today an issue was fixed in
Kaocha&rsquo;s Cloverage (code coverage) plugin. (Thanks Ryan!)</p>
<p>I improved the Cucumber support as part of converting Kaocha&rsquo;s integration tests
to Cucumber, so that the user gets better feedback when tests have syntax errors.</p>
<p>But the big thing these last two weeks has been the work on ClojureScript
support. Part of Kaocha&rsquo;s vision is to have a single tool that you can drop into
your project, so you can comfortably run both Clojure and ClojureScript tests
with little to no configuration, local or on CI, without having to learn a
second tool.</p>
<p>To accomplish this, kaocha-cljs spins up a ClojureScript runtime environment in
the background, and sends forms to it which load and run your tests. This
results in events from <code>cljs.test</code> (things like <code>:begin-test-var</code>, <code>:fail</code>,
<code>:pass</code>, &hellip;) which are intercepted and sent back to Kaocha in realtime via a
websocket.</p>
<p>There are two asynchronous streams of events involved, one coming from the
ClojureScript (p)repl interface which provides printed output and return values,
and one with test events coming from the websocket. It&rsquo;s a fairly complex thing
to implement, and something I was hoping to get funding for, so I&rsquo;m very happy
Clojurists Together is giving me this opportunity.</p>
<p>As of today I was able to run the first ClojureScript tests through Kaocha. It&rsquo;s
really a prototype at this point with plenty of loose ends to tie up, but it&rsquo;s a
milestone nevertheless. I&rsquo;m more confident now that Kaocha will be able to
deliver a solid and reliable testing experience for ClojureScript.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2018 Committee Election Results</title>
      <link>https://www.clojuriststogether.org/news/2018-committee-election-results/</link>
      <pubDate>Fri, 30 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2018-committee-election-results/</guid>
      <description>Clojurists Together has held our first election for people to serve on the committee. The members of Clojurists Together have elected Nola Stowe, Fumiko Hanreich, and Laurens Van Houtven.</description>
      <content:encoded><![CDATA[<p>Clojurists Together has held our first election for people to serve on the committee. The members of Clojurists Together have elected Nola Stowe, Fumiko Hanreich, and Laurens Van Houtven.</p>
<p>The full election results are available on the <a href="https://civs.cs.cornell.edu/cgi-bin/results.pl?num_winners=3&amp;id=E_fa794181357a98c8&amp;algorithm=runoff">civs voting service</a>. Laurens Van Houtven and Vijay Kiran were in a dead heat for third place, so we held a <a href="https://www.random.org/draws/details/?draw=80561">runoff</a> with random.org, as we said we would in our <a href="/news/2018-committee-election-candidates/">announcement</a>.</p>
<p>We had 76 votes cast of 193 eligible voters, a turnout rate of 39%. Thanks to everyone who voted.</p>
<p>We&rsquo;d like to thank everyone who stood for election. I heard from many people how impressed they were with the high quality of candidates. Lastly, thanks to all of the members of Clojurists Together. I&rsquo;m really proud of what we&rsquo;ve been able to achieve this year with your support. I look forward to the year ahead.</p>
<p>- Daniel Compton and the Clojurists Together committee.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2018 Committee Election Candidates</title>
      <link>https://www.clojuriststogether.org/news/2018-committee-election-candidates/</link>
      <pubDate>Thu, 15 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/2018-committee-election-candidates/</guid>
      <description>Thanks to everyone who applied to join the Clojurists Together Committee. Here we present the nine candidates, their motivations for joining, and a brief biography so you can learn a little bit about each one. The candidates are (in a randomised order): Nola Stowe, Laurens Van Houtven, Vijay Kiran, Nicolas Modryzk, Ghadi Shayban, Ikuru Kyogoku John Stevenson, Travis McNeill, and Fumiko Hanreich.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is holding its first annual elections for community elected committee members. Thanks to everyone who applied to join the Clojurists Together Committee. Here we present the nine candidates, their motivations for joining, and a brief biography so you can learn a little bit about each one. If you&rsquo;re a Clojurists Together member, you should have recently received an email with your link to vote with <a href="https://civs.cs.cornell.edu">CIVS</a>, an online election voting system. Only Clojurists Together members as of the 14th November 2018 are eligible to vote. Every member gets one vote.</p>
<p>Voting will be open until end of day Wednesday 28th November, 2018 PST. Election results will be announced shortly afterwards. The poll results will use Condorcet IRV (instant runoff). In the case of a tie on the cutoff point, the tie will be broken with <a href="https://www.random.org/draws/">random.org/draws</a>, a third-party drawing service. There are three seats open for election this year. The remaining four seats will come up for election next year. Committee members are elected for a two year term.</p>
<p>The candidates are (in a randomised order): Nola Stowe, Laurens Van Houtven, Vijay Kiran, Nicolas Modryzk, Ghadi Shayban, Ikuru Kyogoku, John Stevenson, Travis McNeill, and Fumiko Hanreich.</p>
<p>Thanks to everyone who applied, we really appreciate it.</p>
<h2 id="candidate-profiles">Candidate Profiles</h2>
<h3 id="nola-stowe---cisco">Nola Stowe - Cisco</h3>
<p><a href="http://www.rubygeek.com">Website</a>,
<a href="http://www.twitter.com/clojuregeek">@clojuregeek</a></p>
<h4 id="why-theyd-like-to-join">Why they&rsquo;d like to join</h4>
<p>Because I like seeing open source projects get funding. I&rsquo;m a woman and like to see that the committee has lots of perspectives. An avid user of many of the past projects that was funded.</p>
<h4 id="bio">Bio</h4>
<p>Nola Stowe is a Software Engineer at Cisco Systems in the Security Business Group. She has over 16 years software experience and loves Clojure the most. She blogs at <a href="http://www.rubygeek.com">rugygeek.com</a> about Clojure and other things of interest.</p>
<h3 id="laurens-van-houtven-lvh---latacora">Laurens Van Houtven (lvh) - Latacora</h3>
<p><a href="https://github.com/lvh">GitHub</a>,
<a href="https://twitter.com/lvh">@lvh</a></p>
<h4 id="why-theyd-like-to-join-1">Why they&rsquo;d like to join</h4>
<p>I have personal experience with the Python Software Foundation and the Software Freedom Conservancy. I&rsquo;m an information security engineer, so I may be able to assist projects as well as Clojurists Together itself to improve its operational security posture.</p>
<h4 id="bio-1">Bio</h4>
<p>I&rsquo;m an information security person. My background is in cryptography, but these days I mostly focus on cloud infrastructure, though I do a ton of IT security and application security as well. I&rsquo;m a Principal and co-founder at Latacora, where we specifically bootstrap information security practices for startups.</p>
<p>I&rsquo;ve been using Clojure for over five years now, both personally and professionally. I&rsquo;ve been a Fellow of the Python Software Foundation for about a decade, and have been heavily involved in PyCon organization in particular. PyCon is an annual Python conference of about 3500 people, for which I managed the Financial Aid program for several years. I expect this experience will help me to successfully serve on the Clojurists Together board. (Psst! Wanna know a secret? The PyCon financial aid process was briefly entirely dependent on a piece of Clojure code to do hotel room assignments.)</p>
<p>In my spare time, I do woodworking and miscellaneous makery things (CNC plasma cutters and lasers, that sort of thing). I have an adorable mutt named Enzo (after Ferrari). I live in and generally adore Chicago.</p>
<h3 id="vijay-kiran">Vijay Kiran</h3>
<p><a href="http://vijaykiran.com/">Website</a>,
<a href="http://twitter.com/vijaykiran">@vijaykiran</a></p>
<h4 id="why-theyd-like-to-join-2">Why they&rsquo;d like to join</h4>
<p>I have been Clojure enthusiast for several years now and interested in helping out the eco-system. I firmly believe in the way Clojurists Together is supporting and funding the projects to keep Clojure flourishing. I would like help out in continuing the objectives of the organisation that helps the clojure community.</p>
<h4 id="bio-2">Bio</h4>
<p>Vijay Kiran is a software developer with 16 years of product development and consulting experience using JVM languages (Java, Clojure, Scala). He&rsquo;s a co-organiser of Dutch Clojure Days and co-host of defn podcast.</p>
<h3 id="nicolas-modrzyk---karabiner-software">Nicolas Modrzyk - Karabiner Software</h3>
<p><a href="https://github.com/hellonico/">GitHub</a></p>
<h4 id="why-theyd-like-to-join-3">Why they&rsquo;d like to join</h4>
<p>Started Clojure in 2011, long experience running and maintaining healthy Clojure project. I love concise, expressive and passionate code, I expect the same in people too!</p>
<h4 id="bio-3">Bio</h4>
<p>Nico has gathered the best of all countries he has lived in, Powerful French wines straight from the cradle, deep taste Guinness from Ireland, Tasty Curry from India, Chinese dumplings and ducks in China, and Japanese Sushi at the finger for the last few years.</p>
<p>International Geek, focusing on getting the job right and done, loves to push friends and team members to give their best to start and reach the goal.
Nico has been involved into designing large scales server applications for a video conferencing company, managing enormous gigantic clusters of databases through hand written middleware, boosting Japanese design companies with Content Management and Process Management systems, pushing the boundaries of Business Processes for Leading Financial Asia Businesses, and now enjoying independent consulting around the world.</p>
<p>During his spare times, write books, play live music and looking forward to some great project together.</p>
<h3 id="ghadi-shayban---healthfinch">Ghadi Shayban - Healthfinch</h3>
<h4 id="why-theyd-like-to-join-4">Why they&rsquo;d like to join</h4>
<p>I have spent a long time in the community and am intimately familiar with its strengths and weaknesses, and possess the sensitivities required to know where to direct resources.</p>
<h4 id="bio-4">Bio</h4>
<p>Ghadi Shayban is an engineer, pianist, and long-time community contributor. Over the years he has spent many hours teaching and evangelizing Clojure, and has worked on compiler, data structures and runtime, and core.async.</p>
<h3 id="ikuru-kyogoku---parkside-securitiesxcoo">Ikuru Kyogoku - Parkside Securities/Xcoo</h3>
<h4 id="why-theyd-like-to-join-5">Why they&rsquo;d like to join</h4>
<p>I spend a good chunk of my life just staring at twitter/reddit for Clojure updates. I have a breadth of insights from working for several companies that are Clojure OSS consumers, both server side and client side.</p>
<h4 id="bio-5">Bio</h4>
<p>Ikuru is a Clojure/ClojureScript developer working for several companies. He is always excited to see innovation happening in the Clojure Ecosystem, and firmly believes that is supported by a core that is committed to stability.</p>
<h3 id="john-stevenson">John Stevenson</h3>
<p><a href="jr0cket.co.uk">Website</a>,
<a href="https://twitter.com/jr0cket">@jr0cket</a>,
<a href="https://practicalli.github.io">Online Clojure guides</a>,
<a href="https://clojurebridgelondon.github.io">ClojureBridge London</a></p>
<h4 id="why-theyd-like-to-join-6">Why they&rsquo;d like to join</h4>
<p>I would like to support the continued growth in adoption of Clojure worldwide, building on my efforts running the London Clojurians community and ClojureBridge London events.</p>
<h4 id="bio-6">Bio</h4>
<p>A community driven developer who loves Clojure and functional programming. Worked with companies large and small over 20+ years in the industry, including Atlassian, Heroku/Salesforce, Citi, Dimension Data.</p>
<p>Currently leading the London Clojurian community and running several events per month. Also co-organises ClojureBridge London events several times per year.</p>
<p>I am currently writing an online book for Clojure development with Spacemacs with a supporting YouTube channel. I have also started a Clojure study group via YouTube and Slack.</p>
<h3 id="travis-mcneill---horizon-investments">Travis McNeill - Horizon Investments</h3>
<p><a href="https://github.com/Tavistock">GitHub</a></p>
<h4 id="why-theyd-like-to-join-7">Why they&rsquo;d like to join</h4>
<p>I want to help grow and nurture the Clojure community.</p>
<h4 id="bio-7">Bio</h4>
<p>Travis McNeill is a Software Engineer at Horizon Investments. He is interested in community development and making helping Clojure become more open.</p>
<h3 id="fumiko-hanreich">Fumiko Hanreich</h3>
<p><a href="https://twitter.com/fhanreich">@fhanreich</a></p>
<h4 id="why-theyd-like-to-join-8">Why they&rsquo;d like to join</h4>
<p>I have been programming in Clojure at work since 2012 and have been a user of various Clojure libraries. I believe Clojurists Together is such a great idea to support the Clojure community. I would like to contribute as a committee member and learn more about how the community can be better supported by the organization. I hope having no projects of my own would contribute to offer fair and unbiased opinions when it comes to decision making.</p>
<h4 id="bio-8">Bio</h4>
<p>Fumiko Hanreich is a Software Engineer and became a Clojurist at work in 2012. She enjoys writing software in Clojure ever since. She was a speaker at 2015 Clojure/West conference (HoneySQL as Clojure Data structures). She also served as an Opportunity Grant Committee member, a Selection Committee member, and a Conference Guide member at Clojure conferences.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Join the Clojurists Together Committee</title>
      <link>https://www.clojuriststogether.org/news/join-the-clojurists-together-committee/</link>
      <pubDate>Tue, 06 Nov 2018 15:38:04 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/join-the-clojurists-together-committee/</guid>
      <description>As we near the close of our first year at Clojurists Together, we are opening up elections for new committee positions. As part of our commitment to transparency and community governance, Clojurists Together holds annual elections. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors. This year, we had seven committee members:
 Toby Crawley Bridget Hillyer Maria Geller Devin Walters Daniel Solano Gómez Larry Staton Jr Daniel Compton (project leader)  Committee members are elected for a two-year term.</description>
      <content:encoded><![CDATA[<p>As we near the close of our first year at Clojurists Together, we are opening up elections for new committee positions. As part of our commitment to <a href="/transparency/">transparency</a> and community governance, Clojurists Together holds annual elections. The Committee is responsible for governing the projects, selecting which projects are sponsored, administering the projects, and interacting with sponsors. This year, we had seven committee members:</p>
<ul>
<li>Toby Crawley</li>
<li>Bridget Hillyer</li>
<li>Maria Geller</li>
<li>Devin Walters</li>
<li>Daniel Solano Gómez</li>
<li>Larry Staton Jr</li>
<li>Daniel Compton (project leader)</li>
</ul>
<p>Committee members are elected for a two-year term. Of the seven original committee members, four will stay on for the second year of a two-year term (Maria Geller, Daniel Solano Gómez, Larry Staton Jr, and Daniel Compton). The other three members will step down this year to create a staggered board.</p>
<p>If you are interested in standing for election, please fill out this <a href="https://docs.google.com/forms/d/e/1FAIpQLSeW9P_4Z5jon792l_63fAUzbAocG4D3tDIDWp30TCgobIduEg/viewform?usp=sf_link">form</a> by midnight end-of-day November 14, 2018 Pacific Time. If you can&rsquo;t access the form, <a href="/contact/">contact us</a>, and we can accept your nomination by email. Nominations are open to anyone, you don&rsquo;t have to be a Clojurists Together member to stand for election. You also don&rsquo;t have to have lots of experience with Clojure to apply. We want a committee made up of a cross-section of the Clojure community so that we have a wide range of perspectives when making decisions on which projects to fund.</p>
<p>The main responsibilities of a committee member are:</p>
<ul>
<li>Participate in the general discussions of the month-to-month running of the program</li>
<li>Evaluate and vote on which open source projects to fund</li>
<li>Help in decision making for the future plans of Clojurists Together</li>
</ul>
<p>These responsibilities take roughly one hour/month, though there are peaks and troughs of activity as we go through our quarterly funding cycle. If you have more time to offer, there are lots more things that need developing, automating, designing, e.t.c. It would be great to have you help out with those things, but we don&rsquo;t want to exclude people from standing because they don&rsquo;t have a lot of spare time.</p>
<p>Our non-profit home requires that we do not have more than two committee members from any one company. More than two people from a company can stand for election, but if more than two of these people were to be elected, only the top two ranked candidates would be elected and the other seats would go to the next most highly ranked candidates from other companies. If I you have any questions about this, please get in touch.</p>
<p>Elections will be held once the candidates are announced, and all Clojurists Together members will be eligible to vote.</p>
<p>Please share this with anyone you think would be able to represent the interests of the Clojure community and Clojurists Together members. Thanks for your support of Clojurists Together, we appreciate it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>October 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/october-2018-monthly-update/</link>
      <pubDate>Sun, 04 Nov 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/october-2018-monthly-update/</guid>
      <description>Clojurists Together News We are happy to close the month of October with a successful third quarter at Clojurists Together. Earlier this month, we announced our new project selections for Q4, Datascript and Kaocha.
Welcome to all of our new members that joined this month. Special thanks to new Filter company members Pitch, AdGoji, and Funding Circle. It&amp;rsquo;s because of your support that we can continue to grow at Clojurists Together.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together News</h2>
<p>We are happy to close the month of October with a successful third quarter at Clojurists Together. Earlier this month, we announced our <a href="https://www.clojuriststogether.org/news/q4-2018-funding-announcement/">new project selections</a> for Q4, Datascript and Kaocha.</p>
<p>Welcome to all of our new members that joined this month. Special thanks to new Filter company members <a href="https://pitch.com/">Pitch</a>, <a href="http://www.adgoji.com">AdGoji</a>, and <a href="https://www.fundingcircle.com/de/">Funding Circle</a>. It&rsquo;s because of your support that we can continue to grow at Clojurists Together.</p>
<p>There is a new part of our monthly newsletter and website, with job listings in the Clojure community. We&rsquo;ve partnered with our company Filter members to offer more career opportunities to our developer members. Check out the new <a href="https://www.clojuriststogether.org/jobs/">Jobs</a> page.</p>
<p>This month in listings, <a href="http://careers.pitch.io/p/e1ff8b25796e01-senior-backend-engineer">Senior Backend Engineer</a> at Pitch and <a href="http://careers.pitch.io/p/4977a65eeaea01-senior-frontend-engineer">Senior Frontend Engineer at Pitch</a>.</p>
<p>Last week we sent out an email to members about collecting addresses in order to send out CT stickers. If you want one and still haven&rsquo;t submitted your address, you can do so <a href="https://docs.google.com/forms/d/e/1FAIpQLSewql7CecP0beNQMV6YLlD-tjbvnQLtNcxkR7SGBojbk9juzQ/viewform?usp=sf_link">here</a> before Nov. 14th in order to receive a sticker in the first round of mail.</p>
<p>And finally, we are holding elections for new Clojurists Together committee members. More information <a href="https://www.clojuriststogether.org/news/2018-committee-nominations/">here</a>.</p>
<h2 id="clojurescript-update">ClojureScript update</h2>
<p>A lot of the work that Mike Fikes did on ClojureScript is part of a <a href="https://clojurescript.org/news/2018-11-02-release">new release of ClojureScript</a>, version 1.10.439. A big highlight is that compiler performance has been greatly improved, with projects sometimes seeing a 2x speed-up. There is also some really interesting work with supporting a Graal.js REPL environment. Thanks Mike!</p>
<h2 id="cljdoc-update">cljdoc Update</h2>
<p>Hey again dear Clojurists Together crew! Those last three months flew by and so much stuff has happened around cljdoc!</p>
<p>For me the most important things were onboarding more contributors and allowing library authors and users to add examples to their APIs.</p>
<h3 id="the-good-news">The Good News</h3>
<p>The influx of people to cljdoc has been really amazing, there were about 10 new contributors, some of them really stepping up by helping to review and merge pull requests as well as supporting other newcomers in <a href="https://clojurians.slack.com/messages/C8V0BQ0M6/">our Slack channel</a>.</p>
<p><a href="https://github.com/cljdoc/cljdoc/pulse/monthly"><strong>27(!) pull requests</strong></a> by 10 authors were merged, 40 issues were active, with 28 of them now closed. Shout out to Avichal, Saskia, Daniel, Albrecht, Jorin, Greg, Martin, Travis, Randy and everyone else who contributed through discussions and feedback!
I believe a wide contributor base is critical to ensure longterm success of cljdoc and I look forward to welcome more contributors in the future.</p>
<h3 id="the-bad-news">The Bad News</h3>
<p>Examples&hellip; well. I didn&rsquo;t ship them. I spent a fair amount of time on it but eventually decided that it&rsquo;s not the right thing to focus on at this point. For examples to really make an impact cljdoc adoption needs to be much higher and there&rsquo;s a lot more stuff that I perceive as more impactful at this stage.</p>
<p>There also needs to be more discussion with the wider ecosystem to make examples useful and maintainable (~testable). Please hit me up if you have thoughts in that direction!</p>
<p>More details in <a href="https://github.com/cljdoc/cljdoc/blob/master/doc/adr/0014-add-support-for-examples.md">ADR-0014</a> (initial decision to integrate examples) and <a href="https://github.com/cljdoc/cljdoc/blob/master/doc/adr/0015-cancel-work-on-examples.md">ADR-0015</a> (reversal of that decision with more context/reasoning).</p>
<h3 id="things-that-have-been-shipped-in-october">Things that have been shipped in October:</h3>
<ul>
<li>We migrated from cljdoc.xyz to cljdoc.org and made lots of tiny improvements to make sure cljdoc is being indexed by search engines properly.</li>
<li>Avichal added build stats to <a href="https://cljdoc.org/builds">cljdoc.org/builds</a> giving us some insight into failure rates of documentation builds. <a href="https://github.com/cljdoc/cljdoc/blob/master/%E2%80%A6">Help lower it.</a></li>
<li>Randy improved our <a href="https://cljdoc.org/clojurists-together-rules">404 page</a> by adding the familiar search that is available on the front page.</li>
<li>We set up JS packaging making docs load even faster. cljdoc&rsquo;s Lighthouse performance score now is 99.</li>
<li>@rakyi helped set up Prettier so our JavaScript code is consistently formatted. This is something that we might also do for Clojure code in the future.</li>
<li>@jsimpson-ovo built out proper support for GitLab. This mostly worked before but now it&rsquo;s is on par with GitHub. Source URLs, article edit links and more just work now.</li>
<li>Lots of improvements aimed at new contributors. Better support for Cursive, an improved <a href="https://github.com/cljdoc/cljdoc/blob/master/CONTRIBUTING.adoc"><code>CONTRIBUTING</code></a> and better instructions for <a href="https://github.com/cljdoc/cljdoc/blob/master/doc/running-cljdoc-locally.md">running cljdoc locally</a>.</li>
</ul>
<h3 id="what-next">What next?</h3>
<p>With examples on hold and spec integration <a href="https://github.com/cljdoc/cljdoc/issues/67">still being semi-blocked</a> there is some time to explore other areas. Some things I&rsquo;m looking forward to in particular:</p>
<ul>
<li>A ubiquitous search interface to find functions, articles and switch between recently viewed projects. (<a href="https://github.com/cljdoc/cljdoc/issues/194">#194</a>)</li>
<li>Integration of download statistics from Clojars (<a href="https://github.com/cljdoc/cljdoc/issues/68">#68</a>)</li>
<li>Showing a project&rsquo;s dependencies and license (also <a href="https://github.com/cljdoc/cljdoc/issues/68">#68</a>)</li>
<li>Various search engine optimisations (<a href="https://github.com/cljdoc/cljdoc/issues/192">#192</a>, <a href="https://github.com/cljdoc/cljdoc/issues/164">#164</a> &amp; <a href="https://github.com/cljdoc/cljdoc/issues/160">#160</a>)</li>
</ul>
<h3 id="tell-people-about-cljdoc">Tell people about cljdoc</h3>
<p>Quoting somebody who came by the <a href="https://clojurians.slack.com/messages/C8V0BQ0M6/">#cljdoc Slack channel</a> recently (emphasis mine :P):</p>
<blockquote>
<p>Hey. Just wanted to say thanks to the authors. Was looking for a way to document my cljs library, tested a few other tools, none of them would document the (hundreds of) dynamically generated functions. Even thought about writing my own. Forgot about it until I stumbled on cljdoc and the docs are already built! And it works perfectly! <strong>This project needs more promotion.</strong></p>
</blockquote>
<p>So point people to cljdoc and — if you&rsquo;re feeling particularly excited — tweet or write a blogpost about it.</p>
<h3 id="thanks">Thanks</h3>
<p>Thanks for your support! I&rsquo;m excited to follow Nikita and Arne&rsquo;s work over the next months and feel truly grateful that an initiative like Clojurists Together exists in our community.</p>
<h2 id="shadow-cljs-update">Shadow CLJs Update</h2>
<p><img src="/images/launcher-screenshot1.png" alt="launcher-screenshot1">
<img src="/images/launcher-screenshot2.png" alt="launcher-screenshot2">
<img src="/images/launcher-screenshot3.png" alt="launcher-screenshot3"></p>
<p>Released shadow-cljs versions to 2.6.14 to 2.6.21</p>
<h3 id="ui-work">UI Work</h3>
<ul>
<li>Launcher work will be released soon-ish. Didn&rsquo;t have time to work on in the last two weeks.</li>
</ul>
<h3 id="improvements">Improvements</h3>
<ul>
<li>Switched HTTP handling to use mostly Undertow built-in functionality for serving files to support Range requests with <code>206 Partial Content</code> responses and <code>Transfer-Encoding: chunked</code>.</li>
<li>Massively increased performance of Source Maps handling. The raw data was way too costly to serialize to disk and would often take longer than actual compilation. Instead now only the compacted VLQ encoded data is stored. Cache reads/writes are significantly faster, eg. <code>cljs.core</code> used to take 2.5s to write the cache and now <code>~250ms</code>.</li>
<li>Increased parallel compilation speeds by splitting analysis and &ldquo;compilation&rdquo; (ie. converting AST to JS code) into two different phases. Parallel compilation used to wait for both but now only waits for analysis since that&rsquo;s all that&rsquo;s required.</li>
</ul>
<h3 id="bugfixes">Bugfixes</h3>
<ul>
<li>Stricter checks for <code>:modules</code> when <code>:entries</code> get moved out of their specified module with incorrect <code>:require</code> dependency graphs.</li>
<li>Fixed all test targets to ensure that <code>:runner-ns</code> is always compiled last to ensure side-effecting macros return the expected results.</li>
<li>Fixed a bug in classpath Closure JS processing (ie. none <code>node_modules/**.js</code> files) where cache would increase exponentially in size on each compile.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>September 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/september-2018-monthly-update/</link>
      <pubDate>Thu, 04 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/september-2018-monthly-update/</guid>
      <description>Clojurists Together news September was a successful month. We have new project updates and results from our quarterly survey. Don&amp;rsquo;t forget, CT is currently accepting applications for our 4th Quarter Call for Proposals.
Check out this great video presentation from Martin Klepsch on Documenting the Clojure/Script Ecosystem.
Thanks to all of our members who support Clojurists Together. It&amp;rsquo;s thanks to your generous support that we can do this.
cljdoc updates Hey dear ClojuristsTogether crew!</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>September was a successful month. We have new <a href="https://www.clojuriststogether.org/news/q4-2018-survey-results/">project updates and results</a> from our quarterly survey. Don&rsquo;t forget, CT is currently accepting applications for our 4th Quarter <a href="https://www.clojuriststogether.org/open-source/">Call for Proposals</a>.</p>
<p>Check out this great video presentation from Martin Klepsch on <a href="https://www.youtube.com/watch?v=mWrvd6SE7Vg"><em>Documenting the Clojure/Script Ecosystem</em></a>.</p>
<p>Thanks to all of our members who support Clojurists Together. It&rsquo;s thanks to your generous support that we can do this.</p>
<h2 id="cljdoc-updates">cljdoc updates</h2>
<p>Hey dear ClojuristsTogether crew! This is <a href="https://twitter.com/martinklepsch">Martin</a> with a quick update on cljdoc.</p>
<p>September has been a somewhat slow month. I&rsquo;ve been focused on
preparing my ClojuTRE talk about cljdoc the first half of September
and was mostly offline — on a sailboat — the second half of
September. You can watch <a href="https://www.youtube.com/watch?v=mWrvd6SE7Vg">the talk on YouTube</a>. I&rsquo;m also thanking all of you at the end of the talk.</p>
<p><img src="/images/Presentation.png" alt="Presentation"></p>
<p>Despite me being absent
<a href="https://github.com/cljdoc/cljdoc/pull/116">some</a>
<a href="https://github.com/cljdoc/cljdoc/pull/117">PRs</a> were opened &amp;
merged. Thanks to <a href="https://tavistock.github.io">Travis McNeill</a> and
<a href="http://www.saskialindner.com">Saskia Lindner</a> for that. It&rsquo;s great to
see people contributing and I hope to grow the cljdoc community
further over the next months.</p>
<p>In the same vein Saskia and I are putting together a cljdoc hackday in
Berlin on Thursday 11th October from 2pm, join the <code>#cljdoc</code> Slack
channel on <a href="http://clojurians.net">clojurians.net</a> for details.</p>
<p>Things that have been shipped in September:</p>
<ul>
<li>A toggle to view raw docstrings (<a href="https://github.com/cljdoc/cljdoc/pull/117">PR #117</a>)</li>
<li>A first iteration at what may become an interactive article TOC, currently just showing what section you&rsquo;re in (<a href="https://github.com/cljdoc/cljdoc/pull/116">PR #116</a>)</li>
<li>OpenGraph meta tags (cljdoc links should render much nicer on Slack, Twitter &amp; co)</li>
<li>An <a href="https://github.com/cljdoc/cljdoc/issues/113">issue</a> with UTF-8 article slugs has been fixed</li>
<li>Cleanups in various places of the code removing unused code</li>
<li>Improvements to the way the classpath is constructed for analysis (<a href="https://github.com/cljdoc/cljdoc/commit/422f4636167d3534a9b636faf3d5c2ca7fa04eeb">commit</a>)</li>
<li>A bug with links in offline docs has been fixed (<a href="https://github.com/cljdoc/cljdoc/commit/125f4f6c6ccd0e93e3c89bd44834e16248f2d55d">commit</a>)</li>
</ul>
<p>After ClojuTRE and my vacation I&rsquo;m feeling energized to work on cljdoc
again in October. Priorities will be the integration of examples and community building.</p>
<p><strong>If you want to help cljdoc with 5 minutes of your time:</strong> <a href="https://github.com/cljdoc/cljdoc/blob/master/doc/userguide/for-library-authors.adoc#basic-setup">add a badge</a> to your project&rsquo;s Readme. In order to achieve the vision I outlined in my <a href="https://www.youtube.com/watch?v=mWrvd6SE7Vg">ClojuTRE talk</a> the community needs to be aware this thing exists — and that&rsquo;s not something I&rsquo;ll ever be able to achieve on my own.</p>
<p>So point people to cljdoc and — if you&rsquo;re feeling particularly excited — tweet
or write a blogpost about it.</p>
<p>Thanks for your support &lt;3</p>
<h2 id="shadow-cljs-updates">Shadow CLJS updates</h2>
<p>Release of shadow-cljs versions to 2.6.7 to 2.6.8</p>
<h3 id="ui-work">UI Work</h3>
<p>Here&rsquo;s a <a href="https://clojureverse.org/t/shadow-cljs-ui-preview/2826">preview video</a> of the shadow-cljs UI. I&rsquo;ve also tweaked the UI to display warnings better.</p>
<h3 id="minor-changes">Minor changes</h3>
<ul>
<li>Added support for <a href="https://github.com/thheller/shadow-cljs/commit/99741e3edd07ef8ba8a20e5fc3e2e0cad14051ad">:parallel-build false</a>, <code>true</code> by default but wasn&rsquo;t configurable before.</li>
<li>Copied <a href="https://github.com/thheller/shadow-cljs/commit/0416ea27e9a031c4a39c49df820855aa4b72575c">clojure.core.specs.alpha</a> and adjusted them for CLJS. Clojure 1.10 alpha renamed a few specs and broke the direct use that was previously used.</li>
</ul>
<p>Release of shadow-cljs versions to 2.6.9 to 2.6.10</p>
<h3 id="ui-work-1">UI Work</h3>
<ul>
<li>[WIP] Implemented basic REPL support in the UI</li>
<li>[WIP] Implemented basic standalone Launcher using Electron</li>
</ul>
<h3 id="bugfixes">Bugfixes</h3>
<ul>
<li>fixed a <a href="https://github.com/thheller/shadow-cljs/commit/f6694aaa5459591556a5e83f939885b70924d3b0">REPL issue</a> related to require and browser reload</li>
<li>added support for <a href="https://github.com/thheller/shadow-cljs/commit/a61eea6d7f74fb7d0d806bc030442cf554ab5a24">overriding npm resolves</a> to exclude packages from a build</li>
<li>fixed a <a href="https://github.com/thheller/shadow-cljs/commit/f321b390d52b69bf89e4568cf096a8d51e04575c">race condition</a> related to async loading the web-related namespaces</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q4 2018 Survey Results and Call For Proposals</title>
      <link>https://www.clojuriststogether.org/news/q4-2018-survey-results-and-call-for-proposals/</link>
      <pubDate>Mon, 01 Oct 2018 08:30:50 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q4-2018-survey-results-and-call-for-proposals/</guid>
      <description>We&amp;rsquo;ve recently finished our fourth round of surveys on our members to better understand the community&amp;rsquo;s needs. We&amp;rsquo;re posting this feedback so that they can see the aggregate results, and to give open source projects more information when applying for the Q4 2018 Clojurists Together funding round (closing on the 9th of October).
Survey Responses There were 56 respondents to the survey, up from 49 in the last survey. The highlights are presented below.</description>
      <content:encoded><![CDATA[<p>We&rsquo;ve recently finished our fourth round of surveys on our <a href="/members/">members</a> to better understand the community&rsquo;s needs. We&rsquo;re posting this feedback so that they can see the aggregate results, and to give open source projects more information when <a href="/open-source/">applying</a> for the Q4 2018 Clojurists Together funding round (closing on the 9th of October).</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 56 respondents to the survey, up from 49 in the last survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 54 (98%)</li>
<li>ClojureScript - 40 (78%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (95%)</li>
<li>ClojureScript Browser (79%)</li>
<li>ClojureScript Node Server (18%)</li>
<li>ClojureScript Mobile (14%)</li>
<li>Clojure JVM Client (13%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things people were interested in: error messages (58%), documentation (47%), build tools (42%), developer experience tools (33%), IDE support (31%), test tooling (26%), and linters (26%). Tools and documentation targeting beginners to Clojure or to programming in general were mentioned by quite a few people.</p>
<h3 id="are-there-any-particular-libraries-tools-or-projects-that-are-important-to-you-that-you-would-like-to-see-supported">Are there any particular libraries, tools, or projects that are important to you that you would like to see supported?</h3>
<!-- pbpaste | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -->
<p>Shadow CLJS, Figwheel, CIDER, Rum, Datascript, Reagent, Protorepl, Neanderthal, LightTable, Leiningen, Fulcro, Expound, and Eastwood were all mentioned several times.</p>
<h3 id="have-you-seen-any-direct-benefits-from-improvements-to-the-projects-we-have-funded">Have you seen any direct benefits from improvements to the projects we have funded?</h3>
<p>About half of the respondents to this question had seen direct benefits, and half hadn&rsquo;t. One note that came up a few times was that some people had found it hard to update CIDER as they were stuck on older versions of Emacs.</p>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>77% - Fund a mix of established projects and speculative projects
20% - Only fund established projects that have already had some success
3% - Only fund speculative projects</p>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Communication</li>
<li>Transparency</li>
<li>Project selection</li>
<li>Being consistent</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Be more transparent</li>
<li>Getting more corporate sponsors</li>
<li>Being prettier</li>
</ul>
<p>We&rsquo;ve just started the process of redesigning the Clojurists Together site. We&rsquo;ve already got a new logo (thanks to <a href="https://twitter.com/jacekschae?lang=en">Jacek Schæ</a>) and are working on improving the site design. Since hiring an admin assistant last month, we&rsquo;ve had more time to reach out to different Clojure companies to talk about joining. We&rsquo;ve also improved the benefits we are offering to members, Filter members and above receive a much more prominent place on the <a href="/members/">members</a> page, along with a 1-2 sentence blurb. Expect to see more improvements here in the future.</p>
<p>If you&rsquo;d like to see more companies sponsor Clojurists Together, please reach out to them and encourage them to join.</p>
<h2 id="call-for-proposals">Call For Proposals</h2>
<p>If you are a maintainer of an open source Clojure project, we&rsquo;d encourage you to consider <a href="/open-source/">applying</a> for the Q4 funding round. If you maintain a project that was mentioned either directly, or as one of the survey respondents' focuses, then we&rsquo;d <em>highly</em> encourage you to consider applying. Applications will close on the 9th of October. If you know of a project that you think would be a good fit for Clojurists Together, please encourage them to apply. If you have any questions or would like any help with your application, please <a href="/contact">get in touch</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>August 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/august-2018-monthly-update/</link>
      <pubDate>Thu, 06 Sep 2018 20:30:31 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/august-2018-monthly-update/</guid>
      <description>Clojurists Together news August was the first month of funding for the quarter, so today we present the initial round of updates on new projects, cljdoc and Shadow CLJS.
This month we have hired Rachel Magruder part-time to help out with the day-to-day running of Clojurists Together. If you send us an email you may get a response from her. She is also helping out with the backend processing of contracts, grant reports, payments, e.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>August was the first month of funding for the quarter, so today we present the initial round of updates on new projects, cljdoc and Shadow CLJS.</p>
<p>This month we have hired Rachel Magruder part-time to help out with the day-to-day running of Clojurists Together. If you send us an email you may get a response from her. She is also helping out with the backend processing of contracts, grant reports, payments, e.t.c.</p>
<p>Thanks to all of our members who support Clojurists Together. It&rsquo;s thanks to your generous support that we can do this.</p>
<h2 id="cljdoc-updates">cljdoc updates</h2>
<p>I switched the <strong>storage layer</strong>. SQLite is now used instead of lib-grimoire. More details in the respective architecture decision record: <a href="https://github.com/cljdoc/cljdoc/blob/master/doc/adr/0013-move-to-sqlite-for-storage.md">ADR-0013</a></p>
<p>This was a lot of work but it sets the project up for more interesting extensions besides API documentation and articles (think specs &amp; examples).</p>
<p>Also I looked more into <strong>integrating specs</strong> but without changes to spec it is impossible to determine if a spec originates from the artefact that is being analysed or from one of its dependencies. To fix this specs will need to support metadata (<a href="https://dev.clojure.org/jira/browse/CLJ-2194">CLJ-2194</a>) but the timeline for this is unclear.</p>
<p>In the light of this I&rsquo;m considering focusing on examples first.  More details to come.</p>
<p>Some more minor things that happened:</p>
<ul>
<li>I printed <a href="https://twitter.com/martinklepsch/status/1037802412680126464"><strong>stickers</strong></a> which I&rsquo;m planning to send to contributors.</li>
<li>Bozhidar likes favicons so I added one :)</li>
<li>Work is underway to integrate cljdoc into <a href="https://kapeli.com/dash">Dash</a></li>
<li>Various fixes to the analyser code, mostly to eliminate slight differences between Clojure and ClojureScript as well as some dependency related improvements.</li>
<li>I shipped a <a href="https://giant.gfycat.com/GoodCluelessKusimanse.mp4"><strong>quick switcher (demo)</strong></a> that allows you to switch between projects that you opened recently. I hope to expand this to quickly finding vars, namespaces and articles in the current project.</li>
</ul>
<p>I&rsquo;ll also be at <a href="https://clojutre.org/2018/">ClojuTRE</a> next week. Say hi if you&rsquo;re around! 👋</p>
<p>Oh and after ClojuTRE I&rsquo;ll be on a sailboat for two weeks so there will be less activity than usual.</p>
<h2 id="shadow-cljs-updates">Shadow CLJS updates</h2>
<h3 id="august-1---15">August 1 - 15</h3>
<p>I released shadow-cljs versions 2.4.31 up to 2.5.1.</p>
<p>Noteworthy changes include:</p>
<ul>
<li>Started reworking the shadow-cljs <a href="https://clojureverse.org/t/poll-reworking-the-launcher/2633">standalone launcher</a> which is responsible for downloading dependencies and launching the actual tool. Intent here is to gain access to git-deps and dynamically loading dependencies without requiring a hard restart.</li>
<li>Started publishing AOT compiled shadow-cljs versions which can significantly <a href="https://clojureverse.org/t/faster-startup-via-aot/2603">improve start-up times</a>. Used by default when using the standalone launcher.</li>
<li>Fixed a few minor bugs and cleaned up some rogue log output.</li>
</ul>
<h3 id="august-16-31">August 16-31</h3>
<p>I released shadow-cljs versions 2.6.0 up to 2.6.6</p>
<h4 id="ui-work">UI Work</h4>
<p>The UI is still a Work-in-Progress but it is now possible to control builds via the Web UI. Builds can be started/stopped and inspected (although the UI doesn&rsquo;t visualize this well yet).</p>
<h4 id="launcher-re-work">Launcher Re-Work</h4>
<p>I reverted the launcher changes I did recently due to some compatibility issues where <code>tools.deps</code> was handling dependencies differently than <code>pomegranate</code> and thus breaking builds that were working previously. Need to investigate this a bit more before making the switch again. There were also a few classloader issues that need to be sorted out.</p>
<h4 id="minor-bugfixes">Minor bugfixes</h4>
<ul>
<li>Fixed an issue with <a href="https://github.com/thheller/shadow-cljs/commit/d59b91d5dbc83a1b2b9147a3f55d3fd38077f099">npm link</a></li>
<li>Fixed an issue with CSS reloading in <a href="https://github.com/thheller/shadow-cljs/commit/17309326ab440b86618294b31f468f6c40438800">Electron</a></li>
<li>Fixed an <code>ns</code> parsing <a href="https://github.com/thheller/shadow-cljs/issues/377">issue</a> where an invalid <code>ns</code> form would pass without warnings</li>
</ul>
<h4 id="new-features">New features</h4>
<ul>
<li>Added support for private <code>s3</code> maven repos via <a href="https://github.com/s3-wagon-private/s3-wagon-private">s3-wagon-private</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>July 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/july-2018-monthly-update/</link>
      <pubDate>Wed, 15 Aug 2018 05:59:31 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/july-2018-monthly-update/</guid>
      <description>Clojurists Together news This was the final month for CIDER and ClojureScript. Our next two projects that we are funding are cljdoc and Shadow CLJS. Thanks to all of our members who support Clojurists Together. It&amp;rsquo;s thanks to your generous support that we can do this.
CIDER updates This months updates were all around getting nREPL 0.4 into the hands of everyone.
 I&amp;rsquo;ve also opened PRs for lein and boot for the new nREPL.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>This was the final month for CIDER and ClojureScript. Our next two projects that we are funding are cljdoc and Shadow CLJS. Thanks to all of our members who support Clojurists Together. It&rsquo;s thanks to your generous support that we can do this.</p>
<h2 id="cider-updates">CIDER updates</h2>
<p>This months updates were all around getting nREPL 0.4 into the hands of everyone.</p>
<ul>
<li>I&rsquo;ve also opened PRs for <a href="https://github.com/technomancy/leiningen/pull/2444">lein</a> and <a href="https://github.com/boot-clj/boot/pull/703">boot</a> for the new nREPL.</li>
<li>Released <a href="https://github.com/nrepl/nREPL/releases/tag/0.4.2">nREPL 0.4.2</a></li>
<li>Released <a href="https://github.com/nrepl/nREPL/releases/tag/0.4.3">nREPL 0.4.3</a></li>
<li>Released <a href="https://github.com/nrepl/nREPL/releases/tag/0.4.4">nREPL 0.4.4</a></li>
<li>Created a <a href="http://nrepl.readthedocs.io/">nice manual</a> for nREPL</li>
<li>Released <a href="https://github.com/clojure-emacs/cider-nrepl/blob/master/CHANGELOG.md#0180-2018-08-06">cider-nrepl 0.18.0</a> (with support for nREPL 0.4)</li>
<li>Removed the lockstep between CIDER and CIDER nREPL versions, now cider-nrepl releases are going to happen independently from CIDER&rsquo;s (mostly because several editors now rely on cider-nrepl)</li>
<li>Updated refactor-nrepl to support nREPL 0.4</li>
<li>Updated piggieback to support nREPL 0.4 (released with 0.3.8)</li>
<li>Created a <a href="https://github.com/nrepl/lein-nrepl">lein plugin</a> to start an nREPL 0.4 server easily</li>
<li>Send a PR to sayid <a href="https://github.com/bpiel/sayid/pull/40">adding nREPL 0.4 support</a></li>
<li>Released <a href="https://github.com/nrepl/drawbridge">drawbridge</a> 0.1.3 which added back support for tools.nrepl</li>
</ul>
<h2 id="clojurescript-updates">ClojureScript updates</h2>
<p>Several ClojureScript patches were worked on in first half of July.</p>
<ul>
<li>Added a new feature to produce compiler warnings on private var use via <a href="https://dev.clojure.org/jira/browse/CLJS-1702">CLJS-1702</a> and <a href="https://dev.clojure.org/jira/browse/CLJS-2817">CLJS-2817</a>.</li>
<li>Added function return type inference via <a href="https://dev.clojure.org/jira/browse/CLJS-1997">CLJS-1997</a>.</li>
<li>Added support for <code>IPrintWithWriter</code> with native types via <a href="https://dev.clojure.org/jira/browse/CLJS-2812">CLJS-2812</a>.</li>
<li>Added warnings for non-dynamic earmuffed vars via <a href="https://dev.clojure.org/jira/browse/CLJS-2819">CLJS-2819</a>.</li>
<li>Updated to latest <code>test.check</code> via <a href="https://dev.clojure.org/jira/browse/CLJS-2806">CLJS-2806</a>.</li>
<li>Updated docstring for <code>doto</code> to use <code>js/Map</code> via <a href="https://dev.clojure.org/jira/browse/CLJS-2821">CLJS-2821</a>.</li>
<li>Submitted a patch in <a href="https://dev.clojure.org/jira/browse/CLJS-2693">CLJS-2693</a>, which adds chunked seq support to ranges.</li>
<li>With <a href="https://dev.clojure.org/jira/browse/CLJS-2796">CLJS-2796</a>, caught a Closure Compiler regression, filed an upstream issue, which was fixed.</li>
<li>Added a patch in <a href="https://dev.clojure.org/jira/browse/CLJS-2802">CLJS-2802</a>, which lets <code>empty?</code> work on transient collections.</li>
<li>Landed a fix for a bad test related to Windows in <a href="https://dev.clojure.org/jira/browse/CLJS-2811">CLJS-2811</a>.</li>
<li>Submitted a patch in <a href="https://dev.clojure.org/jira/browse/CLJS-2813">CLJS-2813</a>, adding Java serializability of <code>JSValue</code>.</li>
<li>Looked into <a href="https://dev.clojure.org/jira/browse/CLJS-2793">CLJS-2793</a>, an issue with specing variadic fns.</li>
</ul>
<p>The second half of July involved these tickets:</p>
<ul>
<li>Added a new Graal.JS REPL environment via <a href="https://dev.clojure.org/jira/browse/CLJS-2831">CLJS-2831</a>.</li>
<li>Updated to Closure Compiler v20180716 via <a href="https://dev.clojure.org/jira/browse/CLJS-2833">CLJS-2833</a>.</li>
<li>Updated ClojureScript&rsquo;s implementation of spec, to bring it to parity with Clojure&rsquo;s via: <a href="https://dev.clojure.org/jira/browse/CLJS-2725">CLJS-2725</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2822">CLJS-2822</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2665">CLJS-2665</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2848">CLJS-2848</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2846">CLJS-2846</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2841">CLJS-2841</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2847">CLJS-2847</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2842">CLJS-2842</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2845">CLJS-2845</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2844">CLJS-2844</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2840">CLJS-2840</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2839">CLJS-2839</a>, <a href="https://dev.clojure.org/jira/browse/CLJS-2838">CLJS-2838</a>, and <a href="https://dev.clojure.org/jira/browse/CLJS-2837">CLJS-2837</a>.</li>
<li>Landed a fix for an issue where <code>binding</code> was not being done in parallel via <a href="https://dev.clojure.org/jira/browse/CLJS-2541">CLJS-2541</a>.</li>
<li>Landed a fix for bad code gen surrounding application of <code>not</code> in operator position via <a href="https://dev.clojure.org/jira/browse/CLJS-2832">CLJS-2382</a>.</li>
<li>Submitted a patch to eliminate unnecessary <code>^boolean</code> annotations in <a href="https://dev.clojure.org/jira/browse/CLJS-2825">CLJS-2825</a> (possible because of the new function return type inference).</li>
<li>Landed a fix for an issue with arglists and macros via <a href="https://dev.clojure.org/jira/browse/CLJS-2852">CLJS-2852</a>.</li>
</ul>
<p>This work was a lot of fun—I&rsquo;m looking forward to the changes appearing in an official ClojureScript release in the future!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2018 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q3-2018-funding-announcement/</link>
      <pubDate>Fri, 03 Aug 2018 16:41:59 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2018-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q3 of 2018 (August-October) we are funding two projects: cljdoc and Shadow CLJS.
Recap For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This funding cycle is our third. Previously we have supported clj-http, Figwheel, ClojureScript, and CIDER.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q3 of 2018 (August-October) we are funding two projects: cljdoc and Shadow CLJS.</p>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This funding cycle is our third. Previously we have supported <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, and <a href="http://www.cider.mx/en/latest/">CIDER</a>.</p>
<h2 id="cljdoc">cljdoc</h2>
<p><a href="https://cljdoc.xyz">cljdoc</a> is a website that builds and hosts documentation for Clojure and ClojureScript libraries. Poor and out-of-date documentation has long been a complaint of Clojure developers. cljdoc <a href="https://github.com/cljdoc/cljdoc#rationale">improves the state</a> of Clojure documentation by providing minimal-effort documentation building and hosting for all Clojure jars on Clojars and Maven. In our most recent survey, improving documentation was a common request. Martin Klepsch maintains cljdoc.</p>
<p>Martin&rsquo;s plans for the next three months are:</p>
<ul>
<li>Integrate Clojure specs</li>
<li>Integrate user-contributed examples</li>
<li>Add offline documentation downloads (Dash/Zeal integration)</li>
<li>Improve the overall user experience / UI</li>
<li>Support users and make them aware cljdoc exists and can help them</li>
<li>Build an active community around this project, ensure there&rsquo;s more than just him developing it</li>
</ul>
<h2 id="shadow-cljs">Shadow CLJS</h2>
<p><a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a> is a ClojureScript build tool that covers the entire spectrum from development and testing to production builds. It assumes no prior knowledge of the JVM or Clojure to get started, which makes it more accessible to a broader audience. Thomas Heller maintains Shadow CLJS.</p>
<p>Thomas&rsquo;s plans for the next three months are:</p>
<ul>
<li>Continue working on improving stability</li>
<li>Continue working on usability</li>
<li>Improve the documentation for the project</li>
<li>Provide a templating mechanism for starting new Shadow CLJS projects.</li>
</ul>
<h2 id="funding-details">Funding details</h2>
<p>Each project receives a grant of $1,800USD/mo for three months.</p>
<h2 id="voting-details">Voting details</h2>
<p>The projects that applied were:</p>
<ul>
<li><a href="https://github.com/thedavidmeister/cljs-i18n">cljs-i18n</a></li>
<li><a href="https://cljdoc.xyz">cljdoc</a></li>
<li><a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a></li>
<li><a href="https://github.com/LightTable/LightTable">Light Table</a></li>
<li><a href="https://github.com/bhauman/lein-figwheel">Figwheel</a></li>
</ul>
<h2 id="q4-funding">Q4 Funding</h2>
<p>We had a bunch of great applications from great projects; we would have liked to fund several more projects if we had the money. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, you can re-use that application to <a href="/open-source/">apply</a> for Q4. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q4 2018 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q4-2018-funding-announcement/</link>
      <pubDate>Fri, 03 Aug 2018 16:41:59 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q4-2018-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q4 of 2018/19 (November-January) we are funding two projects: Datascript and Kaocha.
Recap For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This funding cycle is our fourth. Previously we have supported cljdoc, Shadow CLJS, clj-http, Figwheel, ClojureScript, and CIDER.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q4 of 2018/19 (November-January) we are funding two projects: Datascript and Kaocha.</p>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This funding cycle is our fourth. Previously we have supported <a href="https://cljdoc.xyz">cljdoc</a>, <a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a>, <a href="https://github.com/dakrone/clj-http/">clj-http</a>, <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>, <a href="https://clojurescript.org">ClojureScript</a>, and <a href="http://www.cider.mx/en/latest/">CIDER</a>.</p>
<h2 id="datascript">Datascript</h2>
<p><a href="https://github.com/tonsky/datascript">Datascript</a> is a Clojure and ClojureScript database. DataScript has been around for 3+ years, has gotten massive interest from the community, is used in several production projects (listed on GitHub page), and has been starred on GitHub 3000+ times. Nikita Prokotov is the project creator, and currently maintains Datascript.</p>
<p>Nikita&rsquo;s plans for the next three months are:</p>
<ul>
<li>Extend query language to achieve parity with Datomic (OR, NOT predicates)</li>
<li>Optimizing query execution speed (work on both has started, but not finished)</li>
<li>Faster bulk transactions with transient implementation of BTree Set</li>
<li>After that, experiment with adopting DataScript for more interesting UI development: reactive entities and queries, subscriptions, efficient disk persistence (for server-side and client-side via localStorage)</li>
</ul>
<p>If optimized sufficiently, DataScript could become the de-facto, default go-to database for small and middle sized Clojure projects, both on the server-side and client-side.</p>
<h2 id="kaocha">Kaocha</h2>
<p><a href="https://github.com/lambdaisland/kaocha">Kaocha</a> is a Clojure test tool. Kaocha raises the bar for what to expect from tools and provides a platform for innovation and collaboration. Clojure does not have the strongest testing culture, and has not had as much investment into test tooling as other communities. Better tooling would encourage better testing practices, a better testing culture would encourage investing in tooling. Arne Brasseur is the main (and sole) developer of Kaocha.</p>
<p>Arne&rsquo;s plans for the next three months are:</p>
<ul>
<li>ClojureScript support</li>
<li>Expectations support</li>
<li>Improved Midje support</li>
<li>Cloverage support</li>
<li>Boot support</li>
<li>Prettier diffing of <code>(is (= ...))</code></li>
<li>TAP reporter</li>
<li>Junit.xml reporter</li>
<li>Run tests in parallel</li>
</ul>
<h2 id="funding-details">Funding details</h2>
<p>Each project receives a grant of $1,800USD/mo for three months.</p>
<h2 id="voting-details">Voting details</h2>
<p>This quarter proved to be a close race between Kaocha and Neanderthal, who tied for the place of the second funded project. We broke the tie using <a href="https://www.random.org">random.org</a> to pick the winner. For the first time we used the <a href="https://civs.cs.cornell.edu">CIVS</a> online voting service fron Cornell.</p>
<p>The other projects that applied were:</p>
<ul>
<li><a href="https://github.com/uncomplicate/neanderthal">Neanderthal</a></li>
<li><a href="https://github.com/viebel/klipse">Klipse</a></li>
<li><a href="https://github.com/razum2um/clj-debugger">clj-debugger</a></li>
<li><a href="https://github.com/bensu/doo">Doo</a></li>
<li><a href="https://github.com/hoplon/hoplon">Hoplon</a></li>
<li><a href="https://github.com/hellonico/origami">Origami</a></li>
<li><a href="https://github.com/clojurecademy/clojurecademy">Clojurecademy</a></li>
<li><a href="https://github.com/cloudnativeclojure">Cloud-Native-Clojure</a></li>
<li><a href="https://github.com/razum2um/cljsh">cljsh</a></li>
</ul>
<h2 id="q4-funding">Q4 Funding</h2>
<p>We had a bunch of great applications from great projects; we would have liked to fund several more projects if we had the money. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, you can re-use that application to <a href="/open-source/">apply</a> for next years Q1 funding round. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>June 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/june-2018-monthly-update/</link>
      <pubDate>Wed, 18 Jul 2018 20:59:31 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/june-2018-monthly-update/</guid>
      <description>Clojurists Together news This has been another productive month for CIDER and ClojureScript. There is one more month left in this funding cycle and then we&amp;rsquo;re starting our next round.
We recently surveyed our members to see what they wanted us to fund. Error messages, documentation, developer experience, and IDE support featured highly. If you maintain a Clojure project that is important to some or all of the Clojure community, especially in one of these areas please apply for funding.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>This has been another productive month for CIDER and ClojureScript. There is one more month left in this funding cycle and then we&rsquo;re starting our next round.</p>
<p>We recently <a href="/news/q3-2018-survey-results/">surveyed</a> our members to see what they wanted us to fund. Error messages, documentation, developer experience, and IDE support featured highly. If you maintain a Clojure project that is important to some or all of the Clojure community, especially in one of these areas please <a href="/open-source/">apply</a> for funding. Applications close July 20.</p>
<h2 id="cider-updates">CIDER updates</h2>
<ul>
<li>A new <a href="https://github.com/clojure-emacs/clojure-mode/commits/master">release</a> of clojure-mode.el (performance improvements and integration with project.el, needed for the new connection management in CIDER)</li>
<li>The new connection management for CIDER is now in master (another person did most of the work, as after I announced I planned to rewrite it in the scope of the funding he expressed the desire to pick up an old PR he had created about this). Afterwards I did a few rounds of testing and bug-fixing together with him.</li>
<li>I completed the removal of cider-interaction.el and restructured the code quite a lot in the process.</li>
<li>I did many improvements to the manual (+ a new domain for CIDER - <a href="http://docs.cider.mx">http://docs.cider.mx</a>).</li>
<li>Some other small improvements are <a href="https://github.com/clojure-emacs/cider/commit/13c76efcfc94f3c97183962f91146a851bd7a9d3">handling cider-ancillary-buffers more consistently</a> and <a href="https://github.com/clojure-emacs/cider/commit/c658d8a759adc187da70efaacf800fdc0f852021">improving nREPL connection handling</a></li>
<li>I&rsquo;ve also opened PRs for lein and boot for the new nREPL - <a href="https://github.com/boot-clj/boot/pull/703">boot-clj/boot#703</a> and <a href="https://github.com/technomancy/leiningen/pull/2444">technomancy/leiningen#2444</a></li>
</ul>
<h2 id="clojurescript-updates">ClojureScript updates</h2>
<h3 id="june-1-15">June 1-15</h3>
<ul>
<li>Several ClojureScript patches were worked on in first half of June.</li>
<li>A self-host regression (<a href="https://dev.clojure.org/jira/browse/CLJS-2766">CLJS-2766</a>) surrounding revisions to the <code>exists?</code> implementation was fixed.</li>
<li>A patch was landed (<a href="https://dev.clojure.org/jira/browse/CLJS-2769">CLJS-2769</a>) which it possible to run the self-hosts tests with the very latest Google Closure Library code.</li>
<li>A corner case surrounding <code>:install-deps</code> and <code>cljs.main</code>, when using <code>-e</code> to evaluate code (<a href="https://dev.clojure.org/jira/browse/CLJS-2775">CLJS-2775</a>) was fixed.</li>
<li>Work was started on a patch to enable <code>*warn-on-reflection*</code> in the compiler&rsquo;s codebase (<a href="https://dev.clojure.org/jira/browse/CLJS-2748">CLJS-2748</a>).</li>
<li>An issue that prevented async test result reporting from properly occurring with the Node REPL (<a href="https://dev.clojure.org/jira/browse/CLJS-2780">CLJS-2780</a>) was fixed.</li>
</ul>
<p>All of the work to date, apart from the last two items, was shipped in the ClojureScript 1.10.312 release.</p>
<h3 id="june-16-30">June 16-30</h3>
<p>Several ClojureScript patches were worked on in second half of June.</p>
<ul>
<li>Landed a fix for an issue that prevented proper async test result reporting when using the Node REPL (<a href="https://dev.clojure.org/jira/browse/CLJS-2780">CLJS-2780</a>).</li>
<li>Landed a patch (<a href="https://dev.clojure.org/jira/browse/CLJS-2442">CLJS-2442</a>), which speeds things up when applying <code>set</code> to a set and <code>vec</code> to a vector, thus aligning with Clojure for these cases. This allows for simple and efficient code when you need to coerce from an arbitrary collection to a set or vector.</li>
<li>Landed a patch (<a href="https://dev.clojure.org/jira/browse/CLJS-2790">CLJS-2790</a>) which fixes spurious <a href="https://clojurescript.org/guides/externs">inference warnings</a> when using <code>defrecord</code> with fields.</li>
<li>Re-baselined and re-benchmarked patch in (<a href="https://dev.clojure.org/jira/browse/CLJS-2341">CLJS-2341</a>) given that <a href="https://dev.clojure.org/jira/browse/CLJS-844">CLJS-844</a> has been applied. (Whatever the end result is, you can count on speedups in the range of 1.5 to 2 for <code>js-&gt;clj</code>.)</li>
<li>Landed patches in <a href="https://dev.clojure.org/jira/browse/CLJS-2798">CLJS-2798</a> and <a href="https://dev.clojure.org/jira/browse/CLJS-2799">CLJS-2799</a>, which were some minor quirks in need of fixing in preparation for <a href="https://dev.clojure.org/jira/browse/CLJS-2693">CLJS-2693</a>, which aims to adds support for chuncked sequence ranges. (Check out the potential perf improvements detailed in that ticket!)</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q3 2018 Survey Results and Call For Proposals</title>
      <link>https://www.clojuriststogether.org/news/q3-2018-survey-results-and-call-for-proposals/</link>
      <pubDate>Fri, 13 Jul 2018 07:07:50 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q3-2018-survey-results-and-call-for-proposals/</guid>
      <description>We have recently run our third survey on our members to better understand them and their needs. We&amp;rsquo;re publishing these results so that they can see the aggregate results, and to give open source projects more information when applying for the Q3 2018 Clojurists Together funding round (closing 20 July).
Survey Responses There were 49 respondents to the survey, down from 52 in the last survey. The highlights are presented below.</description>
      <content:encoded><![CDATA[<p>We have recently run our third survey on our <a href="/members/">members</a> to better understand them and their needs. We&rsquo;re publishing these results so that they can see the aggregate results, and to give open source projects more information when <a href="/open-source/">applying</a> for the Q3 2018 Clojurists Together funding round (closing 20 July).</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 49 respondents to the survey, down from 52 in the last survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 49 (100%)</li>
<li>ClojureScript - 38 (78%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (98%)</li>
<li>ClojureScript Browser (78%)</li>
<li>ClojureScript Mobile (22%)</li>
<li>Clojure JVM Client (12%)</li>
<li>ClojureScript Node Server (12%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>The main things people were interested in: error messages (77%), documentation (48%), developer experience tools (40%), IDE support (35%), build tooling (33%), and linters (27%).</p>
<h3 id="which-projects-in-the-clojure-ecosystem-are-important-to-your-workflow">Which projects in the Clojure ecosystem are important to your workflow?</h3>
<!-- pbpaste | tr ',' '\n' | tr [A-Z] [a-z] | awk '{$1=$1};1' | sort  | uniq -c | sort -r -->
<p>This was a new question that we asked of our members, here are the projects that were mentioned at least three times:</p>
<ul>
<li>12 figwheel</li>
<li>12 cider</li>
<li>6 reagent</li>
<li>6 re-frame</li>
<li>6 leiningen</li>
<li>4 tools.deps</li>
<li>3 shadow-cljs</li>
</ul>
<h3 id="do-you-think-the-funded-projects-for-this-quarter-have-delivered">Do you think the funded projects for this quarter have delivered?</h3>
<p>This was a new question that was suggested we ask in our surveys. It was a free text choice, but 26 people said yes, 7 people said they weren&rsquo;t sure, and no-one said no which is good!</p>
<h3 id="how-would-you-like-us-to-allocate-our-funding">How would you like us to allocate our funding?</h3>
<p>There is a continuum of project maturity. To date we have focused mostly on mature projects where the project and/or applicant have a track record. We are looking at the possibility of funding some earlier stage, more speculative projects. These have a higher risk of not delivering what they set out to achieve, but also have the potential for a high payoff. We asked our members what kinds of projects they want us to focus on:</p>
<ul>
<li>Only fund established projects that have already had some success (29%)</li>
<li>Fund a mix of established projects and speculative projects (69%)</li>
<li>Only fund speculative projects (2%)</li>
</ul>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Communication with sponsors</li>
<li>Transparency</li>
<li>Selecting projects</li>
</ul>
<p>Could do better:</p>
<ul>
<li>Marketing ourselves and our successes</li>
<li>Explaining the direct benefits to sponsors</li>
<li>Getting more funding</li>
</ul>
<p>If you&rsquo;d like to see more companies sponsor Clojurists Together, please reach out to them and encourage them to join.</p>
<h2 id="call-for-proposals">Call For Proposals</h2>
<p>If you are a maintainer of an open source Clojure project, we&rsquo;d encourage you to consider <a href="/open-source/">applying</a> for the Q3 funding round. If you maintain a project that was mentioned either directly, or as one of the survey respondents' focuses, then we&rsquo;d <em>highly</em> encourage you to consider applying. Applications will close on 20 July. If you know of a project that you think would be a good fit for Clojurists Together, please encourage them to apply. If you have any questions or would like any help with your application, please <a href="/contact">get in touch</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>May 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/may-2018-monthly-update/</link>
      <pubDate>Sat, 12 May 2018 20:36:31 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/may-2018-monthly-update/</guid>
      <description>Clojurists Together news Not much to report from Clojurists Together this month, things have been pretty quiet with lots of other things going on. This is the first month of work from the second round of funding. Bozhidar Batsov is working on CIDER &#43; related projects and Mike Fikes is working on ClojureScript. If you like the work that they&amp;rsquo;re doing and would like to support it further, consider joining yourself or your company as a member.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>Not much to report from Clojurists Together this month, things have been pretty quiet with lots of other things going on. This is the first month of work from the second round of funding. Bozhidar Batsov is working on CIDER + related projects and Mike Fikes is working on ClojureScript. If you like the work that they&rsquo;re doing and would like to support it further, consider joining yourself or your company as a member.</p>
<h2 id="cider-updates">CIDER updates</h2>
<h3 id="may-1---15">May 1 - 15</h3>
<ul>
<li>Finished the nREPL migration out of clojure-contrib (the 0.4.0 marks the end of the breaking changes)</li>
<li>Provided a <a href="https://github.com/trptcolin/reply/pull/182">PR</a> for reply to switch to the new nREPL</li>
<li>Migrated <a href="https://github.com/nrepl/drawbridge">drawbridge</a> to the new org and updated it for nREPL 0.4</li>
<li><a href="https://github.com/clojure-emacs/orchard/commit/b7ceb98b3d0b1f1035f9586a127cd23b3d18ff5c">Extracted</a> the var-info functionality from cider-nrepl to orchard</li>
<li>Added basic cljs deps injection to CIDER on cider-jack-in-cljs</li>
</ul>
<h3 id="may-16---31">May 16 - 31</h3>
<ul>
<li>Extracted the bencoding from nREPL into a <a href="https://github.com/nrepl/bencode">library</a> we hope to make portable</li>
<li>Improved Clojure&rsquo;s dependency checking a bit to be aware of group ids and versions</li>
<li>Fixed a couple of small nREPL issues</li>
<li>Started work on lein/boot plugins to boot the new nREPL from cider-jack-in</li>
</ul>
<h2 id="clojurescript-updates">ClojureScript updates</h2>
<h3 id="may-1---15-1">May 1 - 15</h3>
<p>The last couple of weeks saw this activity in the ClojureScript compiler:</p>
<ul>
<li>Patch landed for <a href="https://dev.clojure.org/jira/browse/CLJS-2702">CLJS-2702</a>, allowing the ClojureScript compiler
(or end users) to upgrade to the latest Closure Library. The patch was written in such a way that end users can
continue to use the current Closure Library, or upgrade to the latest, with the compiler codebase being compatible
with both. You can read more details on this work at this <a href="https://gist.github.com/mfikes/baf71581b759dc6a844b860db5889bad">gist</a></li>
<li>Patch landed for highly-voted <a href="https://dev.clojure.org/jira/browse/CLJS-2724">CLJS-2724</a>, which will allow native Node modules (like &ldquo;fs&rdquo;) to be used in scripts executed via <code>cljs.main</code></li>
<li>Towards improving the use of <code>:npm-deps</code>, patch landed for <a href="https://dev.clojure.org/jira/browse/CLJS-2739">CLJS-2739</a>, which improves the performance of the compiler when indexing the <code>node_modules</code> directory. A test exhibited a 6-fold speedup, cutting the indexing time down from 30 seconds to 5 seconds.</li>
</ul>
<p>Please continue to <a href="https://dev.clojure.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;requestId=10706">vote</a> for, or file issues in the ClojureScript JIRA. I&rsquo;m especially interested in those related to NPM dependency management.</p>
<h3 id="may-16-31">May 16-31</h3>
<p>The last couple of weeks saw this activity in the ClojureScript compiler:</p>
<ul>
<li>Submitted a patch in <a href="https://dev.clojure.org/jira/browse/CLJS-2298">CLJS-2298</a>, which causes REPLs to load any
user-defined <code>user.cljs</code> / <code>user.cljc</code> file.</li>
<li>Worked on <a href="https://dev.clojure.org/jira/browse/CLJS-2651">CLJS-2651</a>, which allows Git Deps to be supported
in the AOT cache feature. Follow up work will be needed to sort out a corner
case: <a href="https://dev.clojure.org/jira/browse/CLJS-2765">CLJS-2765</a>.</li>
<li>Landed a patch for <a href="https://dev.clojure.org/jira/browse/CLJS-1677">CLJS-1677</a> which was causing an
issue if you explicitly require <code>goog</code> in <code>ns</code> forms in an <code>:advanced</code> build.</li>
<li>Landed a patch in <a href="https://dev.clojure.org/jira/browse/CLJS-2755">CLJS-2755</a>, that makes it possible to
generate values satisfying <code>uri?</code> when generatively testing with Spec.</li>
<li>Landed a patch in <a href="https://dev.clojure.org/jira/browse/CLJS-1871">CLJS-1871</a>, which allows static dispatch
to declared functions when hinted with <code>:arglists</code> meta. A bonus side effect is that it helps catch arity errors for calls to declared functions.</li>
<li>Began investigation into <a href="https://dev.clojure.org/jira/browse/CLJS-2369">CLJS-2339</a> and discovered they are
no longer reproducible with latest compiler.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2018 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q2-2018-funding-announcement/</link>
      <pubDate>Thu, 26 Apr 2018 16:41:59 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2018-funding-announcement/</guid>
      <description>Clojurists Together is happy to announce that for Q2 of 2018 (May-July) we are funding two projects: CIDER and ClojureScript.
Recap For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This is our second funding cycle since launching.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is happy to announce that for Q2 of 2018 (May-July) we are funding two projects: CIDER and ClojureScript.</p>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This is our second funding cycle since launching. In the first funding cycle we supported <a href="https://github.com/dakrone/clj-http/">clj-http</a> and <a href="https://github.com/bhauman/lein-figwheel">Figwheel</a>.</p>
<h2 id="cider">CIDER</h2>
<p><a href="https://github.com/clojure-emacs/cider">CIDER</a> is the most widely adopted Clojure development environment. In the most recent <a href="http://blog.cognitect.com/blog/2017/1/31/clojure-2018-results">Clojure survey</a> CIDER was the primary development environment for 50% of survey respondents. Additionally, in our most recent survey, it featured highly as a project important to our members workflows. It is maintained by Bozhidar Batsov.</p>
<p>Bozhidar&rsquo;s plans for the next three months:</p>
<ul>
<li>Clean up CIDER internals</li>
<li>Improve ClojureScript support</li>
<li>Improve Orchard and friends (pigggieback, nREPL, cljs-tooling)</li>
</ul>
<h2 id="clojurescript">ClojureScript</h2>
<p>ClojureScript probably needs little introduction to most readers here. It is a dialect of Clojure that compiles to JavaScript to be able to target the browser, NodeJS, and the dozens of other platforms where JavaScript has a runtime. 83% of our members use ClojureScript in their work. We are funding Mike Fikes to continue his excellent work on the ClojureScript compiler. Mike is the number 2 or 3 <a href="https://github.com/clojure/clojurescript/graphs/contributors">contributor</a> to ClojureScript (depending on how you count).</p>
<p>Mike&rsquo;s plans for the next three months:</p>
<ul>
<li>Come up with a way to accommodate a recent change in the Closure Library that currently <a href="https://dev.clojure.org/jira/browse/CLJS-2702">prevents</a> ClojureScript from upgrading to newer versions of this library.</li>
<li>Work on some of the <a href="https://dev.clojure.org/jira/browse/CLJS#selectedTab=com.atlassian.jira.plugin.system.project%3Apopularissues-panel">most voted</a> ClojureScript feature requests and issues.</li>
<li>Work on issues related to NPM dependency management.</li>
<li>Continue my general work on providing patches for ClojureScript issues and general improvements.</li>
</ul>
<h2 id="funding-details">Funding details</h2>
<p>Each project receives a grant of $1,800USD/mo for three months.</p>
<h2 id="voting-details">Voting details</h2>
<p>As promised in our last update, our members have asked for more transparency around the voting results. The projects that applied were:</p>
<ul>
<li><a href="https://github.com/emil0r/ez-form">ez-form</a></li>
<li><a href="https://github.com/hoplon/hoplon">Hoplon</a></li>
<li><a href="https://github.com/viebel/klipse">Klipse</a></li>
<li><a href="https://github.com/thheller/shadow-cljs">Shadow CLJS</a></li>
<li><a href="https://github.com/sveri/closp">closp</a></li>
<li><a href="https://github.com/reagent-project/reagent">Reagent</a></li>
<li><a href="https://github.com/venantius/pyro">Pyro</a></li>
<li><a href="https://github.com/clojure/clojurescript">ClojureScript</a></li>
<li><a href="https://github.com/clojure-emacs/cider">CIDER</a></li>
</ul>
<p>The top 5 projects were:</p>
<ol>
<li>CIDER</li>
<li>ClojureScript</li>
<li>Reagent</li>
<li>Shadow CLJS</li>
<li>Pyro</li>
</ol>
<h2 id="q3-funding">Q3 Funding</h2>
<p>We had a bunch of good applications from great projects and would have liked to fund several more projects if we had more money. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, you are able to re-use that application to <a href="/open-source/">apply</a> for Q3. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q2 2018 Survey Results and Call For Proposals</title>
      <link>https://www.clojuriststogether.org/news/q2-2018-survey-results-and-call-for-proposals/</link>
      <pubDate>Wed, 11 Apr 2018 07:07:50 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q2-2018-survey-results-and-call-for-proposals/</guid>
      <description>We have recently run our second survey on our members to better understand them and their needs. We&amp;rsquo;re publishing these results so that they can see the aggregate results, and to give open source projects more information when applying for the Q2 2018 Clojurists Together funding round (closing 22 April).
Survey Responses There were 52 respondents to the survey, up from 27 in the last survey. The highlights are presented below.</description>
      <content:encoded><![CDATA[<p>We have recently run our second survey on our <a href="/members/">members</a> to better understand them and their needs. We&rsquo;re publishing these results so that they can see the aggregate results, and to give open source projects more information when <a href="/open-source/">applying</a> for the Q2 2018 Clojurists Together funding round (closing 22 April).</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 52 respondents to the survey, up from 27 in the last survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 50 (96%)</li>
<li>ClojureScript - 43 (83%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (96%)</li>
<li>ClojureScript Browser (79%)</li>
<li>ClojureScript Mobile (15%)</li>
<li>Clojure JVM Client (11%)</li>
<li>ClojureScript Node Server (11%)</li>
</ul>
<h3 id="in-which-domains-are-you-applying-clojure">In which domains are you applying Clojure?</h3>
<ul>
<li>Server side web applications (87%)</li>
<li>Client side web applications (67%)</li>
<li>Open source projects (52%)</li>
<li>Data integration (37%)</li>
<li>Commercial Services (33%)</li>
<li>Sysadmin/devops (25%)</li>
<li>Data science/math (23%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>There were three main things people were interested in: documentation (58%), build tooling (46%), and libraries (46%). After that, test tooling (28%), other tooling (20%), and online services (10%).</p>
<h3 id="which-projects-in-the-clojure-ecosystem-are-important-to-your-workflow">Which projects in the Clojure ecosystem are important to your workflow?</h3>
<!-- pbpaste | tr ',' '\n' | tr [A-Z] [a-z] | awk '{$1=$1};1' | sort  | uniq -c |sort -r -->
<p>This was a new question that we asked of our members, here are the projects that were mentioned at least three times:</p>
<ul>
<li>13 figwheel</li>
<li>10 cider</li>
<li>8 leiningen</li>
<li>7 re-frame</li>
<li>6 ring</li>
<li>5 spec</li>
<li>5 reagent</li>
<li>5 core.async</li>
<li>3 mount</li>
<li>3 datomic</li>
<li>3 compojure</li>
<li>3 clj-http</li>
</ul>
<h3 id="would-youhave-you-recommended-clojurists-together-to-a-friend">Would you/have you recommended Clojurists Together to a friend?</h3>
<p>Would you: 96% said yes, 4% said no.</p>
<p>Have you: 62% said yes, 38% said no.</p>
<h3 id="what-are-we-doing-well-what-could-we-be-doing-better">What are we doing well, what could we be doing better?</h3>
<p>Doing well:</p>
<ul>
<li>Supporting projects</li>
<li>Communication</li>
<li>Picking good projects to fund</li>
<li>Transparency</li>
</ul>
<p>Could do better:</p>
<ul>
<li>More transparency on project selection</li>
<li>Getting more companies to sign up and open their checkbooks/growing</li>
<li>Marketing</li>
<li>Support Google Summer of Code</li>
</ul>
<p>Based on these survey results, we&rsquo;ve made some changes to how we show which projects are selected, now all projects that applied are listed and we show the voting results for all projects with everything below the top 5 redacted.</p>
<p>If you&rsquo;d like to see more companies sponsor Clojurists Together, please reach out to them and encourage them to join.</p>
<h2 id="call-for-proposals">Call For Proposals</h2>
<p>If you are a maintainer of an open source Clojure project, we&rsquo;d encourage you to consider <a href="/open-source/">applying</a> for the Q2 funding round. If you maintain a project that was mentioned either directly, or as one of the survey respondents' focuses, then we&rsquo;d <em>highly</em> encourage you to consider applying. Applications will close on 22 April. If you know of a project that you think would be a good fit for Clojurists Together, please encourage them to apply. If you have any questions or would like any help with your application, please <a href="/contact">get in touch</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>April 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/april-2018-monthly-update/</link>
      <pubDate>Tue, 03 Apr 2018 20:36:31 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/april-2018-monthly-update/</guid>
      <description>Clojurists Together news This is the third and final update from clj-http and Figwheel. Both projects finished their work at the end of April. Both projects have done great work, and we are really impressed with what they&amp;rsquo;ve been able to achieve. We recently announced that we are funding CIDER and ClojureScript for our Q2 funding round. Those two projects have just started, we&amp;rsquo;ll have more details on what they&amp;rsquo;re working on next month.</description>
      <content:encoded><![CDATA[<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>This is the third and final update from clj-http and Figwheel. Both projects finished their work at the end of April. Both projects have done great work, and we are really impressed with what they&rsquo;ve been able to achieve. We recently <a href="/news/q2-2018-funding-announcement/">announced</a> that we are funding CIDER and ClojureScript for our Q2 funding round. Those two projects have just started, we&rsquo;ll have more details on what they&rsquo;re working on next month. If you&rsquo;d like to follow along with Mike Fike&rsquo;s work on ClojureScript, he has a <a href="https://gist.github.com/mfikes/e6673df98da49b8a87ffadbf3dea8cf4">public work log</a> up.</p>
<p>We continue to work on automating the sign-ups on the website, to make a faster and smoother flow for people who&rsquo;d like to join. If you&rsquo;d like to help out on that, or other issues, our site is now up on <a href="https://github.com/clojurists-together/clojuriststogether.org">GitHub</a>.</p>
<h2 id="clj-http-updates">clj-http updates</h2>
<h3 id="april-1---15">April 1 - 15</h3>
<p>Hello again Clojurists!</p>
<p>These past two weeks have been focused on two particular tasks for clj-http:</p>
<p>A user opened up <a href="https://github.com/dakrone/clj-http/issues/444">an issue</a> about clj-http&rsquo;s cookie policy configuration, talking about the documentation being incorrect with regard to plugging your own cookie policy in. I looked into this and discovered he was correct, the wrong part of cookie policies selection was configurable. I spent a while reading up on how Apache implements their cookie spec and cookie spec providers, and <a href="https://github.com/dakrone/clj-http/commit/2608c3014cf49a800999c43771a8fccd1bfce363">added a couple of new ways to configure the cookie parsing</a> in clj-http. These new options are the <code>:cookie-spec</code> and <code>:cookie-policy-registry</code> settings in the body. These settings will let someone either provide a spec provider (there are several that the Apache HTTP client makes available) or to complete write their own cookie spec (I&rsquo;ve also added documentation for how to do this). From there, a user has complete control over how cookies are parsed from headers, how the cookie values are validated, and how headers get transformed back into cookies.</p>
<p>The other thing I&rsquo;ve been focusing on has been the Apache 5.0 upgrade. I&rsquo;m happy to report that the <a href="https://github.com/dakrone/clj-http/compare/apache5-upgrade">apache5-upgrade branch</a> now compiles, and that you can use it in a REPL to perform requests! There are still some features that are commented out, as I have not yet discovered the equivalent 5.0 versions (there are <strong>many</strong> changes in the 5.0 upgrade and all the documentation has not been released). I&rsquo;ve been going through clj-http&rsquo;s tests to get them passing, but so far this is a much smoother transition than the 3.x -&gt; 4.0 upgrade in the past. While that upgrade took many, many months to transition to the new and un-deprecated APIs, I&rsquo;m hoping to be much more on top of this major release. Having this branch ready means that it will be a much shorter transition once the new Apache client version is out of beta and 5.0 is released.</p>
<p>That&rsquo;s it for these past two weeks!</p>
<h3 id="april-15---30">April 15 - 30</h3>
<p>Alright on to what I&rsquo;ve been up to in the last couple of weeks:</p>
<ul>
<li>A user opened <a href="https://github.com/dakrone/clj-http/issues/445">an issue asking for a cache config option</a> for the internal <code>HttpClient</code> in clj-http, so I looked into this and ended up <a href="https://github.com/dakrone/clj-http/commit/2843e45023850f63906aa976cbcffbb94204d8f0">adding support for transparent caching of requests from clj-http</a>. You can now specify <code>{:cache true}</code> in a request for it to use a cache. This cache is the Java equivalent of a browser cache and does all the required validation/expunging/etc as needed. In order to use caching you&rsquo;ll need to use a reusable connection manager and http-client (with the <code>:connection-manager</code> and <code>:http-client</code> parameters), and I&rsquo;ve added documentation about doing this in the readme. In a response the <code>:cached</code> key now is one of <code>nil</code>, <code>:CACHE_HIT</code>, <code>:CACHE_MISS</code>, <code>:CACHE_MODULE_RESPONSE</code>, or <code>:VALIDATED</code> to indicate whether the response was served from the cache or not.</li>
<li>I continued to work on getting tests to pass with the new Apache 5.0 Http client. I pushed commits fixing a lot invocation exceptions that were caused due to method renames from Apache changes. As part of driving this upgrade forward I&rsquo;ve made the <code>3.x</code> branch of clj-http the primary Github branch (so that is what shows up when visiting <a href="https://github.com/dakrone/clj-http/">https://github.com/dakrone/clj-http/</a>) and merged the <code>apache5-upgrade</code> branch to master. Things may be in a state of flux a bit more while I continue to work towards the new client, but by having it on master I hope to keep on top of the upgrade overall.</li>
<li>I pushed <a href="https://github.com/dakrone/clj-http/commit/d2914602c77c48db02dbf56e82972ec60cc1c32c">a commit</a> attempting to fix NTLM authentication, it turns out there are multiple places credential providers can be specified on the client, and setting it on the http client itself may help solve a situation where authentication wasn&rsquo;t working for a user.</li>
<li>In order to make sure the momentum from Clojurists Together is not lost, I&rsquo;ve added a <a href="https://gitter.im/clj-http/Lobby">Gitter room</a> for clj-http linked in the Readme for anyone that would like to ask questions in a more &ldquo;chat-like&rdquo; manner. I&rsquo;m hoping to receive more feature/enhancement requests from users that use clj-http to help keep development humming along, so please drop in if you have any comments or feedback you&rsquo;d like to leave. (or email always works too)</li>
<li>I&rsquo;d really like to add <a href="https://github.com/dakrone/clj-http/issues/446">code coverage</a> to clj-http so that I can make sure that the APIs have as much test coverage as possible, so I spent a while investigating the different tools this week. Unfortunately, there don&rsquo;t seem to be a lot of code coverage tools for Clojure currently, and the only one I was able to find I was not able to get working (if you know of one I should try, please do open an issue or hop into the Gitter room). This did, however, lead me to <a href="https://github.com/dakrone/clj-http/commit/edf6fe9d48eb1987709190d26432c299f679573a">add the lein-nvd plugin</a> for checking clj-http&rsquo;s dependencies against the National Vulnerability Database. It&rsquo;s important that clj-http does not rely on dependencies that have existing CVEs since I don&rsquo;t want to put anyone&rsquo;s systems at risk when using clj-http.</li>
<li>Finally, with this being the last report for cljtogether, I&rsquo;ve released clj-http <a href="https://github.com/dakrone/clj-http/tree/3.9.0">3.9.0</a> with all the most recent changes. This version includes the work for reusable http clients, asynchronous request future cancelling, supporting the <code>:cookie-spec</code> and <code>:cookie-policy-registry options</code>, the <code>:cache</code> options I mentioned above, as well as a fix for asynchronous connection pools putting the connection manager in an illegal ACTIVE state. Please try it out!</li>
</ul>
<p>Thank you Clojurists Together members again for your support of the project and the honor of being picked and being able to work on clj-http!</p>
<h2 id="figwheel-updates">Figwheel updates</h2>
<h3 id="april-1---15-1">April 1 - 15</h3>
<h4 id="complete-figwheel-repl-and-start-figwheel-main">Complete Figwheel REPL and start Figwheel Main</h4>
<p>During the last 20 days, I have put most of my energy into completing
Figwheel REPL.</p>
<p>The most difficult part of working on it was the design and trade-offs
that surrounded the server that is used for the REPL connection. In the
end, I settled on using the Jetty Server because it is the most
commonly used Ring server in the ecosystem.</p>
<p>Getting a nice design together so that the server can be used for both
a REPL connection and an initial development server was challenging. I settled on using ring-defaults along with some middleware that makes
the server smarter about caching compiled ClojureScript assets.</p>
<p>I&rsquo;m happy with the end product because it exposes all the
<code>ring.jetty.adapters/run-jetty</code> configuration options which in turn
should allow things like SSL support. It also exposes all of the <code>ring/ring-defaults</code> configuration options
as well, to allow configuration of common ring server middleware.</p>
<p>The final REPL also allows you to completely customize/replace the
what I am calling the <code>:ring-stack</code> (the ring-stack is what wraps the
<code>:ring-handler</code>) which is currently ring-defaults composed with some
extra middleware for Figwheel. Also, for the brave you can replace the
<code>:ring-server</code> itself, which would be a much more involved task.</p>
<p>Of course this setup will still also allow you to supply a
<code>:ring-handler</code> configuration option. You will still be able to use your own server for development and have
the Figwheel server operate as simple websocket server for REPL only
communication.</p>
<p>The Figwheel REPL also now serves a default <code>index.html</code> so that
establishing an initial REPL connection is a simple matter. Unfortunately the REPL is not complete yet, but the rest of its
development will be better informed by starting work on <code>figwheel-main</code>.</p>
<h4 id="figwheel-main">figwheel-main</h4>
<p>Work on figwheel-main has started and I&rsquo;m still getting my bearings on
getting the best behavior from it. Much like the work on the REPL the really hard part is getting a good
design.</p>
<p>The main idea driving figwheel.main is that it should provide all the
functionality of <code>cljs.main</code> in addition to figwheel functionality. I
want ClojureScript users to have less cognitive overhead when it comes
to tooling.</p>
<p>Figwheel main defaults to the <code>figwheel-repl</code> and adds a <code>--build</code> or
<code>-b</code> flag so that you can supply the name of a build. So the typical invocation would be:</p>
<pre><code>clj -m figwheel.main -b dev -r
</code></pre><p>This command will start the familiar figwheel experience.</p>
<p>In this case <code>dev</code> refers to a file named <code>dev.cljs.edn</code>.</p>
<p>The contents of which are:</p>
<pre><code>{:main example.core}
</code></pre><p>This is all the figwheel needs now. It will supply smart defaults for
<code>:output-to</code>, <code>:output-dir</code>, <code>:asset-path</code>. It will also supply a
smart default for what directory to watch.</p>
<p>So in other words you can have a development server, repl, figwheel
reloading, by just supplying a build edn file like above and a
<code>src/example/core.cljs</code>, and a <code>deps.edn</code>.</p>
<p>This much is working already, but there is still much more work to do. I&rsquo;m really hoping to get initial releases of these libraries out by
the end of the month.</p>
<h4 id="thanks-again">Thanks again!</h4>
<p>A big thanks to everyone for supporting this work!!</p>
<h3 id="april-15-30-figwheel-main---feature-complete-not-friendly-complete">April 15-30 Figwheel Main - Feature Complete not Friendly Complete</h3>
<h4 id="summary">Summary</h4>
<p>Figwheel Main now provides all the features of Figwheel Sidecar and
more. However, it is not yet as friendly as I am wanting it to be.</p>
<p>I&rsquo;m hoping to publish an alpha snapshot of Figwheel Main soon with a
more hardened one out by the end of May.</p>
<h4 id="a-rewrite">A Rewrite</h4>
<p>Figwheel initially evolved in an environment that was very different
from today. The ClojureScript compiler has changed a great deal, along
with the tooling landscape, and my experience writing Clojure.</p>
<p>Early code design decisions were made, with the objective of exploring
a relatively unknown problem space. The priority being was to get
these tools out to programmers sooner than later, not to write an
exemplary codebase.</p>
<p>The figwheel-main rewrite sheds oodles of accidental complexity
introduced by an earlier me. This earlier Bruce was attempting to
provide a design structure to give himself the illusion of control
over the problem. In reality, structure was only there to comfort, and
help me convince myself that I was doing things the &ldquo;right&rdquo; way. In
the end, this structure just made it difficult to evolve the codebase.</p>
<p>Side-note: Rewriting figwheel was a fantastic experience that allowed
my growing Clojure experience to guide me to much better solutions.</p>
<p>A rewrite has been an opportunity for me to address so many holes and
long running issues that would have been very hard to fix in Figwheel
Sidecar.</p>
<p>The first of these issues was to minimize the configuration that&rsquo;s
needed to get an initial ClojureScript development session up an
running. <code>figwheel-main</code> delivers this:</p>
<p>In your <code>deps.edn</code></p>
<pre><code>;; deps.edn
{:deps {com.bhauman/figwheel-main {:mvn/version &quot;0.1.0-SNAPSHOT&quot;}
 :paths [&quot;src&quot; &quot;target&quot;]]}
</code></pre><p>And on the command line:</p>
<pre><code>clojure -m figwheel.main
</code></pre><p>The above will launch a browser and connect a REPL to it, from here
you can do REPL driven development.</p>
<p>And if you want to in work on a particular build with figwheel style
reloading just add a build config file.</p>
<p>For example in <code>dev.cljs.edn</code></p>
<pre><code>{:main example.core}
</code></pre><p>And in <code>src/example/core.cljs</code></p>
<pre><code>(ns example.core)
(enable-console-print!)
(prn &quot;hello world!&quot;)
</code></pre><p>and run the command:</p>
<pre><code>clojure -m figwheel.main -b dev
</code></pre><p>You&rsquo;ll notice there is no need for an <code>index.html</code>, <code>:output-to</code>,
<code>:output-dir</code>, <code>:asset-path</code>, <code>:source-paths</code>, and oodles of other
configuration that is needed to get up an running with ClojureScript.</p>
<p>So little in fact, I&rsquo;m considering adding a <code>--gen</code> command line
option to add namespaces, index.html, and other initial config. I&rsquo;m
thinking these will be backed up by github gists.</p>
<p>This is a much needed clean up of the initial configuration to get
started with a hot loading ClojureScript environment. It is easier to
understandable and friendlier. I can&rsquo;t imagine what newcomers think
when they see the <code>project.clj</code> generated by <code>lein new figwheel</code> but
it certainly not a feeling of comfort.</p>
<p>Another thing I wanted to fix was the overall complexity of the
configuration options. The new configuration is also much simpler and
flatter.</p>
<p>There is a main configuration file: <code>figwheel-main.edn</code></p>
<p>For example:</p>
<pre><code>{:watch-dirs [&quot;src&quot; &quot;dev&quot;]
 :ring-server-options {:port 9500}}
</code></pre><p>And if you want to modify that configuration for an individual build
add meta-data to the build config file:</p>
<p>For example: in your <code>dev.cljs.edn</code></p>
<pre><code>^{:watch-dirs [&quot;src&quot;]
  :ring-server-options {:port 9501}}
{:main example.core}
</code></pre><p>This makes configuration much more understandable as there are no
longer two levels of config with different options available. Only one
level that can be overridden by a the meta-data on a build.</p>
<p>The use of meta-data here also enables you to effortlessly re-use the
configuration with <code>cljs.main</code> commands.</p>
<p>Another, major issue was the promiscuous REPL connections or &ldquo;where
the heck is this being evaluated?&rdquo;</p>
<p>As mentioned before the new REPL allow names the individual
connections and allows you to choose the connection so send
evaluations to. When you evaluate code in the REPL it only goes to one
connection unless you specify otherwise in your config.</p>
<p>Add to the above changes a long list of other improvements that I was
able to make with the introduction of <code>rebel-readline-cljs</code>,
<code>figwheel-repl</code> and <code>figwheel-core</code>.</p>
<p>The biggest feature is that the figwheel-main codebase is much much
smaller and much easier to grok. The new figwheel is now in a much
better position to move into the future and integrate with other
tooling.</p>
<p>I already have a long list of improvements that I want to make now
that the codebase much more approachable.</p>
<h4 id="conclusion">Conclusion</h4>
<p>I consider the Clojurists Together funding of Figwheel to be a
success! The funding gave me both an excuse and an opportunity to
really focus on Figwheel, and do the things that I knew needed to
happen for it to continue to provide value to the ClojureScript
community.</p>
<p>Much thanks goes to Daniel Compton and everyone who participated in
Clojurists Together.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>March 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/march-2018-monthly-update/</link>
      <pubDate>Tue, 03 Apr 2018 20:36:31 +1200</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/march-2018-monthly-update/</guid>
      <description>Hi folks!
Welcome to the second monthly update for Clojurists Together.
Clojurists Together news This month we had around 45 members sign up (we still need to process any signups at the end of this month), and one company member join. We&amp;rsquo;ve had a really strong response from individual contributors, but not so much from companies. If you work for a company that uses Clojure, please consider talking to your manager about supporting Clojurists Together.</description>
      <content:encoded><![CDATA[<p>Hi folks!</p>
<p>Welcome to the second monthly update for Clojurists Together.</p>
<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>This month we had around 45 members sign up (we still need to process any signups at the end of this month), and one company member join. We&rsquo;ve had a really strong response from individual contributors, but not so much from companies. If you work for a company that uses Clojure, please consider talking to your manager about supporting Clojurists Together. We recently conducted a survey of our members and will be publishing the results of the survey, and a request for proposals, for our second round of funding. More on that soon.</p>
<p>We continue to work on automating the sign-ups on the website, to make a faster and smoother flow for people who&rsquo;d like to join.</p>
<h2 id="clj-http-updates">clj-http updates</h2>
<p>From Lee Hinman:</p>
<h3 id="--march-1---march-15">- March 1 - March 15</h3>
<p>The last couple of weeks have seen the following changes in clj-http:</p>
<ul>
<li>I released clj-http 3.8.0. This includes many fixes and new features that were added in the first part of the Clojurists Together work, check out the <a href="https://github.com/dakrone/clj-http/blob/master/changelog.org#380">changelog</a> for the full list of changes that went into 3.8.0, one of the bigger releases!</li>
<li>A user requested a way to get the full HTTP request/response string for requests as sent on the socket level, I implemented the sending side of this by adding an option to override the socket factory, returning a socket <code>OutputStream</code> that captures the raw data so it can be inspected later. This is behind the new <code>:capture-socket</code> option. In future work I plan to add a way to capture data read in at the socket level (think curl&rsquo;s <code>-v</code> option).</li>
<li>It&rsquo;s not required for clj-http to build a new <code>HttpClient</code> object for every request, and up until a recent change there was no way to tell clj-http that you&rsquo;d like to reuse a particular client. With a commit this week you can now retrieve the HttpClient used and send your own with the <code>:http-client</code> parameter. This allows users to do more in-depth customization of the client without relying on the option being added in clj-http first. Part of this also includes polishing the client creation functions (for synchronous and asynchronous clients) that clj-http uses so they can be used by anyone using the library.</li>
<li>When performing an asynchronous http request, a cancellable BasicFuture is returned. However, this future did not cancel the HttpRequest object, it now aborts the HttpRequest and I&rsquo;ve added documentation around how to perform request cancellation (if for instance a certain timeout has been reached).</li>
<li><a href="https://github.com/ztellman/aleph">Aleph</a> uses some of clj-http middleware and ran into a problem this week with transit+json responses that were coming back empty. I spent a while triaging this and determining where aleph and clj-http diverge, discovering that this is not an issue with clj-http, so that&rsquo;s nice to hear.</li>
<li>Finally, I&rsquo;m working on setting up an environment to test NTLM credentials. A user reported that the NTLM currently implemented in clj-http wasn&rsquo;t working, so I need to have a way to reproduce this issue.</li>
</ul>
<p>That&rsquo;s it for this block!</p>
<h3 id="--march-15---march-30">- March 15 - March 30</h3>
<p>Here&rsquo;s what I&rsquo;ve been up to for the last couple of weeks:</p>
<ul>
<li>While Clojure has its own logging framework, the Apache HTTP client prefers to use log4j for logging. Since this can be an invaluable debugging tool I wrote documentation and example code for how to configure clj-http (or rather, a project using clj-http), see <a href="https://github.com/dakrone/clj-http/commit/1e530f7679c1497da6b845d4a52ff06c102e9ba0">this commit</a> for the work.</li>
<li>Speaking of logging, I am hoping it can help track down an issue I spent time trying to reproduce where the synchronous connection pool is <a href="https://github.com/dakrone/clj-http/issues/407">blocking forever</a> for a user.
Additionally, one I enabled the logging I notice that Apache is <a href="https://github.com/dakrone/clj-http/issues/443">logging an &ldquo;Illegal state ACTIVE&rdquo;</a> error when the integration tests are run. I spent quite a while tracking this one down and it ended with <a href="https://github.com/dakrone/clj-http/commit/10018154ae6db5db08751ce3f7bad96a20c35aa4">rewriting the way that asynchronous connection pools are handled</a>, no more error now!</li>
<li>Sometimes HTTP servers want to read a request&rsquo;s headers, then do something without dealing with the body of the request, for example, reading a header with some authorization token before consuming a large binary upload body. A user was running into an issue where instead of returning a 413 like the server told it to, it <a href="https://github.com/dakrone/clj-http/issues/277">throws an exception about the socket having its pipe broken</a> due to the connection being prematurely closed. Turns out there&rsquo;s an <a href="https://tools.ietf.org/html/rfc2616#section-8.2.2">RFC about this</a>, but it&rsquo;s unevenly implemented by browsers. To make things even more complicated, apache&rsquo;s http client incorrectly (throws the exception) handles it when used synchronously, but correctly returns the 413 when using asynchronously. I believe this is due to a difference in Apache&rsquo;s HTTP implementation. I&rsquo;m planning on revisiting this with the 5.0 client to see if the bug persists.</li>
<li>Speaking of the 5.0 client, I have <a href="https://github.com/dakrone/clj-http/tree/apache5-upgrade">started a branch called apache5-upgrade</a> for moving clj-http to be compatible with it. With compilation as the first target I have been working to get everything switched over to the new classes. Not everything is 1-to-1 and there are many breaking changes, but I have moved headers.clj, cookies.clj, multipart.clj, and a stripped-down version of conn_mgr.clj over to the new classes. Next up is core.clj and client.clj, the two biggest ones.</li>
</ul>
<p>Here&rsquo;s to more improvements in the future!</p>
<h2 id="figwheel-updates">Figwheel updates</h2>
<p>From Bruce Hauman:</p>
<h3 id="-march-1---march-15">-March 1 - March 15</h3>
<p><strong>Figwheel Core</strong></p>
<p>Today I published a <a href="https://github.com/bhauman/lein-figwheel/tree/master/figwheel-core"><code>figwheel-core</code></a> project to the master branch of
the <code>lein-figwheel</code> repository.</p>
<p>Figwheel-Core provides all the main code for determining what to
reload and how to reload/notify the client. It is completely
independent of the REPL and server implementations.
It only has one real dependency and that is ClojureScript itself. It uses the established <code>IJavaScriptEnv</code> interface for
communication with the client. This means it doesn&rsquo;t matter what your client is.</p>
<p><code>figwheel-core</code> really feels like a Figwheel thesis project for me, a
Rich Hickeyan distilling of Figwheel down to its essentials. It has
been a very rewarding experience.</p>
<p>This <code>figwheel-core</code> work has been my focus for the first half of
March. After this I&rsquo;m going to tackle a <code>figwheel-repl</code> which is
planned to be completely free of reloading code and will focus
on a strong stable connection and sane multiplexing.</p>
<p>Much thanks to Clojurists Together and its fantastic supporters!</p>
<h3 id="march-15---march-30">March 15 - March 30</h3>
<h4 id="figwheel-repl">Figwheel REPL</h4>
<p>Much like 2 weeks ago, I have published a <a href="https://github.com/bhauman/lein-figwheel/tree/master/figwheel-repl"><code>Figwheel-repl</code></a> project to
the master branch of the <code>lein-figwheel</code> repository.</p>
<p>Figwheel-REPL is <strong>only</strong> a ClojureScript <code>repl-env</code> and doesn&rsquo;t do anything specific to help with automatic file reloading. As such, it is more similar to Weasel in function than to Figwheel.</p>
<p>It is intended to be a single <code>repl-env</code> that will work on as many
platforms as possible: including Browser, Node, Worker, ReactNative,
etc. It is also intended to handle multiple clients, think browser tabs, much more gracefully than the current Figwheel REPL.</p>
<p>It is also different in that it only evaluates code on a single client
by default. You will still be able to choose to broadcast an eval
operation to all connected clients if you prefer. You can also provide
a filter function when you create the Figwheel repl-env, to filter the
connections to the set of connected clients you want an eval operation
to be sent to.</p>
<h4 id="multiple-repl-behavior">Multiple REPL behavior</h4>
<p>The new <code>figwheel.repl</code> namespace currently offers some ClojureScript
functions to help you list and choose which connected client to focus on.</p>
<p>The <code>figwheel.repl/conns</code> macro allows you to list the connected clients:</p>
<p>For example:</p>
<pre><code>cljs.user&gt; (figwheel.repl/conns)
Will Eval On:  Darin
Session Name     Age URL
Darin            25m /figwheel-connect
Judson          152m /figwheel-connect
nil
</code></pre><p>The above <code>figwheel.repl/conns</code> call lists the clients available for the REPL to target.</p>
<p>All connections are given easy to remember session names. The
intention is that this will help you easily identify which browser tab
your, through the REPL client feedback in the browsers dev-tool
console.</p>
<p>The <code>Will Eval On: Darin</code> indicates that the <code>Darin</code> client is where
the next eval operation will be sent to because this is currently the
<strong>youngest</strong> connected client.</p>
<p>This <strong>youngest client</strong> heuristic for choosing which client to
evaluate on, allows for a simple understanding of which REPL is the
current target of eval operations. Open a new browser tab, or start an
new node instance and that becomes the new eval target.</p>
<p>If you want to focus on a specific client:</p>
<pre><code>cljs.user&gt; (figwheel.repl/focus Judson)
Focused On: Judson
</code></pre><p>From now on all evals will go to <code>Judson</code> unless the connection to
<code>Judson</code> is lost in which case the behavior will revert to selecting
the youngest connection.</p>
<p>You can confirm that the repl is currently focused with:</p>
<pre><code>cljs.user&gt; (figwheel.repl/conns)
Focused On: Judson
Session Name     Age URL
Darin            28m /figwheel-connect
Judson          155m /figwheel-connect
nil
</code></pre><p>I think this goes a long way toward solving a problem that has existed
since the very beginning of Figwheel.</p>
<h4 id="attention-toward-embedding-the-figwheel-repl-endpoint">Attention toward embedding the figwheel-repl endpoint</h4>
<p>The other problem that I&rsquo;m currently trying to work out is how to best
support embedding the Figwheel REPL endpoint in your server.</p>
<p>For larger projects it simplest to use figwheel connection as a
side-channel, a separate REPL connection, that is distinct from your
projects HTTP server. Figwheel&rsquo;s use of Web-sockets and CORS make this
side connection a simple matter. But inevitably there are situations
where you want to embed the Figwheel endpoint in your server. So I&rsquo;m
giving this some serious attention.</p>
<p>In addition to the Web-socket connection, I have implemented a simple
HTTP polling connection which should allow anyone to embed
figwheel-repl ring middleware into their stack. (Side note: I&rsquo;m also
looking at long polling).</p>
<p>It is too bad that as a community we haven&rsquo;t landed on an agreed upon
Ring web-socket interface, as this makes it much harder to allow simple
embedding of a web-socket endpoint into the server of your choice. But
I&rsquo;m going to do my best to facilitate this by making it easier to
create a web-socket endpoint from the provided api.</p>
<p>On a side note: I&rsquo;m also considering making the default server a the
<code>ring.jetty.adapter</code> as it is such a common dependency.</p>
<h4 id="work-for-the-last-month-of-clojurists-together">Work for the last month of Clojurists Together</h4>
<p>My work over the next month is to complete both <code>figwheel-repl</code> and <code>figwheel-core</code>.</p>
<p>I&rsquo;m hoping that I can also finish a <code>figwheel-main</code> (a proxy for
cljs.main) to tie it all together. My intention for <code>figwheel-main</code> is
that it will the most important functionality of figwheel-sidecar but
will follow the <code>cljs.main</code> arg conventions. It will provide solid
file watching capabilities along with a solid figwheel-repl connection
and make it trivial to turn on auto file reloading.</p>
<p>I&rsquo;m excited by what amounts to a completely new Figwheel, which
will be a simpler Figwheel minus a tremendous amount of complexity.</p>
<h2 id="minutescommittee-communications">Minutes/Committee Communications</h2>
<p>In our recent survey and in previous member communications, a few people have mentioned that they&rsquo;d like to have more visibility into how the projects are chosen. We had chosen not to show the voting results for the projects that didn&rsquo;t get in, as we didn&rsquo;t want unsuccessful applicants to feel bad if the results were released showing that their project wasn&rsquo;t selected. We have a few changes planned to increase transparency without discouraging applicants:</p>
<ul>
<li>Show the voting results and voting rounds for all applications, but redact the names of all projects but the top 5</li>
<li>List all projects that applied.</li>
</ul>
<p>These two measures should help backers understand how we voted. If you have any thoughts on this, either as a backer or an open source contributor, please get in touch.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>February 2018 Monthly Update</title>
      <link>https://www.clojuriststogether.org/news/february-2018-monthly-update/</link>
      <pubDate>Fri, 02 Mar 2018 08:42:41 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/february-2018-monthly-update/</guid>
      <description>Hi folks!
Welcome to the first monthly update for Clojurists Together. Now that things are a bit more settled, we are going to be issuing more regular updates keeping you up to date with what is going on with Clojurists Together.
Clojurists Together news In February we had three new company members, and 25 new developer members sign up. In total, we were supported by 14 companies, and 75 developers. We are really thrilled with how developers and companies are responding to Clojurists Together and the two projects that were selected for the first funding round: clj-http and Figwheel.</description>
      <content:encoded><![CDATA[<p>Hi folks!</p>
<p>Welcome to the first monthly update for Clojurists Together. Now that things are a bit more settled, we are going to be issuing more regular updates keeping you up to date with what is going on with Clojurists Together.</p>
<h2 id="clojurists-together-news">Clojurists Together news</h2>
<p>In February we had three new company members, and 25 new developer members sign up. In total, we were supported by 14 companies, and 75 developers. We are really thrilled with how developers and companies are responding to Clojurists Together and the two projects that were <a href="/news/q1-2018-funding-announcement/">selected</a> for the first funding round: clj-http and Figwheel. We have updates below from Lee Hinman (clj-http) and Bruce Hauman (figwheel), talking about what they&rsquo;ve been working on this month.</p>
<h2 id="clj-http-updates">clj-http updates</h2>
<p><strong>&ndash; February 1 - Feb 15</strong></p>
<p>Hi Clojurists, here&rsquo;s my report for the past two weeks.</p>
<p>First, many PRs from the community were merged:</p>
<ul>
<li><a href="https://github.com/dakrone/clj-http/pull/426">#426</a> to fix the socks proxied connection managers (an argument was not being passed correctly)</li>
<li><a href="https://github.com/dakrone/clj-http/pull/424">#424</a> added a :mime-subtype parameter so the particular type for multipart requests can be specified</li>
<li><a href="https://github.com/dakrone/clj-http/pull/422">#422</a> added :http-multipart-mode which allows selecting which type of multipart mode is used (defaulting to strict)</li>
<li><a href="https://github.com/dakrone/clj-http/pull/428">#428</a> fixed a minor issue in the readme related to &ldquo;unexceptional statuses&rdquo;</li>
<li><a href="https://github.com/dakrone/clj-http/pull/432">#432</a> added a test for an issue fixed by updating the apache dependencies where multipart pieces didn&rsquo;t work when using the async client</li>
</ul>
<p>Next, I spent quite a while on a tricky bug when nested query params are specified in addition to form params leading to the encoding of the body being incorrect. This led to <a href="https://github.com/dakrone/clj-http/commit/47a7762ed42e1d772e51a6f5bdaa61b436b54cb3">adding some parameters</a> to allow fine-grained control over whether or not to flatten <code>:query-params</code> and <code>:form-params</code>.</p>
<p>I also added a way that users can modify the http client in arbitrary ways. This <a href="https://github.com/dakrone/clj-http/commit/2ab22cb75841c712997dc57bfc3e393cdbcd41d1">added</a> the <code>:http-builder-fns</code> and <code>:async-http-builder-fns</code> so users aren&rsquo;t blocked if they need to make low-level changes to the http client builders directly.</p>
<p>I went through all boolean flags clj-http currently supports and changed them to use the utility method so users can use things like <code>:insecure true</code> or <code>:insecure?</code> true without having to remember the <code>?</code> suffix.</p>
<p>Updated the readme as it was a little out of date, and added a CONTRIBUTING.md document</p>
<p><strong>&ndash; February 15 - Feb 28</strong></p>
<p>Hi Clojurists (together!),
Here&rsquo;s the report for what I&rsquo;ve been up to for the last two weeks:</p>
<ul>
<li>I worked on an issue where redirects to an invalid location (<code>https:///</code> in the example a user was running into) caused an asynchronous request to hang forever, rather than either returning an error or failing. <a href="https://github.com/dakrone/clj-http/pull/435">#435</a> added the :validate-redirects option to disable this extra validation</li>
<li>I wrote a <a href="https://github.com/dakrone/clj-http/blob/master/SSL.org">guide</a> that a user <a href="https://github.com/dakrone/clj-http/issues/376">requested</a> on how to use clj-http with a self-signed certificate so that they could test locally without turning on the :insecure option.</li>
<li>I started experimenting with the Apache 5.0 client. This new major version supports HTTP 2, however, it&rsquo;s a major change and breaks a lot of clj-http&rsquo;s code so the work is still ongoing.</li>
<li>I made the cookie policy selection pluggable by the user, a user can now extend the get-cookie-policy method to allow selecting their own cookie policy for validation.</li>
<li><a href="https://github.com/dakrone/clj-http/issues/257">#257</a> I fixed an issue where if a server returned an empty response with headers indicated the body was gzipped, and the client requested that the body be coerced, an EOFException would be thrown trying to decode the empty response. This is now fixed by doing a pre-read phase where we tentatively attempt to read the stream, gracefully handling the situation where we it cannot be read.</li>
<li>Finally, I triaged all of the existing clj-http issues, there were around ~35 open issues, there are now 16 open issues and they are labeled accordingly. Hopefully this helps any new contributors since stale or over-old issues are no longer an issue.</li>
</ul>
<h2 id="figwheel-updates">Figwheel updates</h2>
<p><strong>&ndash; February 1 - 15</strong></p>
<p>When I first created the Figwheel REPL I really wanted to include a readline library so that when folks ran <code>lein figwheel</code> they would get a REPL with readline editing enabled and wouldn&rsquo;t have to futz with an external readline program like <code>rlwrap</code>. I attempted to create one with JLine but it was really impractical and there was very little in the way of JLine documentation.</p>
<p>Time has passed and things have changed, over the last month and a
half I have written <a href="https://github.com/bhauman/rebel-readline">Rebel Readline</a> to provide a readline functionality for Clojure and ClojureScript.</p>
<p>The benefit of only needing to run <code>lein figwheel</code> to get into a nice comfy REPL with full featured terminal editing can&rsquo;t be overstated. It will provide newcomers and old hands alike a more worthy environment to work in and reduce the frustration of trying to explore ClojureScript in such an impoverished environment. I&rsquo;ve also written a <a href="https://github.com/bhauman/rebel-readline/blob/master/rebel-readline/doc/intro.md">longer explanation</a> of about why I wrote Rebel Readline.</p>
<p>I have been working full time for the last two weeks on trying to get Rebel Readline to a point where I can integrate it into Figwheel. A few days ago I finally got this done in this figwheel <a href="https://github.com/bhauman/lein-figwheel/commit/55de952de19eb69e1f121f21f69d8b8a6fc0eda2">commit</a>.</p>
<p>I have spent more time trying to fix the CLJS language interaction in Rebel Readline. Inline eval was broken and I actually just fixed that this morning.</p>
<p>There are some completion issues still and a Figwheel specific output issue that can create a weird experience when you print things from the repl. I&rsquo;m going to work on these next.</p>
<p>Even with these flaws I think it is a significant and welcome change to Figwheel. A change that in total took about a month and a half of full time work, so far :)</p>
<p><strong>Other things:</strong></p>
<p>I spent some time thinking about the architecture and future design of Figwheel.</p>
<p>I wrote a brainstorming document outlining some design ideas. The main take away for me is that the major parts of Figwheel on the client side and the server/compile side should be able to communicate solely through a standard CLJS ReplEnv. In other words, you should be able to require figwheel on the client and then call the figwheel.client.cljs functions trigger the various client behavior. This constraint should provide compiler-side and client-side libraries that are decoupled from the rest of the Figwheel code base. Once these libs take shape, I can focus on creating a better CLJS ReplEnv, possibly one that doesn&rsquo;t have to communicate over a web-socket.</p>
<p>Also the advent of pREPL will provide a good example of a better
foundation for communication design in Figwheel&rsquo;s strange multiplexed REPL environment. This could potentially provide a good solution to the multiple client behavior of the Figwheel REPL. The goal being, that you can switch between clients and know which browser client sent the result you are looking at.</p>
<p>I also spent some time thinking about the interaction between figwheel and Clojure CLI tools. It is pretty clear that there should be a <code>figwheel-sidecar.main</code> that mirrors the behavior of <code>lein figwheel</code>. The idea is that you will be able to start figwheel with <code>clj -m figwheel-sidecar.main dev</code></p>
<p>Yesterday I explored the relationship between figwheel and the new <code>cljs.main</code> that is under development. I was able to
proof-of-concept a <code>cljs.repl.figwheel</code> that will give you a full
blown Figwheel with the new rebel-readline experience all from a
standard <code>cljs.main</code>. So it will be possible to type <code>clj -m cljs.main -re figwheel</code> and this will read from the <code>figwheel.edn</code> and create a complete figwheel environment. I&rsquo;ve recorded an <a href="https://asciinema.org/a/163042">asciinema screencast</a> demonstrating this.</p>
<p>Now how much of this I will get done before the end of April is
anybody&rsquo;s guess. But I&rsquo;m excited to be working on it&hellip;</p>
<p>Big thanks to Clojurists Together!</p>
<p><strong>&ndash; February 15 - February 28</strong></p>
<p>Today I finally released <a href="https://github.com/bhauman/lein-figwheel/releases/tag/v0.5.15">Figwheel 0.5.15</a> and the initial release of <a href="https://github.com/bhauman/rebel-readline/releases/tag/v0.1.1">Rebel Readline 0.1.1</a>.</p>
<p>The work for the last 15 days has included working out the final
hiccups with integrating Rebel Readline into Figwheel. This involved looking at how the Figwheel REPL handled printing. A significant improvement to Figwheel came out of this. Now when you type <code>(prn 1)</code> at the REPL prompt you will only get a single <code>1</code> printed at the output.</p>
<p>I also spent a significant amount of time making sure that the
readline worked on Windows. I had to use my wife&rsquo;s older windows laptop for this. It was the familiar painful process of having to ferry code from my development machine to the Windows machine to see if code fixes were working. In this process I also fixed color output on Windows. Figwheel detects what kind of terminal you are in and provides ANSI color codes only if the terminal can handle it.The upshot of this is that Figwheel is working better than it ever has on Windows.</p>
<p>There was also a significant investment into refactoring rebel
readline into a much better architecture. I have noticed when I
greenfield new projects, the initially chosen namespaces turn out to not really represent the actual dependency structure of the final system. So I spent some time refactoring rebel into a much more sensible layout.</p>
<p>I also made changes so that one can easily nest a ClojureScript REPL inside of a Clojure REPL and still have all the Rebel Readline features work for the ClojureScript REPL.  This work should allow arbitrary nesting of readline capable programs.</p>
<p>I also spent some time working with the ClojureScript core team
because they are working on cljs.main. It seemed important to get
involved here because cljs.main is positioned to be the core command line experience for ClojureScript. My contributions here were to ask that the watcher can launch on a background thread, so that the REPL can run at the same time. I also promoted the use of a default HTML page so that the browser REPL can simply launch. Both of these features provide a very Figwheel like experience to the core ClojureScript experience. I&rsquo;m going to continue to be part of the cljs.main conversation as it progresses over the next few months.</p>
<p>As an investigation into the new Figwheel architecture I created a
proof of concept minimal Figwheel <a href="https://gist.github.com/bhauman/d731eb4cb54fa187c341aec75f62dd83">gist</a> that demonstrates a very simple but capable Figwheel implementation that only uses the CLJS REPL for communication.</p>
<p>The success of this experiment lead to an important <a href="https://github.com/clojure/clojurescript/commit/0f2a407ef6169da2836d560f5ad72527635f9606">commit</a> to
ClojureScript (<a href="https://dev.clojure.org/jira/browse/CLJS-2581">CLJS-2581</a>) that will allow simple tooling communication with the client JavaScript environment using eval. There are a lot of
possibilities here.</p>
<p><strong>&ndash;  Next &ndash;</strong></p>
<p>Going forward I am looking at working on a <code>figwheel-sidecar.main</code> so that Figwheel can easily be used with the Clojure CLI tools.</p>
<p>I&rsquo;m also going to be spending some time refactoring the Figwheel client so that it will work with any CLJS REPL.</p>
<p>I will then focus on refactoring how to get the compile side information to trigger reloads so that it isn&rsquo;t dependent on the
current figwheel architecture.</p>
<p>So there will be two sides, the client and compile sides, and they
will just rely on the information that would only be available to
anyone running a compiler or a client would have available.</p>
<p>This will free the core of Figwheel from the mass of complected code that is Figwheel now. This should make incorporating figwheel behavior into Boot or cljs.main a trivial matter.</p>
<h2 id="minutescommittee-communications">Minutes/Committee Communications</h2>
<p>This month we made the definitive decision that projects will be paid in a grant fashion and not an hourly rate. We had had some concerns from people about the high hourly rate that we were paying projects, and moving to a grant also better reflects the intention of what we are trying to do with Clojurists Together&rsquo;s funding.</p>
<p>We also had a meeting with SFC to discuss preparing grant reports for each project we have funded, automating more of the day-to-day management of the project, and setting a budget to forecast for the year ahead.</p>
<h2 id="payments">Payments</h2>
<ul>
<li>We have allocated $1,800 this month to pay both projects ($3,600 total). <strong>N.B.</strong> The amount we pay projects is set based on our income from the previous three months. At the time of starting a funding cycle, we have the cash on hand to honour our commitments for the full cycle, even if everyone cancelled their membership at once 😱.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2018 Funding Announcement</title>
      <link>https://www.clojuriststogether.org/news/q1-2018-funding-announcement/</link>
      <pubDate>Wed, 07 Feb 2018 16:41:59 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2018-funding-announcement/</guid>
      <description>Clojurists Together is excited to announce the two projects that are being funded in Q1 2018: clj-http and Figwheel!
Recap For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This is our first funding cycle since launching.</description>
      <content:encoded><![CDATA[<p>Clojurists Together is excited to announce the two projects that are being funded in Q1 2018: clj-http and Figwheel!</p>
<h2 id="recap">Recap</h2>
<p>For those who are new to Clojurists Together, our goal is simple: Fund critical Clojure open-source projects to keep them healthy and sustainable. Clojure companies and individual developers sign up for a monthly contribution, and we pick projects to fund each quarter. This is our first funding cycle since launching.</p>
<h2 id="clj-http">clj-http</h2>
<p><a href="https://github.com/dakrone/clj-http">clj-http</a> is one of the most popular Clojure open source projects, with over 3 million downloads on Clojars. It is maintained by Lee Hinman. It&rsquo;s used by quite a few other clients as a base HTTP client.</p>
<p>Lee&rsquo;s plans for the next three months:</p>
<blockquote>
<p>&ldquo;I&rsquo;d like some dedicated time to addressing bugs and adding new features that has slowed down a bit in the past. Recently it had to move away from deprecated APIs, and while most of the functionality was kept, there is still a lot of cleaning up to do and missing features that need to be re-implemented.</p>
<p>Recently there was also async support merged, and this needs to be enhanced so it can be a first-class usage of clj-http. Additionally, there is a lot of features that the Apache HTTP client exposes that clj-http doesn&rsquo;t nicely encapsulate. It would be great if these could be available to developers.&rdquo;</p>
</blockquote>
<h2 id="figwheel">Figwheel</h2>
<p><a href="https://github.com/bhauman/lein-figwheel">Figwheel</a> is one of ClojureScript&rsquo;s secret weapons, enabling ridiculously high productivity via live-reloading ClojureScript code. It is maintained by Bruce Hauman. It is one of the most used ClojureScript tools in the community.</p>
<p>Bruce&rsquo;s plans for the next three months:</p>
<blockquote>
<p>&ldquo;The Figwheel codebase is an exploration of the problem space of creating a friendly ClojureScript. As a UI to ClojureScript the codebase is complex and complected.</p>
<p>I would love to devote a solid 3 months to working solely on Figwheel. I would like to revisit its functionality and condense it down into an architecture and a set of libraries that will allow it to be reused in other contexts (i.e boot etc.) more easily. For example: other projects should be able to use a figwheel&rsquo;s compiler wrapper that produces attractive error messages, or perhaps just figwheel&rsquo;s error message parsing code.</p>
<p>I would also us the time to explore feedback for spec errors at runtime.</p>
<p>Most importantly, I&rsquo;d like to set Figwheel up for a long future of service to the Clojure community.&rdquo;</p>
</blockquote>
<h2 id="funding-details">Funding details</h2>
<p>When we announced Clojurists Together, we had planned to offer the successful projects funding at $150/hour for a specified number of hours (dependent on funds). After discussions with Software Freedom Conservancy, our host organisation, we have changed this to be a fellowship style grant, similar to the <a href="https://open.segment.com/fellowship">Segment Open Source Fellowship</a>. In practice this amounts to the same thing: funding open source developers to improve their projects. For this funding cycle, each project is receiving $1,800USD/mo for three months.</p>
<h2 id="q2-funding">Q2 Funding</h2>
<p>We had a bunch of good applications from great projects and would have liked to fund several more projects if we had more money. If you&rsquo;d like to see more projects get funded, then please join. If you applied for the last funding cycle, you are able to re-use that application to <a href="/open-source/">apply</a> for Q2. If you maintain a Clojure/ClojureScript project that is important to the community, consider applying for funding so we can help you keep it sustainable.</p>
<p>Lastly, a big thank you to all of our <a href="/members/">members</a>. We couldn&rsquo;t have done it without your support.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Q1 2018 Update and Survey Results</title>
      <link>https://www.clojuriststogether.org/news/q1-2018-update-and-survey-results/</link>
      <pubDate>Thu, 01 Feb 2018 10:07:50 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/q1-2018-update-and-survey-results/</guid>
      <description>Welcome to the first Clojurists Together update for 2018! We have recently run a survey on our members to better understand them and their needs. We are currently working in the process of finalising the projects we will fund and will have an announcement soon. In the meantime, we wanted to share the results of the survey to help future applicants see what our areas of focus are.
New Members Since our announcement we have had 11 companies and 50 developers join up.</description>
      <content:encoded><![CDATA[<p>Welcome to the first Clojurists Together update for 2018! We have recently run a survey on our <a href="/members/">members</a> to better understand them and their needs. We are currently working in the process of finalising the projects we will fund and will have an announcement soon. In the meantime, we wanted to share the results of the survey to help future applicants see what our areas of focus are.</p>
<h2 id="new-members">New Members</h2>
<p>Since our announcement we have had 11 companies and 50 developers join up. A very special thanks to Transduce member <a href="https://centriqhome.com">Centriq</a>, and Filter members <a href="https://juxt.pro">JUXT</a> and <a href="http://metosin.fi">Metosin</a>.</p>
<h2 id="survey-responses">Survey Responses</h2>
<p>There were 27 respondents to the survey. The highlights are presented below.</p>
<h3 id="which-clojure-dialects-do-you-regularly-use">Which Clojure dialects do you regularly use?</h3>
<ul>
<li>Clojure - 27 (100%)</li>
<li>ClojureScript - 18 (66%)</li>
<li>Clojure CLR - 0 (0%)</li>
</ul>
<h3 id="which-platforms-do-you-target">Which platforms do you target?</h3>
<ul>
<li>Clojure JVM Server (92%)</li>
<li>ClojureScript Browser (74%)</li>
<li>ClojureScript Mobile (22%)</li>
<li>Clojure JVM Client (11%)</li>
<li>ClojureScript Node Server (4%)</li>
</ul>
<h3 id="in-which-domains-are-you-applying-clojure">In which domains are you applying Clojure?</h3>
<ul>
<li>Server side web applications (82%)</li>
<li>Client side web applications (70%)</li>
<li>Open source projects (48%)</li>
<li>Commercial Services (30%)</li>
<li>Data science/math (26%)</li>
<li>Data integration (26%)</li>
</ul>
<h3 id="what-areas-of-clojure-would-you-like-to-see-improvement-in">What areas of Clojure would you like to see improvement in?</h3>
<p>Documentation was the clear focus of respondents, with 67% wanting to see documentation improvements, 37% wanted to see library improvements, 33% wanted to see build tooling improve, 30% wanted to see test tooling improve.</p>
<h3 id="how-likely-is-it-that-you-would-recommend-clojurists-together-to-a-friend-or-colleague">How likely is it that you would recommend Clojurists Together to a friend or colleague?</h3>
<p>Clojurists Together got a Net Promoter Score of 12 in this survey (above 0 is good, above 50 is great). We&rsquo;d like to improve this, and got some great suggestions on ways that we can improve in the future.</p>
<p>Three key items that came up were:</p>
<ol>
<li>To be able to pay with a credit card directly without going through PayPal. We&rsquo;d really like to be able to offer this, and are working with the Software Freedom Conservancy to find a good way to do this, while working within the constraints of being part of a larger foundation.</li>
<li>More frequent communications. Now that we have the first funding cycle going, we will be publishing more frequent updates on its progress, as well as other things that we&rsquo;re doing.</li>
<li>More transparency of communication and policies. This will be partly addressed by more frequent communications, and we were asked for more clarity around how projects are funded, so we&rsquo;ll be updating our site with more details around this.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>If you work for a company that uses Clojure commercially, and you&rsquo;re not a member, please consider joining, either with a <a href="/companies/">company membership</a>, or an <a href="/developers/">individual membership</a>. If you are already a <a href="/members/">member</a>, thanks so much for your support, we couldn&rsquo;t do it without you.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Introducing Clojurists Together</title>
      <link>https://www.clojuriststogether.org/news/introducing-clojurists-together/</link>
      <pubDate>Mon, 13 Nov 2017 13:42:56 +1300</pubDate>
      
      <guid>https://www.clojuriststogether.org/news/introducing-clojurists-together/</guid>
      <description>Keeping Clojure open source sustainable The Clojure ecosystem is built on open source. From the Clojure and ClojureScript projects, to the build tools, web frameworks, and the hundreds of innovative and useful libraries that we all depend on every day. The pervasive use of open source has enabled a flourishing Clojure ecosystem, but it also has some hidden downsides. The vast majority of Clojure projects are maintained by a small handful of people, often only one person.</description>
      <content:encoded><![CDATA[<h3 id="keeping-clojure-open-source-sustainable">Keeping Clojure open source sustainable</h3>
<p>The Clojure ecosystem is built on open source. From the Clojure and ClojureScript projects, to the build tools, web frameworks, and the hundreds of innovative and useful libraries that we all depend on every day. The pervasive use of open source has enabled a flourishing Clojure ecosystem, but it also has some hidden downsides. The vast majority of Clojure projects are maintained by a small handful of people, often only one person. If they are not sponsored by their day job to work on the open source projects, then the time maintaining the project, responding to issues and pull requests, and support requests falls to nights and weekends, taking time away from friends and family.</p>
<p>Across the entire open source ecosystem, there is a growing recognition that the <a href="http://nadiaeghbal.com/oss/">current model of open source is not sustainable</a>. More and more, maintainers are suffering from <a href="https://www.kennethreitz.org/essays/the-reality-of-developer-burnout">burnout</a>, or quitting the project entirely. Important projects can languish because the original maintainers no longer have time to work on them, or no longer use them themselves, or for any of many possible work or non-work related reasons..</p>
<h3 id="introducing">Introducing&hellip;</h3>
<p>Today, we are announcing Clojurists Together, an organisation designed to fund and support critical open source Clojure projects. Clojurists Together goal is to ensure that open source projects that are important to the Clojure community continue to be maintained and improved. We will do that by funding project maintainers to work on these projects. Clojurists Together follows the model of <a href="https://rubytogether.org">Ruby Together</a>, where companies and individuals collectively sponsor a central organisation (Clojurists Together), which then distributes the money to open source Clojure projects.</p>
<h3 id="how-it-works">How it works</h3>
<p>Every quarter Clojurists Together collects feedback from members about which projects and areas are important to them, and they would like to see supported. At the same time, Open source project maintainers can <a href="/open-source">apply</a> for funding for the next quarter. The <a href="/team">Clojurists Together committee</a> then looks at the feedback from members, the applications from projects, and picks the projects that they think can have the biggest impact on the Clojure community. Every month, Clojurists Together reports on the progress the projects are making and where your money has gone.</p>
<h3 id="next-steps">Next steps</h3>
<ul>
<li>If you are an open source project maintainer, <a href="/open-source">apply</a> for the next funding round. We haven&rsquo;t got the exact dates for the start of the next funding round picked, but it will probably be in the next month or so. We&rsquo;ll send a reminder in the usual channels before applications close.</li>
<li>If you are a developer at a company that uses Clojure, please talk to your manager/decision maker about signing up for a <a href="/companies">company membership</a>. You can also sign up for a <a href="/developers">developer membership</a>.</li>
<li>If you are a decision maker at a company that uses Clojure, please consider signing up for a <a href="/companies">company membership</a> to Clojurists Together, to ensure that the foundation your business is built on stays solid. For the next month, any company that signs up will be recognised as a founding member on the <a href="/members">members page</a>.</li>
<li>If you are an individual Clojure developer, you can sign up for a <a href="/developers">developer membership</a>.</li>
<li>If you have more questions, read the <a href="/faq">FAQ</a> and the other pages on the site, otherwise please <a href="/contact">contact</a> us.</li>
<li>Give us feedback on what you think could be changed, improved, removed, e.t.c. Clojurists Together exists to serve the Clojure community, but for us to do that well we need to hear from you.</li>
</ul>
]]></content:encoded>
    </item>
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  </channel>
</rss>
