<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Colin Copeland on Caktus Group</title><link>https://www.caktusgroup.com/authors/colin-copeland/</link><description>Recent content in Colin Copeland on Caktus Group</description><generator>Hugo</generator><language>en</language><lastBuildDate>Tue, 16 Dec 2025 08:00:00 -0500</lastBuildDate><atom:link href="https://www.caktusgroup.com/authors/colin-copeland/index.xml" rel="self" type="application/rss+xml"/><item><title>PydanticAI Agents Intro</title><link>https://www.caktusgroup.com/blog/2025/12/16/pydanticai-agents-intro/</link><pubDate>Tue, 16 Dec 2025 08:00:00 -0500</pubDate><guid>https://www.caktusgroup.com/blog/2025/12/16/pydanticai-agents-intro/</guid><description>&lt;p>In previous posts, we explored function calling and how it enables models to interact with external tools. However, manually defining schemas and managing the request/response loop can get tedious as an application grows. Agent frameworks can help here.&lt;/p></description></item><item><title>LLM Basics: Ollama Function Calling</title><link>https://www.caktusgroup.com/blog/2025/12/03/learning-llm-basics-ollama-function-calling/</link><pubDate>Wed, 03 Dec 2025 19:42:14 +0300</pubDate><guid>https://www.caktusgroup.com/blog/2025/12/03/learning-llm-basics-ollama-function-calling/</guid><description>&lt;p>In our &lt;a href="https://www.caktusgroup.com/blog/2025/12/01/learning-llm-basics-openai-function-calling/">previous post&lt;/a>, we introduced function calling and learned how to do it with OpenAI&amp;rsquo;s LLMs.
In this post, we&amp;rsquo;ll call the same &lt;code>cactify_name&lt;/code> function from that post using Meta&amp;rsquo;s
Llama 3.2 model, installed locally using Ollama. The techniques in this post should also work
with &lt;a href="https://ollama.com/search?c=tools" target="_blank" rel="noopener noreferrer">other Ollama models that support function-calling&lt;/a>.&lt;/p></description></item><item><title>LLM Basics: OpenAI Function Calling</title><link>https://www.caktusgroup.com/blog/2025/12/01/learning-llm-basics-openai-function-calling/</link><pubDate>Mon, 01 Dec 2025 10:00:00 -0500</pubDate><guid>https://www.caktusgroup.com/blog/2025/12/01/learning-llm-basics-openai-function-calling/</guid><description>&lt;p>In our &lt;a href="https://www.caktusgroup.com/blog/2025/10/28/learning-llm-basics-ollama/">previous post&lt;/a>, we explored how to send text to an LLM and receive a text response in return. That is useful for chatbots, but often we need to integrate LLMs with other systems. We may want the model to query a database, call an external API, or perform calculations.&lt;/p></description></item><item><title>DjangoCon US 2025: A Celebration of Community, Code and 20 Years of Django</title><link>https://www.caktusgroup.com/blog/2025/10/06/djangocon-us-2025-celebration-community-code-20-years/</link><pubDate>Mon, 06 Oct 2025 09:00:00 -0500</pubDate><guid>https://www.caktusgroup.com/blog/2025/10/06/djangocon-us-2025-celebration-community-code-20-years/</guid><description>&lt;figure>&lt;img src="https://www.caktusgroup.com/blog/2025/10/06/djangocon-us-2025-celebration-community-code-20-years/djangocon25.jpg"
 alt="Group photo at DjangoCon US 2025">&lt;figcaption>
 &lt;p>Celebrating 20 years of Django&lt;/p>
 &lt;/figcaption>
&lt;/figure>

&lt;p>DjangoCon US 2025 was a milestone year for the community, as we gathered in Chicago to celebrate 20 years of Django. Attendees from around the world came together to learn about the latest developments, share their work, and strengthen the bonds that make DjangoCon such a special event. Caktus was well-represented once again, with our team contributing as organizers, speakers, and active participants throughout the week.&lt;/p></description></item><item><title>Learning LLM Basics with OpenAI</title><link>https://www.caktusgroup.com/blog/2025/10/02/learning-llm-basics-openai/</link><pubDate>Thu, 02 Oct 2025 09:00:00 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/10/02/learning-llm-basics-openai/</guid><description>&lt;p>For some time now, we&amp;rsquo;ve been using tools like ChatGPT and CoPilot for day-to-day tasks, but mostly through the conversational AI chatbots they provide. We&amp;rsquo;ve used them for everything from drafting emails to providing type-ahead coding assistance. We haven&amp;rsquo;t, however, gone a step further and integrated them into a development project. Honestly, we weren&amp;rsquo;t sure where to start. Looking into the available options, you quickly run into a dozen new concepts, from vector stores to agents, and different SDKs that all seem to solve similar problems.&lt;/p></description></item><item><title>How to migrate from pip-tools to uv</title><link>https://www.caktusgroup.com/blog/2025/08/25/migrate-pip-tools-to-uv/</link><pubDate>Mon, 25 Aug 2025 14:00:00 -0400</pubDate><guid>https://www.caktusgroup.com/blog/2025/08/25/migrate-pip-tools-to-uv/</guid><description>&lt;p>At Caktus, many of our projects use &lt;code>pip-tools&lt;/code> for dependency management. Following Tobias&amp;rsquo; post &lt;a href="https://www.caktusgroup.com/blog/2025/06/11/migrating-python-django-projects-uv/">How to Migrate your Python &amp;amp; Django Projects to uv&lt;/a>, we were looking to migrate other projects to &lt;code>uv&lt;/code>, but the path seemed less clear with existing pip-tools setups. Our requirements are often spread across multiple files, like this:&lt;/p></description></item><item><title>Handling Configuration and Server Snippets When Upgrading to ingress-nginx 1.12.0</title><link>https://www.caktusgroup.com/blog/2025/07/03/handling-configuration-and-server-snippets-when-upgrading-ingress-nginx-1120/</link><pubDate>Thu, 03 Jul 2025 16:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/07/03/handling-configuration-and-server-snippets-when-upgrading-ingress-nginx-1120/</guid><description>&lt;p>As part of our ongoing Sustainability and Maintenance efforts, we are
upgrading our Kubernetes clusters to version 1.32. Much like a major
Django upgrade, this process requires us to update other key components
to ensure they remain compatible. One of these is the ingress-nginx
controller, which manages external access to the cluster.&lt;/p></description></item><item><title>Avoiding Timezone Traps: Correctly Extracting Date/Time Subfields in Django with PostgreSQL</title><link>https://www.caktusgroup.com/blog/2025/06/16/avoiding-timezone-traps-correctly-extracting-datetime-subfields-django-postgresql/</link><pubDate>Mon, 16 Jun 2025 19:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/06/16/avoiding-timezone-traps-correctly-extracting-datetime-subfields-django-postgresql/</guid><description>&lt;p>Working with timezones can sometimes lead to confusing results,
especially when combining Django's ORM, raw SQL for performance (like
in PostgreSQL materialized views), and specific timezone requirements. I
recently had an issue while aggregating traffic stop data by year, where
all yearly calculations needed to reflect the 'America/New_York'
(EST/EDT) timezone, even though our original data contained
&lt;code>timestamp with time zone&lt;/code> fields. We were using
&lt;a href="https://github.com/xelixdev/django-pgviews-redux" target="_blank" rel="noopener noreferrer">django-pgviews-redux&lt;/a>
to manage materialized views, and I mistakenly attempted to apply
timezone logic to a &lt;code>date&lt;/code> field that had no time or timezone
information.&lt;/p></description></item><item><title>DjangoCon Europe 2025 Highlights</title><link>https://www.caktusgroup.com/blog/2025/05/27/djangocon-europe-2025-highlights/</link><pubDate>Tue, 27 May 2025 05:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/05/27/djangocon-europe-2025-highlights/</guid><description>&lt;p>Three Cakti recently attended DjangoCon Europe 2025 in Dublin and it was a wonderful experience! It was great to see and chat with various Django community members we usually only see once or twice a year. Beyond that, we were most impressed by the consistently high quality of the talks throughout all three days of the conference. It was a pleasure to listen to so many excellent presentations, including the lightning talks at the end of each day. Here are some of our favorite talks.&lt;/p></description></item><item><title>Cakti Share Their Favorite Tools For Streamlined Workflows</title><link>https://www.caktusgroup.com/blog/2025/03/27/cakti-share-their-favorite-tools-for-streamlined-worklows/</link><pubDate>Thu, 27 Mar 2025 20:09:03 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/27/cakti-share-their-favorite-tools-for-streamlined-worklows/</guid><description>&lt;p>Let’s jump into it!&lt;/p>
&lt;p>At Caktus, we’re always looking for tools that help us streamline our workflows, increase productivity, and make our day-to-day tasks more efficient. Whether you&amp;rsquo;re managing projects, writing code, or debugging, the right tools can make all the difference. Here are some of our favorite tools that we love using to get the job done!&lt;/p></description></item><item><title>Upgrade Smarter, Not Harder: Python Tools for Code Modernization</title><link>https://www.caktusgroup.com/blog/2025/03/27/upgrade-smarter-not-harder-python-tools-code-modernization/</link><pubDate>Thu, 27 Mar 2025 10:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/27/upgrade-smarter-not-harder-python-tools-code-modernization/</guid><description>&lt;p>Upgrading projects is somewhat equivalent to flossing, you know you have
to do it, but rarely make time for it. After all, if the project is in
active development, there are exciting new features to build. And we all
know that &lt;strong>new features&lt;/strong> &amp;gt; &lt;strong>project upgrades&lt;/strong>. Well not to worry,
Caktus wants to make you aware of some tools that will save you from
considerable repetitive work &amp;amp; time while simultaneously modernizing
your codebase. Combined, these tools will automate part of the upgrade
process, decreasing the likelihood of neglecting parts of the codebase.&lt;/p></description></item><item><title>A Helpful Guide to Solving Common Poetry Issues</title><link>https://www.caktusgroup.com/blog/2025/03/10/helpful-guide-solving-common-poetry-issues/</link><pubDate>Mon, 10 Mar 2025 10:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2025/03/10/helpful-guide-solving-common-poetry-issues/</guid><description>&lt;p>We don't often use &lt;a href="https://python-poetry.org/" target="_blank" rel="noopener noreferrer">Poetry&lt;/a>, the Python
packaging and dependency management tool, but when we do, we usually
look up and re-learn the same things repeatedly. This post is a quick
reference for some of the recent issues we encountered when using
&lt;a href="https://python-poetry.org/" target="_blank" rel="noopener noreferrer">Poetry&lt;/a>.&lt;/p></description></item><item><title>Getting Started with Dagster</title><link>https://www.caktusgroup.com/blog/2024/12/09/getting-started-dagster/</link><pubDate>Mon, 09 Dec 2024 23:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2024/12/09/getting-started-dagster/</guid><description>&lt;p>Recently, Caktus has been using Tailscale to manage VPN connections
between Android tablets and a central server. We wanted to report on the
devices connected to the network using the Tailscale API. While we could
use tools like &lt;a href="https://docs.celeryq.dev/en/stable/" target="_blank" rel="noopener noreferrer">Celery&lt;/a> to fetch
data from the API and load it into a database&amp;mdash;given its widespread use
in the Django ecosystem&amp;mdash;we also wanted to explore other options.&lt;/p></description></item><item><title>Migrate to Amazon EKS Add-ons</title><link>https://www.caktusgroup.com/blog/2023/07/10/migrate-amazon-eks-add-ons/</link><pubDate>Mon, 10 Jul 2023 17:07:44 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2023/07/10/migrate-amazon-eks-add-ons/</guid><description>&lt;p>Amazon Elastic Kubernetes Service (Amazon EKS) released support for
operational cluster add-on software, or &lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html" target="_blank" rel="noopener noreferrer">Amazon EKS
add-ons&lt;/a>,
around Kubernetes version 1.19 in May 2021. These include:&lt;/p></description></item><item><title>Update an Amazon EKS cluster Kubernetes version to 1.23+</title><link>https://www.caktusgroup.com/blog/2023/05/03/update-amazon-eks-cluster-kubernetes-version-123/</link><pubDate>Wed, 03 May 2023 14:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2023/05/03/update-amazon-eks-cluster-kubernetes-version-123/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Caktus is committed to developing and maintaining high-quality web
applications for clients, so we focus on software sustainability.
Software sustainability refers to the ability of software to continue to
function as expected over time, even as hardware and software
environments change. It involves maintaining and updating software to
remain reliable, secure, and compatible with new hardware and software
technologies. Additionally, from a security perspective, attackers can
exploit software vulnerabilities to gain unauthorized access to systems
or data. Keeping software up-to-date with the latest security patches
helps to reduce the risk of these vulnerabilities being exploited.&lt;/p></description></item><item><title>Analyze data with SQL window functions</title><link>https://www.caktusgroup.com/blog/2023/04/05/analyze-data-sql-window-functions/</link><pubDate>Wed, 05 Apr 2023 14:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2023/04/05/analyze-data-sql-window-functions/</guid><description>&lt;p>We regularly use tools like &lt;a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer">PostgreSQL&lt;/a>,
&lt;a href="https://pandas.pydata.org/" target="_blank" rel="noopener noreferrer">Pandas&lt;/a>, and &lt;a href="https://jupyter.org/" target="_blank" rel="noopener noreferrer">Jupyter
Notebooks&lt;/a> to analyze data here at Caktus.
Recently, we were reviewing North Carolina traffic stop data for the &lt;a href="https://nccopwatch.org/" target="_blank" rel="noopener noreferrer">NC
CopWatch&lt;/a> project and had the opportunity to
use &lt;a href="https://www.postgresql.org/docs/current/tutorial-window.html" target="_blank" rel="noopener noreferrer">PostgreSQL's window
functions&lt;/a>,
which are helpful when aggregating data.&lt;/p></description></item><item><title>Reflection on DjangoCon 2022</title><link>https://www.caktusgroup.com/blog/2023/01/06/django-con-2022/</link><pubDate>Fri, 06 Jan 2023 15:33:37 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2023/01/06/django-con-2022/</guid><description>&lt;h2 id="ronards-recap">Ronard&amp;rsquo;s Recap&lt;/h2>
&lt;p>&lt;em>&amp;ldquo;It takes a village&amp;rdquo;&lt;/em> the African proverb goes. Nowhere was this as apparent as in DjangoCon. It was my first technology conference and my experience could not have been better. People from the most senior developer to fellow juniors and even one of the co-creators of Django made the experience feel warm and inviting. Perhaps knowing that you are surrounded by introverts alleviates the social pressure, knowing that everyone has a common interest, or perhaps even love for programming also brought a soothing feeling to the experience.&lt;/p></description></item><item><title>Python, Django, and React Development on Apple Silicon</title><link>https://www.caktusgroup.com/blog/2021/04/02/python-django-react-development-apple-silicon/</link><pubDate>Fri, 02 Apr 2021 17:06:27 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2021/04/02/python-django-react-development-apple-silicon/</guid><description>&lt;p>Last year, Apple announced that they would transition their entire Mac
line from Intel processors to their ARM64 Apple Silicon chip &lt;a href="https://www.apple.com/mac/m1/" target="_blank" rel="noopener noreferrer">called the
M1&lt;/a>. Several weeks ago, I started testing
development on MacBook Air with the Apple M1 chip (pictured above).&lt;/p></description></item><item><title>How to Use Kubernetes on Azure for Cloud Computing</title><link>https://www.caktusgroup.com/blog/2020/04/28/how-use-kubernetes-azure-cloud-computing/</link><pubDate>Tue, 28 Apr 2020 18:41:03 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2020/04/28/how-use-kubernetes-azure-cloud-computing/</guid><description>&lt;p>For the &lt;a href="http://ratom.web.unc.edu/" target="_blank" rel="noopener noreferrer">Review, Appraisal, and Triage of Mail (RATOM)
project&lt;/a>, funded by the Andrew W. Mellon
Foundation, we were tasked with deploying to a Microsoft Azure
environment. More details about the project are in our &lt;a href="https://www.caktusgroup.com/blog/2020/03/19/email-extract-data-microsoft-pst-files/">first blog
post&lt;/a>
in this Learn With Us blog series. Caktus has experience with Amazon Web
Services (AWS) and Google Cloud, but we hadn't had the opportunity to
use Azure yet, so we looked forward to the opportunity to use that
environment and document our experience. The entire deployment process
is available on GitHub as a reference under the
&lt;a href="https://github.com/StateArchivesOfNorthCarolina/ratom-deploy" target="_blank" rel="noopener noreferrer">StateArchivesOfNorthCarolina/ratom-deploy&lt;/a>
repository.&lt;/p></description></item><item><title>How to Import Multiple Excel Sheets in Pandas</title><link>https://www.caktusgroup.com/blog/2019/08/13/import-multiple-excel-sheets-pandas/</link><pubDate>Tue, 13 Aug 2019 12:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2019/08/13/import-multiple-excel-sheets-pandas/</guid><description>&lt;p>Pandas is a powerful Python data analysis tool. It's used heavily in
the data science community since its data structures make real-world
data analysis significantly easier. At Caktus, in addition to using it
for data exploration, we also incorporate it into Extract, Transform,
and Load (ETL) processes.&lt;/p></description></item><item><title>Our Favorite PyCon 2019 Presentations</title><link>https://www.caktusgroup.com/blog/2019/06/11/favorite-pycon-2019-presentations/</link><pubDate>Tue, 11 Jun 2019 18:31:31 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2019/06/11/favorite-pycon-2019-presentations/</guid><description>&lt;p>&lt;em>Above: A view of the busy exhibit hall. Photo copyright © 2019 by Sean Harrison. All rights reserved.&lt;/em>&lt;/p>
&lt;p>&lt;a href="https://us.pycon.org/2019/" target="_blank" rel="noopener noreferrer">PyCon 2019&lt;/a> attracted 3,393 attendees, including a group of six Cakti. When we weren’t networking with attendees at our booth, we attended some fascinating presentations. Below are some of our favorites. You can watch these talks and more on the &lt;a href="https://www.youtube.com/channel/UCxs2IIVXaEHHA4BtTiWZ2mQ/videos" target="_blank" rel="noopener noreferrer">PyCon 2019 YouTube channel&lt;/a>.&lt;/p></description></item><item><title>Love Your Bugs (PyCon 2018 Must-See Talk Series)</title><link>https://www.caktusgroup.com/blog/2018/05/23/love-your-bugs-pycon-2018-must-see-talk-series/</link><pubDate>Wed, 23 May 2018 13:30:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2018/05/23/love-your-bugs-pycon-2018-must-see-talk-series/</guid><description>&lt;p>&lt;em>Welcome to the 2018 edition of our annual &lt;a href="https://www.caktusgroup.com/blog/tags/pycon-must-see-series/">PyCon Must-See Series&lt;/a>, highlighting the talks our staff especially loved at PyCon. While there were many great talks, this is our team&amp;rsquo;s shortlist.&lt;/em>&lt;/p></description></item><item><title>Ship It Day Q1 2017</title><link>https://www.caktusgroup.com/blog/2017/01/18/ship-it-day-q1-2017/</link><pubDate>Wed, 18 Jan 2017 16:39:28 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2017/01/18/ship-it-day-q1-2017/</guid><description>&lt;p>Last Friday, Caktus set aside client projects for our regular quarterly
ShipIt Day. From gerrymandered districts to RPython and meetup planning,
the team started off 2017 with another great ShipIt.&lt;/p></description></item><item><title>Announcing Caktus Scholarships for Astro Code School</title><link>https://www.caktusgroup.com/blog/2015/06/22/announcing-caktus-scholarships-astro-code-school/</link><pubDate>Mon, 22 Jun 2015 12:30:46 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/06/22/announcing-caktus-scholarships-astro-code-school/</guid><description>&lt;p>We’re very pleased to announce that Caktus Group will be sponsoring up to $20,000 worth of scholarships for Astro Code School students per year. There will be twenty $1,000 scholarships. We hope that these scholarships help increase access to code schools and the wider tech industry:&lt;/p></description></item><item><title>We’re Launching a Django code school: Astro Code School</title><link>https://www.caktusgroup.com/blog/2015/01/26/were-launching-django-code-school-astro-code-school/</link><pubDate>Mon, 26 Jan 2015 13:15:28 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/01/26/were-launching-django-code-school-astro-code-school/</guid><description>&lt;p>One of the best ways to grow the Django community is to have more high-quality Django developers. The good news is that we’ve seen sharply increasing demand for Django web applications. The challenge that we and many other firms face is that there’s much higher demand than there is supply: there aren’t enough high-quality Django developers. We’ve talked about this issue intensely internally and with our friends while at DjangoCon and PyCon. We decided that we can offer at least one solution: a new Django-focused code school.&lt;/p></description></item><item><title>Caktus is looking for a Web Design Director</title><link>https://www.caktusgroup.com/blog/2015/01/22/caktus-looking-web-design-director/</link><pubDate>Thu, 22 Jan 2015 13:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/01/22/caktus-looking-web-design-director/</guid><description>&lt;p>Over the last two years Caktus’ &lt;a href="https://dribbble.com/caktusgroup" target="_blank" rel="noopener noreferrer">design portfolio&lt;/a> has rapidly been growing. We’ve taken on new &lt;a href="https://us.pycon.org/2015/" target="_blank" rel="noopener noreferrer">projects&lt;/a> &lt;a href="http://www.ncgetcovered.org/" target="_blank" rel="noopener noreferrer">primarily&lt;/a> focused on design and have &lt;a href="http://www.caktusgroup.com/blog/2014/11/12/weve-won-two-w3-awards-creative-excellence-1/" target="_blank" rel="noopener noreferrer">received community recognition&lt;/a> for those efforts. We are happy to have grown our design capabilities to match the level of quality we demand from our Django developers. We have found it’s important to have strength on both sides of the table as each side challenges the other and forces the final product of our process to be as high quality as possible.&lt;/p></description></item><item><title>Announcing Durham TriPython Project Nights @ Caktus Group</title><link>https://www.caktusgroup.com/blog/2015/01/19/announcing-durham-tripython-project-nights-caktus-group/</link><pubDate>Mon, 19 Jan 2015 15:05:02 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2015/01/19/announcing-durham-tripython-project-nights-caktus-group/</guid><description>&lt;p>We’re happy to announce that &lt;a href="http://www.meetup.com/tripython/" target="_blank" rel="noopener noreferrer">TriPython&lt;/a> will be hosting their project nights at our new offices in Durham. This means now there’s a TriPython project night every single week, in every major Triangle city every month, on most weekdays. It’s great to see that the Triangle Python community has gotten so large.&lt;/p></description></item><item><title>We've Won Two W3 Awards for Creative Excellence on the Web!</title><link>https://www.caktusgroup.com/blog/2014/11/12/weve-won-two-w3-awards-creative-excellence-1/</link><pubDate>Wed, 12 Nov 2014 14:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/11/12/weve-won-two-w3-awards-creative-excellence-1/</guid><description>&lt;p>We’re honored to announce that we’ve won two W3 Silver Awards for Creative Excellence on the Web. The awards were given in recognition of our homepage redesign and DjangonCon 2014. Many thanks to Open Bastion and, by extension, the Django Software Foundation for selecting us to build the DjangoCon website. Also many thanks to our hardworking team of designers, developers and project managers that worked on these projects: &lt;a href="http://www.caktusgroup.com/about/dan-poirier" target="_blank" rel="noopener noreferrer">Dan&lt;/a>, &lt;a href="http://www.caktusgroup.com/about/daryl-katz-riethof" target="_blank" rel="noopener noreferrer">Daryl&lt;/a>, &lt;a href="http://www.caktusgroup.com/about/david-ray" target="_blank" rel="noopener noreferrer">David&lt;/a>, Michael, &lt;a href="http://www.caktusgroup.com/about/rebecca-muraya" target="_blank" rel="noopener noreferrer">Rebecca&lt;/a>, and Trevor!&lt;/p></description></item><item><title>Q3 Charitable Giving</title><link>https://www.caktusgroup.com/blog/2014/09/17/Q3-2014-Charitable-Giving/</link><pubDate>Wed, 17 Sep 2014 20:11:36 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/09/17/Q3-2014-Charitable-Giving/</guid><description>&lt;p>Our client social impact projects continue here at Caktus, with work presently being done in Libya, Nigeria, Syria, Turkey, Iraq and the US. But every quarter, we pause to consider the excellent nonprofits that our employees volunteer for and, new this quarter, that they have identified as having a substantive influence on their lives. The following list represents employee-nominated nonprofits which we are giving to in alphabetical order:&lt;/p></description></item><item><title>Caktus Just Bought a Building in Downtown Durham!</title><link>https://www.caktusgroup.com/blog/2014/03/26/caktus-just-bought-building-downtown-durham/</link><pubDate>Wed, 26 Mar 2014 15:00:04 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/03/26/caktus-just-bought-building-downtown-durham/</guid><description>&lt;p>After sustained growth that has us packed in six suites, we have spent the past year and a half seeking new space. We’ve found it! I’m pleased to announce that Caktus has bought a historic 1910 building with nearly 11,000 square feet of space in Downtown Durham. We&amp;rsquo;ll be right near five points at 108 Morris St. The new building will be completely renovated from top to bottom to create an open workspace that’ll make it even easier for us to collaborate and share ideas.&lt;/p></description></item><item><title>Congrats to PearlHacks Winners (Including Our Intern, Annie)!</title><link>https://www.caktusgroup.com/blog/2014/03/25/congrats-pearlhacks-winners-including-our-intern-annie/</link><pubDate>Tue, 25 Mar 2014 14:01:01 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2014/03/25/congrats-pearlhacks-winners-including-our-intern-annie/</guid><description>&lt;p>&lt;em>Caleb Smith, Caktus developer, awarding the third place prize to TheRightFit creators Bipasa Chattopadhyay, Ping Fu, and Sarah Andrabi.&lt;/em>&lt;/p>
&lt;p>Many congratulations to the &lt;a href="http://pearlhacks.com/" target="_blank" rel="noopener noreferrer">PearlHacks&lt;/a> third place winners who won Sphero Balls! The team from UNC’s Computer Science department created &lt;a href="https://www.hackerleague.org/hackathons/pearl-hacks/hacks/therightfit" target="_blank" rel="noopener noreferrer">TheRightFit&lt;/a>, an Android app that helps shoppers know what sizes will fit them and their families among various brands. Their prize of &lt;a href="http://www.gosphero.com/" target="_blank" rel="noopener noreferrer">Sphero Balls&lt;/a>, programmable balls that can interact and play games via smart phones, was presented by Caktus developer and Pearl Hacks mentor Caleb Smith as part of our sponsorship. PearlHacks, held at UNC-Chapel Hill, is a conference designed to encourage female high school and college programmers from the NC and VA area.&lt;/p></description></item><item><title>Caktus is hiring a Design Visionary and User Experience Virtuoso with a Knack for Coding</title><link>https://www.caktusgroup.com/blog/2013/07/15/caktus-hiring-design-visionary-and-user-experience-virtuoso-knack-coding/</link><pubDate>Mon, 15 Jul 2013 12:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/07/15/caktus-hiring-design-visionary-and-user-experience-virtuoso-knack-coding/</guid><description>&lt;p>Do your mornings usually consist of reading design blogs and drinking coffee? Are you obsessive about fonts? Are you constantly seeking out new inspiration to make your designs better? As a Front-End Developer + Designer at Caktus, you’ll be able to put your passion for design and development to work by creating beautiful designs for complex websites. You will work closely with clients to bring their visions to life and help lead the branding and design process. Our designers take ownership of the user experience and design process from the beginning and collaborate with our development team to implement the vision. You should be passionate about the open source community and the philosophy behind it. If you’re interested in becoming part of and contributing to a creative, dynamic team, here’s an idea of what you’ll do:&lt;/p></description></item><item><title>AngularJS to PyGame: Caktus’ 2nd ShipIt Day</title><link>https://www.caktusgroup.com/blog/2013/04/30/caktus-2nd-shipit-day/</link><pubDate>Tue, 30 Apr 2013 13:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/04/30/caktus-2nd-shipit-day/</guid><description>&lt;p>We had our 2nd ShipIt Day at Caktus last week. ShipIt (coined
by &lt;a href="http://www.atlassian.com/company/about/shipit" target="_blank" rel="noopener noreferrer">Atlassian&lt;/a>), in case
you don&amp;rsquo;t know, is an exercise that allows your team to work on
alternative projects in a 24-hour hackathon. We brainstorm ideas related
to Caktus, break into small groups and try to build a project by the end
of the day on Friday. It&amp;rsquo;s a lot of fun and provides an opportunity to
work on internal tools, try something new and collaborate together. \&lt;/p></description></item><item><title>Caktus sponsoring and speaking on mobile health at SwitchPoint 2013</title><link>https://www.caktusgroup.com/blog/2013/04/18/caktus-sponsoring-and-speaking-mobile-health-switchpoint-2013/</link><pubDate>Thu, 18 Apr 2013 14:13:21 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/04/18/caktus-sponsoring-and-speaking-mobile-health-switchpoint-2013/</guid><description>&lt;p>SwitchPoint is a one-of-a-kind conference and a unique opportunity to
learn, share ideas, and hear about global and mobile health efforts
around the world. We had a great time at SwitchPoint last year. I&amp;rsquo;m
excited to announce that Caktus, for the second year in a row, is
sponsoring &lt;a href="http://event.switchpointideas.com/" target="_blank" rel="noopener noreferrer">[SwitchPoint
2013]{style=&amp;ldquo;color: rgb(17, 85, 204);&amp;rdquo;}&lt;/a>.&lt;/p></description></item><item><title>Raspberry IO announced at PyCon</title><link>https://www.caktusgroup.com/blog/2013/03/13/raspberry-io-announced-pycon/</link><pubDate>Wed, 13 Mar 2013 16:51:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2013/03/13/raspberry-io-announced-pycon/</guid><description>&lt;p>&lt;a href="https://us.pycon.org/2013/" target="_blank" rel="noopener noreferrer">PyCon&lt;/a> is one of our favorite conferences
here at Caktus. We&amp;rsquo;ve been attending for the past 4 years now and it is
amazing to see how much the community has grown. This year is especially
special because Jesse Noller and the Python Software Foundation (PSF)
came to us to help them build &lt;a href="http://raspberry.io/" target="_blank" rel="noopener noreferrer">Raspberry IO&lt;/a>. The
site features work from the Python community and their adventures in
using Raspberry Pi with Python.&lt;/p></description></item><item><title>Project Mwana featured in the BBC</title><link>https://www.caktusgroup.com/blog/2012/09/25/project-mwana-featured-bbc/</link><pubDate>Tue, 25 Sep 2012 14:20:13 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/09/25/project-mwana-featured-bbc/</guid><description>&lt;p>Caktus has had the opportunity to work on the infrastructure of
RapidSMS, an application framework that allows data collection and
logistics coordination using mobile phone text messages for
communication. The BBC World News recently posted an article,
&lt;a href="http://www.bbc.com/future/story/20120803-saving-a-life-in-160-characters/" target="_blank" rel="noopener noreferrer">&amp;quot;RapidSMS: Saving a life in 160
characters&amp;quot;&lt;/a>
detailing the effects of RapidSMS technology is having on HIV/AIDS
treatment in the developing world. The article focuses on work being
done to combat the HIV/AIDS epidemic in Malawi where there is one of the
highest rates of infection in the world.&lt;/p></description></item><item><title>Caktus Team Members Presenting at DjangoCon 2012</title><link>https://www.caktusgroup.com/blog/2012/09/03/caktus-team-members-presenting-djangocon-2012/</link><pubDate>Mon, 03 Sep 2012 14:00:13 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/09/03/caktus-team-members-presenting-djangocon-2012/</guid><description>&lt;p>Caktus is proud to announce that four of our developers will be
presenting at this year&amp;rsquo;s &lt;a href="http://www.djangocon.us/" target="_blank" rel="noopener noreferrer">DjangoCon&lt;/a>. We are
also happy to announce that we will be sponsors of DjangoCon, taking
place in Washington D.C. on September 4th through the 7th. In addition
to the four Caktus team members who will be presenting this year, our
entire development staff will be in attendance enjoying the conference
and city.&lt;/p></description></item><item><title>Thoughts after attending the UNICEF Rwanda mHealth Conference</title><link>https://www.caktusgroup.com/blog/2012/08/08/thoughts-after-attending-unicef-rwanda-mhealth-conference/</link><pubDate>Wed, 08 Aug 2012 17:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/08/08/thoughts-after-attending-unicef-rwanda-mhealth-conference/</guid><description>&lt;p>This past July, I had the pleasure of attending the UNICEF Rwanda
Conference in Kigali, Rwanda. The conferences focus was on developing a
comprehensive eHealth suite for numerous nations to implement.&lt;/p></description></item><item><title>Django Training</title><link>https://www.caktusgroup.com/blog/2012/07/20/announcing-new-service-training/</link><pubDate>Fri, 20 Jul 2012 21:14:29 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/07/20/announcing-new-service-training/</guid><description>&lt;p>Caktus is proud to announce that we are now offering Django training
services. This new service includes both off and on-site training for
you and your team to become a Djangonaut.&lt;/p></description></item><item><title>Configuring a Jenkins Slave</title><link>https://www.caktusgroup.com/blog/2012/01/10/configuring-jenkins-slave/</link><pubDate>Tue, 10 Jan 2012 13:50:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2012/01/10/configuring-jenkins-slave/</guid><description>&lt;p>We're pretty avid testers here at Caktus and when one of our Django
projects required upgrading to Python 2.7, we also needed to upgrade our
Jenkins build environment. Luckily, Jenkins supports distributed builds
to allow a master install to delegate tasks to slaves instances. This
way we can continue to run our primary build system on Ubuntu 10.04,
which defaults to Python 2.6, and delegate tasks to an Ubuntu 11.04
environment running Python 2.7. The setup is fairly easy, but since I
didn't find much out there already, I figured I write up a quick post
outlining what we did.&lt;/p></description></item><item><title>OpenBlock Geocoder, Part 3: External Geocoders</title><link>https://www.caktusgroup.com/blog/2011/12/28/openblock-geocoder-part-3-external-geocoders/</link><pubDate>Wed, 28 Dec 2011 13:23:21 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/12/28/openblock-geocoder-part-3-external-geocoders/</guid><description>&lt;p>The OpenBlock geocoder is powerful and robust. It uses PostGIS for
spacial queries, can extract addresses from bodies of text, and can
understand block and intersection notation. We've run into a few issues
with it, however, including a low geocoding success rate. This is a
tough problem to solve and depends on a lot of factors (the extent of
street and block data in OpenBlock, format of the street addresses,
etc.), so your mileage may vary. Below I constructed a simple test using
Google's Geocoding API to have as an alternative.&lt;/p></description></item><item><title>OpenBlock Geocoder, Part 2: Text Parsing and Entity Extraction</title><link>https://www.caktusgroup.com/blog/2011/12/16/openblock-geocoder-part-2-text-parsing-and-entity-extraction/</link><pubDate>Fri, 16 Dec 2011 13:30:19 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/12/16/openblock-geocoder-part-2-text-parsing-and-entity-extraction/</guid><description>&lt;p>This is the second post in our &lt;a href="https://github.com/openrural" target="_blank" rel="noopener noreferrer">OpenRural&lt;/a>
series reviewing &lt;a href="http://openblockproject.org/" target="_blank" rel="noopener noreferrer">OpenBlock&lt;/a> and it's
geocoder. &lt;a href="http://www.caktusgroup.com/blog/2011/12/12/openblock-geocoder-part-1-data-model-and-geocoding/" target="_blank" rel="noopener noreferrer">OpenBlock Geocoder, Part 1: Data Model and
Geocoding&lt;/a>
covers the internals of the OpenBlock geocoder and it's geocoding
capabilities. As this posts builds upon topics covered there, you may
wish to read Part 1 before proceeding. In this post we step back from
the internals of the geocoder and explore how to use it along with other
OpenBlock tools to parse unstructured text.&lt;/p></description></item><item><title>OpenBlock Geocoder, Part 1: Data Model and Geocoding</title><link>https://www.caktusgroup.com/blog/2011/12/12/openblock-geocoder-part-1-data-model-and-geocoding/</link><pubDate>Mon, 12 Dec 2011 16:17:20 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/12/12/openblock-geocoder-part-1-data-model-and-geocoding/</guid><description>&lt;p>As Tobias mentioned in &lt;a href="http://www.caktusgroup.com/blog/2011/12/06/scraping-data-and-web-standards/">Scraping Data and Web Standards&lt;/a>, Caktus is collaborating with the UNC School of Journalism to help develop Open Rural (the code is on &lt;a href="https://github.com/openrural">GitHub&lt;/a>). Open Rural hopes to help rural newspapers in North Carolina leverage &lt;a href="http://openblockproject.org/">OpenBlock&lt;/a>. This blog post is the first of several covering the internals of OpenBlock and, specifically, the geocoder.&lt;/p></description></item><item><title>Lightning Talk Lunch: Service Page API</title><link>https://www.caktusgroup.com/blog/2011/08/17/lightning-talk-lunch-service-page-api/</link><pubDate>Wed, 17 Aug 2011 15:06:38 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/08/17/lightning-talk-lunch-service-page-api/</guid><description>&lt;p>Leading the second talk of our Caktus Lightning Talk Lunch series, Calvin Spealman presented on the Service Page API:&lt;/p>
&lt;blockquote>
&lt;p>The Service Page API is a prototype and proof of concept to deliver a wide range of browser plugins across multiple browsers and to extend the APIs available to websites a user visits by allowing plugins to extend the Javascript API with new libraries, integrate with external services, and more. It puts the power in the users hand to control which services can interact. This talk covers the problems with the current state of browser extensions and the difficulty in building them across multiple browsers consistently, and how the Service Page API is a solution to this, with code examples.&lt;/p></description></item><item><title>An alternative RapidSMS router implementation (with Celery!)</title><link>https://www.caktusgroup.com/blog/2011/07/18/alternative-rapidsms-router-implementation-celery/</link><pubDate>Mon, 18 Jul 2011 18:00:00 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2011/07/18/alternative-rapidsms-router-implementation-celery/</guid><description>&lt;p>We've been using &lt;a href="http://www.rapidsms.org/" target="_blank" rel="noopener noreferrer">RapidSMS&lt;/a>, a Django-powered
SMS framework, &lt;a href="http://www.caktusgroup.com/mobile-health/" target="_blank" rel="noopener noreferrer">more&lt;/a> and
&lt;a href="http://www.caktusgroup.com/blog/2010/12/29/hiv-results-birth-reminders-and-clinic-communication-malawi/" target="_blank" rel="noopener noreferrer">more&lt;/a>
frequently here at Caktus. It's evolved a lot over the past year--
from being reworked to feel more like a Django app, to
&lt;a href="http://groups.google.com/group/rapidsms/browse_thread/thread/526a752d695e85d2/c1075330937e1791?lnk=gst&amp;amp;q=core#c1075330937e1791" target="_blank" rel="noopener noreferrer">merging&lt;/a>
the rapidsms-core-dev and rapidsms-contrib-apps-dev repositories into a
single codebase (no more submodules!), to finally becoming installable
via
&lt;a href="http://groups.google.com/group/rapidsms/browse_thread/thread/19820972177b7845/1d1886cae96eb0c8?lnk=gst&amp;amp;q=pypi#1d1886cae96eb0c8" target="_blank" rel="noopener noreferrer">pypi&lt;/a>.
The &amp;quot;new core&amp;quot; is in a great state now and is much easier to work
with. However, one particular aspect of RapidSMS, the route process, has
always been complicated and confusing to deal with. Tobias began the
conversation on this
&lt;a href="http://groups.google.com/group/rapidsms/browse_thread/thread/18b053d468e699f3#" target="_blank" rel="noopener noreferrer">issue&lt;/a>
after returning from a 6-week long UNICEF project in Zambia.
He &lt;a href="https://github.com/rapidsms/rapidsms/wiki/Router-decoupling-and-HTTP-message-processing" target="_blank" rel="noopener noreferrer">summarized&lt;/a> the
route process like so:&lt;/p></description></item><item><title>Basic Django deployment with virtualenv, fabric, pip and rsync</title><link>https://www.caktusgroup.com/blog/2010/04/22/basic-django-deployment-with-virtualenv-fabric-pip-and-rsync/</link><pubDate>Fri, 23 Apr 2010 00:46:37 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/04/22/basic-django-deployment-with-virtualenv-fabric-pip-and-rsync/</guid><description>&lt;p>Deployment is usually a tedious process with lots of tinkering until
everything is setup just right. We deploy quite a few Django sites on a
regular basis here at Caktus and still do tinkering, but we've
attempted to functionalize some of the core tasks to ease the process.
I've put together a basic example that outlines local and remote
environment setup. This is a simplified example and just one of many
ways to deploy a Django project (I learned a lot from Jacob
Kaplan-Moss'
&lt;a href="http://github.com/jacobian/django-deployment-workshop/" target="_blank" rel="noopener noreferrer">django-deployment-workshop&lt;/a>),
so I encourage you to browse around the Django community to learn more.
The entire source for this example project can be found in the
&lt;a href="http://www.bitbucket.org/copelco/caktus-deployment/src/tip/example-django-project/" target="_blank" rel="noopener noreferrer">caktus-deployment Bitbucket
repository&lt;/a>.&lt;/p></description></item><item><title>Continuous Integration with Django and Hudson CI (Day 1)</title><link>https://www.caktusgroup.com/blog/2010/03/08/django-and-hudson-ci-day-1/</link><pubDate>Mon, 08 Mar 2010 15:58:48 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2010/03/08/django-and-hudson-ci-day-1/</guid><description>&lt;p>We're always looking for new tools to make our development environment
more robust here at Caktus. We write a lot of
&lt;a href="https://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/">tests&lt;/a>
to ensure proper functionality as new features land and bug fixes are
added to our projects. The next step is to integrate with a &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration" target="_blank" rel="noopener noreferrer">continuous
integration&lt;/a> system
to automate the process and regularly check that status of the build.&lt;/p></description></item><item><title>Custom JOINs with Django's query.join()</title><link>https://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/</link><pubDate>Mon, 28 Sep 2009 14:26:02 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/</guid><description>&lt;p>Django's ORM is great. It handles simple to fairly complex queries
right out the box without having to write any SQL. If you need a
complicated query, Django's lets you use .extra(), and you can always
fallback to raw SQL if need be, but then you lose the ORM's bells and
whistles. So it's always nice to find solutions that allow you to tap
into the ORM at different levels.&lt;/p></description></item><item><title>Web Developer for Hire</title><link>https://www.caktusgroup.com/blog/2009/09/23/developer-for-hire/</link><pubDate>Wed, 23 Sep 2009 14:26:58 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/09/23/developer-for-hire/</guid><description>&lt;p>We're pleased to announce that &lt;a href="http://www.caktusgroup.com/" target="_blank" rel="noopener noreferrer">Caktus&lt;/a> is
looking for a developer to join our team on a contract basis!&lt;/p>
&lt;p>What do we do? We build custom web applications for local and remote
clients using a variety of open-source technologies. We are a small team
founded in the Chapel Hill/Carrboro area (currently residing in
&lt;a href="http://www.carrborocoworking.com/" target="_blank" rel="noopener noreferrer">Carrboro Creative Coworking&lt;/a>) who
believe in face-to-face contact and employ agile development techniques
that emphasize teamwork and collaboration.&lt;/p></description></item><item><title>Setting PostgreSQL's SHMMAX in Mac OS X 10.5 (Leopard)</title><link>https://www.caktusgroup.com/blog/2009/08/13/setting-postgresqls-shmmax-in-mac-os-x-105-leopard/</link><pubDate>Thu, 13 Aug 2009 11:46:08 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/08/13/setting-postgresqls-shmmax-in-mac-os-x-105-leopard/</guid><description>&lt;p>If you've ever tried to increase the
&lt;a href="http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-SHARED-BUFFERS" target="_blank" rel="noopener noreferrer">shared_buffers&lt;/a>
setting in your postgresql.conf to a value that exceeds the amount of
shared memory supported by your operating system kernel, then you'll
see an error message like this:&lt;/p></description></item><item><title>Explicit Table Locking with PostgreSQL and Django</title><link>https://www.caktusgroup.com/blog/2009/05/26/explicit-table-locking-with-postgresql-and-django/</link><pubDate>Tue, 26 May 2009 18:59:10 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/05/26/explicit-table-locking-with-postgresql-and-django/</guid><description>&lt;p>By default, &lt;a href="http://www.djangoproject.com/" target="_blank" rel="noopener noreferrer">Django&lt;/a> doesn't do explicit
table locking. This is OK for most read-heavy scenarios, but sometimes
you need guaranteed, exclusive access to the data. Caktus uses
&lt;a href="http://www.postgresql.org/" target="_blank" rel="noopener noreferrer">PostgreSQL&lt;/a> in most of our production
environments, so we can use the &lt;a href="http://www.postgresql.org/docs/8.3/interactive/explicit-locking.html" target="_blank" rel="noopener noreferrer">various lock
modes&lt;/a>
it provides to control concurrent access to the data. Once we obtain a
lock in PostgreSQL, it is held for the remainder of the current
transaction. Django provides transaction management, so all we need to
do is execute a &lt;a href="http://www.postgresql.org/docs/8.3/interactive/sql-lock.html" target="_blank" rel="noopener noreferrer">SQL LOCK
statement&lt;/a>
within a transaction, and Django and PostgreSQL will handle the rest.&lt;/p></description></item><item><title>minibooks: Small Business Bookkeeping</title><link>https://www.caktusgroup.com/blog/2009/01/07/minibooks-small-business-bookkeeping/</link><pubDate>Wed, 07 Jan 2009 15:49:06 +0000</pubDate><guid>https://www.caktusgroup.com/blog/2009/01/07/minibooks-small-business-bookkeeping/</guid><description>&lt;p>Caktus released minibooks (open-sourced under the AGPL) as a bookkeeping
package for small tech agencies. Boasting a &lt;a href="http://en.wikipedia.org/wiki/Double-entry_bookkeeping_system" target="_blank" rel="noopener noreferrer">double-entry
accounting&lt;/a>
system, &lt;a href="http://en.wikipedia.org/wiki/Customer_relationship_management" target="_blank" rel="noopener noreferrer">customer relationship management
(CRM)&lt;/a>
and transaction reconciliation, minibooks provides a clean, multiuser
web-based interface to manage simple accounting needs for small
businesses.&lt;/p></description></item></channel></rss>