Skip to main content

Blog

All Improvements Are Shared Freely as Free Software

Everything we do at Agaric uses software that is free as in freedom - free to install, use and repurpose for your own needs.

Our work with Portside has already translated into improving and even creating the following Drupal modules:

* Give - on-site donation forms and reporting
* Social Post Twitter - Re-post content from your website to your Twitter account
* Social Share Facebook - Re-post contnt from your website to your Facebook page
* Minimal HTML - A text format handy for short text fields

So, when you donate to Portside's fundraising campaign, you are both supporting independent journalism and the open-source software that benefits other independent outlets and websites.

Donate to Portside

Ben Melançon attending an Ujima workshop.

Benjamin Melançon and Clayton Dewey volunteer on the leadership team of Drutopia, an initiative to bring Drupal-powered websites to grassroots organizations. 

The worldwide web was intentionally built so that anyone could connect to it. If you type agaric.coop into any browser, from anywhere in the world you see our website. We call this the open web. At Agaric, we believe that keeping the web open and free is critical to a humane world.

When someone is prevented from expressing themselves online or hearing the voices of others, it's an attack on the open web.

Like a physical web, the more decentralized the system is, the healthier it is. The more websites and platforms available to publish from and connect to, the more diverse the web is, reflecting the world we live in.

This is why we help people build websites and platforms. It's also why we're leaders in the Indieweb (helping websites connect with one another) and the free software movement (building software anyone can use or modify).

Additional Resources

Agaric makes websites and applications that matter. We provide development services, training, and consulting to help define and meet your needs.

Personas de pie junto a iconos gigantes para la productividad.

La gente a menudo pregunta por las herramientas de software libre que Agaric utiliza para administrar su negocio cooperativo. En este artículo, compartiremos los recursos que elegimos para las tareas diarias de oficina y administración, así como para las comunicaciones en nuestras operaciones comerciales.   

 

Agaric utiliza software libre siempre que es posible. Por esta razón, creamos sitios web con Drupal, una plataforma  de gestión de contenido que destaca por la calidad de su código y por su amplia variedad de funcionalidades.  Como miembros de la Comunidad Drupal, buscamos contribuir activamente con los grupos que trabajan en encontrar opciones para su mejora y ampliación. 

La necesidad de una tecnología responsable - Parte 1 

Quizás podrán preguntarse por qué decimos "Software Libre" y no "Código Abierto", ya que en ambos casos esencialmente es lo mismo. Nosotros preferimos este término porque incluye los principios éticos sobre el respeto a la libertad del usuario. La ética del software libre dice que los usuarios merecen control sobre el código que usan, mientras que el uso del término "Código abierto" se refiere solo  a permitir que los usuarios participen en el desarrollo. Nosotros apoyamos la idea de un software que proteja nuestros derechos y nos evite estar vulnerables. 

A wave splashing over a migrating loggerhead sea turtle on a beach.

Respecting your privacy and being responsible with the data we collect from you is of the utmost importance to us.  We will not use or share your information with anyone except as described in this privacy policy.

Information collection and use

If you choose to leave a comment or a private message through our contact form, we may require you to provide us with certain personally identifiable information, including your name and email address. The information that we collect will be used to contact or identify you.

Log data

We want to inform you that whenever you visit our Service, we collect information that your browser sends to us that is called Log Data. This Log Data may include information such as your computer's Internet Protocol (“IP”) address, browser version, pages of our Service that you visit, the time and date of your visit, the time spent on those pages, and other statistics.

Cookies

We do not use cookies for visitors to our site. (Cookies are files with small amount of data that is commonly used as an anonymous unique identifier.)

Service providers

We employ a third-party company, Google, to assist us in analyzing how our website is used. Only anonymized data is collected.

Hotjar assists its us in providing our end users with a better experience and service as well as assist us in diagnosing technical problems and analyzing user trends. Most importantly, through Hotjar’s services, the functionality of the site can be improved, making them more user-friendly, more valuable, and simpler to use for the end users.

You may opt-out from having Hotjar collect your information when visiting a Hotjar Enabled Site at any time by visiting our Opt-out page and clicking ‘Disable Hotjar’ or enabling Do Not Track (DNT) in your browser.

Changes to this privacy policy

We may update our Privacy Policy from time to time. Thus, we advise you to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately, after they are posted on this page.

Contact us

If you have any questions or suggestions about our privacy policy, do not hesitate to contact us.

 Antehabeo tum velit. Camur esse iustum typicus utinam valetudo. Eu modo paulatim velit. Comis consectetuer eligo mos odio pneum si sit turpis vel.

Interdico lobortis minim paulatim quia valde ymo. Iaceo ibidem jus nisl proprius secundum tego. Elit ideo luctus neque sino. Dolore eum olim pala.

Dolore feugiat genitus minim molior mos quidem ullamcorper verto. Iriure nisl vulputate. Appellatio meus populus similis tego. Acsi commoveo diam esse ex exerci pagus si ulciscor virtus. Duis ibidem interdico sagaciter ymo. Caecus usitas validus vulpes. Mauris neo vindico. Ad decet fere hendrerit jus letalis utinam. In natu populus ymo.

Caecus hendrerit huic imputo incassum os praesent quia si. Decet esca et in interdico iustum jugis praesent torqueo verto. Abdo blandit exerci proprius. Abdo aliquam illum in iriure melior oppeto quidem veniam. Exerci humo inhibeo jugis os saluto verto. Caecus conventio importunus pagus tincidunt ymo.

Fere metuo nulla persto saepius turpis. Augue decet eligo exputo ille inhibeo oppeto pagus scisco utrum. Augue enim iaceo modo probo rusticus sed turpis. Aliquam consectetuer defui minim natu nobis refoveo singularis tum vulpes. Comis tation tum.

Dignissim praemitto venio ymo. Acsi antehabeo erat humo ludus mauris os refero roto ulciscor. Iustum pecus quidem refero. Commodo consequat eum ludus meus occuro singularis utrum volutpat. Aliquam capto conventio dolor importunus lobortis loquor nobis turpis valetudo. Eum huic immitto laoreet nulla quae sino sit tum venio.

Jumentum probo ratis singularis. Brevitas eligo eros facilisis ideo nunc qui sagaciter tum. Exputo lobortis saluto similis volutpat. Magna nisl validus. Camur cui et euismod facilisi in. Abico immitto iusto jus os pecus quadrum suscipit virtus ymo. Abluo cui defui inhibeo scisco ut vindico vulpes. Bene molior mos nisl odio. Aliquip appellatio damnum facilisis neo. Elit eros ille macto paratus pneum saluto validus venio.

Abluo facilisis huic iusto molior pneum premo scisco. Letalis macto nimis premo quidne valetudo. Acsi blandit damnum diam gilvus refoveo utrum vicis voco.

Commoveo oppeto virtus voco. Abbas acsi consequat gravis immitto modo neque nutus quadrum verto. Accumsan adipiscing cogo cui esca euismod melior modo neque tego. Comis defui enim exerci occuro praesent torqueo valde velit. Autem enim eu genitus magna nimis quidne tincidunt vereor vindico. Dolore eum venio zelus.

Commodo jumentum letalis nulla pagus vulputate. Abigo pala ut vereor. Abigo mauris te. Duis loquor mos neque olim paulatim singularis velit. Commodo diam eros importunus quibus rusticus tation tum valde venio.

Ex molior saluto virtus. Elit esse exerci. Amet brevitas commodo consequat lucidus meus nutus tego validus. Elit jumentum modo refoveo. Augue cogo dolor immitto jugis lenis saepius tincidunt. Accumsan et saluto ulciscor zelus. Autem commodo consectetuer et feugiat genitus obruo occuro patria pneum.

Accumsan cogo conventio exputo incassum paratus rusticus torqueo turpis wisi. Camur dolus illum jugis letalis minim scisco singularis. Capto elit gravis lenis letalis metuo ulciscor utrum valetudo wisi. Aliquip meus saluto. Adipiscing blandit euismod gilvus iaceo persto saluto secundum suscipit tation. Capto exerci in luptatum sagaciter sed tincidunt volutpat. Antehabeo dolus iustum molior occuro quibus sed suscipit usitas.

 

The Challenge

Many teachers lack the skills and confidence to effectively integrate computer modeling and simulation into their science classrooms. Research studies show that it takes more than a single professional development workshop to build the necessary skill and confidence. Online communities have been proposed as a means to address this problem. Teachers with GUTS (Growing Up Thinking Scientifically) offers an engaging middle school curriculum and accompanying professional development for teachers.

Through the use of an online community of practice, Teachers with GUTS is able to support teachers in mitigating challenges, gaining expertise by providing additional training and resources, and providing answers to teachers; questions as they bring computational science experiences into their classrooms. To truly teach with GUTS, teachers needed a community they could turn to.

Social media platforms and existing online discussion forums were considered, but research showed that these platforms lacked the features specifically needed. Instead, they needed a platform tailored to their needs:

  • Forum for topical discussions
  • Resource library to share documents, videos, and code
  • Events listing page
  • Practice area for participating in monthly “challenges” or “work sessions”

Our Approach

Through our discovery work we specifically identified that a forum, resource library, practice space, and faceted search would provide teachers with support and resources and tools they need to teach the curricula with confidence. TWiG would then support the website with both drip and push marketing to promote the resources and encourage activity.

Resource Library

Project GUTS CS in Science curriculum is the heart of TWiG’s work. There are several learning modules as well as supporting documents such as rubrics and supplementary activities. We built the resource library that displayed the most recent additions front and center, while providing a faceted search option so teachers can drill down to specific resources.

We also took advantage of the collaborative spirit of the TWiG community by allowing teachers to submit their own resources. These resources are then reviewed by TWiG staff and published after review, revision if needed, and alignment with standards.

Screenshot of Resource Library
Faceted search allows teachers to find resources based on several criteria.

Forum

To support online discussion and peer assistance, we built a forum. We built off of Drupal Core’s Forum module and extended it to include an area accessible only to facilitators with a custom module.

We customized the forum further by disabling threaded comments, as that structure did not work well for the teachers using the site. However, in doing so we learned of a longstanding issue with Drupal and comments in which converting threaded comments to a flat structure risks deleting the nested comments. In response, we ported the Flat Comments module to Drupal 8.

Bookmarks

Even with faceted search and thoughtful categorization, the number of resources and discussions on the site can be overwhelming. We created a Drupal 8 version of the Backpack module that allows teachers to save pages to their “backpack.”

These backpacks can either be private or shared with other members. Curating specific lists is another way teachers can share knowledge with one another.

You can download and use the Backpack module on your Drupal site at https://github.com/agaric/bookmark

 

Screenshot of a user's backpack, a page of bookmarked pages.
Teachers can bookmark a resource or discussion for quick access in the future.

Notifications

While a custom site was more advantageous than an email list or Facebook group, the reality is that most teachers’ daily routine does not include visiting teacherswithguts.org. In order to keep teachers engaged they needed a way to know when relevant activity was taking place.

We built a notification system, configurable by each teacher, so that they could be emailed about activity pertinent to their work. Teachers can choose to receive the following notifications:

  • When a new article is posted
  • When a new resource is posted
  • When a new discussion is posted
  • When a comment is made on a discussion

Additionally, teachers choose the day to be sent emails, as well as the frequency. This was all made possible by enhancing the Personal Digest and Comment Notify modules.

Screenshot of notification settings page.
We enhanced the Personal Digest and Comment Notify modules to give users fine grained control over their notifications.

Member Directory

To build upon the networking happening in the forums, we made it easy for teachers to find one another based on shared on interests, experience and geography. Each teacher customizes their member profile with key information about themselves, their areas of expertise and the areas they wish to grow. We then surfaced that in a filterable search of members, helping teachers mentor one another.

Screenshot of member directory
Members can easily find others with similar interests in the member directory.

Results

With an onboarding process much improved from their previous site, plus the ability to bulk invite users, TWiG was able to sign up over 700 teachers when the site launched in 2016. We’ve continued to improve the site to increase participation and surface useful metrics for site administrators and researchers.

Coordinate with all of the city's service providers together on one platform

Add service providers to the platform and check for gaps and redundancies in services offered throughout the city.

 

V. Auxiliary Tech Projects

CoopGuide

Coop Guide - Cooperative Collaborative Development

Working together on projects is one of the most important goals of our tech coop. It is also the 6th Cooperative Principle, Cooperation among Cooperatives.  CoopGuide is a work in progress being built to facilitate team members in locating each other and getting familiar with each other's skills. The idea for this site came from discussions at Agaric's weekly Show and Tell gatherings. 

SnowDrift

Snowdrift Cooperative

A crowdmatching platform that is a fund raising source for public goods. The first project will be to fund the building of Snowdrift itself. Micky is on the board and is working with the team to guide the formation of this cooperative effort.

IEEE.org SA Open

IEEE SA Open.

The SA Open is a platform, by the IEEE and managed by LeadingBit, that
aims to create a set of agreed upon standards to help people, both technical and organic, co-work more effectively to build Free Software with proper documentation and support materials on using and changing it. Agaric volunteers as a member of the Community Advisory Group, where we offer our expertise on this very subject. You can get involved with SA Open and help make it happen.

meet.coop

meet.coop logo.

Meet.coop is an online meeting co-operative dedicated to hosting BigBlueButton video chat servers in multiple locations around the world. Agaric is a member.  We meet weekly in different teams to work out the governance and member issues. There is an operational team that builds and maintains the hardware and software for providing an excellent video conference network structured in Sociocracy, also called dynamic governance. Meet.coop has forums where you can mingle with members and get up to date information on the development and learn more about the project.

Mastodon

mastodon logo.

Mastodon is a federated social network made up of affinity groups. The functionality is much like Twitter, where you can message other members and share information or "Toots" as they are called, in a group or one-on-one. You can join a sub-community or create your own. Agarics are members of the social.coop sub-community. Members can contact members of other sub-communities and there is a directory where you can browse the groups in the whole federation.

Mass Mesh

MassMesh.org logo.

Mass Mesh is a high-tech social club building community-owned mesh networks throughout Boston. These networks enable home Internet access that is fairer, more secure, and more locally resilient than traditional cable. The purpose of this wiki is to provide you with all of the information you need to join the mesh by setting up your own mesh node. All of the information on their site and all of the code in their software is free to use share and edit.

We received the go-ahead from Studio Daniel Libeskind to take their web site live a few weeks ago, but it was presenting here at Pacific Northwest Drupal Summit that we realized we should mention it to the world.

The architect partners and their one-woman public relations powerhouse are fantastic, as was the project's driving force and designer, Todd Linkner.  We'll be sharing much more about this project, but in the meantime, enjoy this bold site:

http://daniel-libeskind.com

What are you all about?

 

 

Find It Overview

I. Features

  1. Intuitive, Structured Authoring Experience for Service Providers
  2. Easy but Powerful Search for Residents
  3. Informative Opportunity Pages

II. Communities Using Find It

 

I. Features

1. Intuitive, Structured Authoring Experience for Service Providers

The value of a directory are the listings within it. It is truly a community effort to assemble enough accurate and up-to-date resources in a single place for it to be useful. For Cambridge, the service providers that work at government agencies and nonprofits are the lifeblood of the directory. Without them, there would be no Find It Cambridge.

For these service providers (many already pressed for time), Find It is a system that is easy enough to take the time to enter information into, and which conveniently structures the data so that it can easily be searched and filtered on by community-members looking for opportunities.

Through user research, we mapped the information architecture to the mental models that service providers hold for their events and programs.

Input Fields Grouped by Key Questions

Most service providers thought of their events in terms of what the event is about, how to contact the organizers, who it is for, when it is happening, where it is happening, how much it costs, and if there is any sort of registration required. So we organized fields into working tabs to match: About, Contact, For whom, When, Where, Cost, and Signup.

Autosave and Soft Required Fields

Even with fields grouped by tabs, the form can take some time to complete. That is why we introduced autosave and soft save features. When working on a form, the site automatically saves the current draft every few seconds. Service providers can also save a draft to return to later. Fields that are required for publishing, are optional for a draft.

Draft States to Save Work for Later

Service providers have many responsibilities to juggle. It is important that they can start creating an event or program, save it and return to it later before publishing it.

Drupal has powerful workflow states, which we have put to use to help service providers clearly know the status of their content.

A service provider can either save their content as a draft or publish it immediately. If saved as a draft, a banner appears on the page clearly indicating that the event or program is not yet published.

Screencast of save as a draft workflow.
Authors can save their work as a draft, bypassing required fields until they are ready to publish.

Authors can also create a draft alongside a published version. This allows new versions to be worked on, while maintaining the current page for site visitors.

Screencast of workflow for having a draft while a previous version of a page stays publishe
Authors can have a published version of a page and also have a working draft that eventually becomes the new version.

Help Text and Character Counts for Guidance

There are particular ways to write and format content on events and programs to make the most of Find It's features. We provide help text along the way to clue providers in on the best ways to write their content. We also include a character count so providers know if they are staying within the recommended limits for certain text fields.

Bulk Select for Quick Data Entry

Certain fields have many options. In some cases the majority of them apply. For example, many educational events are for all ages up to 18. In that scenario, having a "Select All" option speeds up the data entry process. The Selectize JavaScript library adds elegant toggle and check all options to multi-value fields. We created the CheckboxesJS Drupal project so that other Drupal sites can easily incorporate these features on fields of their choosing.

Conditional Fields to Show Only What is Relevant

Some fields on Event and Programs only need to show under certain conditions. For example, if an event does not require registration, then there is no need to worry service providers with a registration link field. Using conditional logic keeps forms simple and streamlined.

Multiple Dates

There was a lot of discussion on whether to support repeating rules or instead allow multiple dates. We decided on multiple dates, as experience has shown that even repeating events oftentimes have exceptions (and because the events we import from Cambridge Public Libraries are a list of arbitrary dates rather than a recurring rule, and somehow no one in computer science has created a library to produce a best-effort recurring rule from a list of dates).

Multiple date fields.
Multiple date fields allow for flexibility on events and programs that happen more than once.

2. Easy but Powerful Search for Residents

Find It search is powered by Apache Solr, a popular open-source enterprise search platform. We use its numerous features to make the search results as relevant as possible for site visitors.  It is an ongoing process of tweaks; here are some of the things we have done so far.

Weighted Fields for Relevance

On content with lots of data like the events and programs of Find It, certain fields carry more importance than others. The title of an event, for example, is one of the most important. The transportation notes, on the other hand, carries less significance in search queries. When someone types the keyword "music lesson", an event with music lesson in the title or summary shows up before a program for English lessons.

Synonym Matching

When someone searches "childcare" but a program uses "child care", the search engine should know these are equivalent. The same is true for "STEM" and "science education."

Find It supports synonyms. The site manager can define synonyms so that when site visitors search for a certain term, results with matching synonyms show up as well.

Key Information in Search Results

We used the results of our user research to show the critical information people need to pin point the right opportunities: title, neighborhood, and a short summary.

Filters for Sophisticated Queries

Filters help users narrow a search query down to specific criteria. In our testing, we found that age and neighborhood were most important, especially for low-income caregivers. For those of us that rely on public transportation, events and programs need to be nearby. We placed these filters accordingly towards the top of the page.

Naming conventions in Cambridge are unique, which is true for other cities too. Residents might not know the official name of their neighborhood or live at the border between two. We have included a labeled, clickable map to help users choose the right neighborhood. We built this so that other Find It platforms can upload their own SVG map to show their neighborhood.

3. Informative Opportunity Pages

Find It comes out of the box with four different types of opportunities: Events, Places, Organizations and Programs.

Organization

The organization serves as the foundation for opportunities posted on a Find It page. Every event and program posted to Find It, belongs to an organization. This helps an organization's page serve as a mini-website. When an event or program is published, it automatically shows up on its organization page.

Organizations can also have "child" organizations, which is helpful for larger groups that might have distinct sub-committees or departments that have sub-departments.

Related programs field.
An organization can have a parent - child relationship.

Event

An event is an opportunity with a clear start and end date. When an event is published it shows up on the Homepage, Events page, Search page and on the organization's page.

Visitors can sort opportunities by start date to find upcoming events.

Find It event page.
An event's multiple dates is converted into human friendly language.

Program

A program is similar to an event. In fact, most fields are shared between the two. A program though, implies more longevity and commitment than an event. Rather than requiring a specific date or dates, a program can simply be "ongoing." There is the option to include specific dates though.

Find It program page.

Place

In the first version of Find It Cambridge, a new opportunity surfaced that did not quite fit into the event, program, or organization categories. Parks, neighborhood pools, and other destinations were a good fit for Find It's library of opportunities. They have open hours, but many of the event fields were irrelevant. The same went for Programs. In fact, sometimes these places have events or programs happening at them.

These are community-minded destinations people can go to. In other words, places.

Find It place page.

 

II. Communities using Find It

Find It Cambridge

Curated by members of the Cambridge Kid's Council, Find It Cambridge was designed to help busy parents stay informed about the plethora of educational opportunities available for their children.

Navigator Immigrant Integration Program (coming soon!)

Curated by Immigrant Family Services Institute, the Immigrant Navigator was designed to provide information on educational events and social services for new Haitian Immigrants in order to ease their transition into life in the United States.

 

 

The entity_generate process plugin receives a value and checks if there is an entity with that name. If the term exists then it uses it and if it does not then creates it (which is precisely what I need).

So, here is a snippet of the article migration YAML file using the entity_generate plugin:

id: blog
migration_group: Drupal
label: Blog
source:
  plugin: d7_node
  node_type: blog
destination:
  plugin: entity:node
process:
  status: status
  created: created
  field_tags:
    plugin: sub_process
    source: field_tags
    process:
      target_id:
      - plugin: entity_generate
        source: name
        value_key: name
        bundle_key: vid
        bundle: tags
        entity_type: taxonomy_term
        ignore_case: true
        …

In our field_tags field we are using the Drupal 7  field_tags Values We are going to read the entities and pass that value into the entity_generate plugin to create the entities. In this example, there is a problem,  the d7_node migrate plugin (included in the migrate module) provides the taxonomy terms IDs and this will make the entity_generate plugin to create some taxonomy terms using the IDs as the term names, and this is not what we want.

So what I need to do is to get from somewhere the terms names, not their ids, to do that I need to add an extra source property.

First, we need to create a new custom module and in there create a source plugin which extends the Node process plugin, something like this (let's say that our custom module’s name is my_migration):

Create the file:

my_migration/src/Plugin/migrate/source/MyNode.php

And the file should contain this code:

namespace Drupal\my_migration\Plugin\migrate\source;

use Drupal\migrate\Row;
use Drupal\node\Plugin\migrate\source\d7\Node;

/**
 * Adds a source property with the taxonomy term names.
 *
 * @MigrateSource(
 *   id = “my_node",
 *   source_module = "node"
 * )
 */
class MyNode extends Node {

  public function prepareRow(Row $row) {
    $nid = $row->getSourceProperty('nid');
    // Get the taxonomy tags names.
    $tags = $this->getFieldValues('node', 'field_tags', $nid);
    $names = [];
    foreach ($tags as $tag) {
      $tids[] = $tag['tid'];
    }
    if (!$tids) {
      $names = [];
    }
    else {
      $query = $this->select('taxonomy_term_data', 't');
      $query->condition('tid', $tids, 'IN');
      $query->addField('t', 'name');
      $result = $query->execute()->fetchCol();
      $names[] = ['name' => $result['name']];
      foreach ($result as $term_name) {
        $names[] = ['name' => $term_name];
      }
    }
    $row->setSourceProperty('field_tags_names', $names);
    return parent::prepareRow($row);
  }
}

It does the following things:

  • It reads the nid of the article
  • Gets all the terms IDs of the field_tags field
  • For each ID, it gets the name of the term and put it in the `names` array
  • Finally, it sets this value inside the $row using the `setsourceProperty` method.

Now our rows will have a property called fields_tags_names with the terms names, and we can pass this data to the entity_generate plugin.

We need to make a few adjustments in our initial migration file,  first and most important update the  source plugin to use our new source plugin:

source:
  plugin: my_node
  …

And update the source in the field_tags field to use the new  field_tags_names source property.

  …
  field_tags:
    plugin: sub_process
    source: field_tags_names
  ….

The final migration file looks like this:

id: blog
migration_group: Drupal
label: Blog
source:
  plugin: my_node
  node_type: blog
destination:
  plugin: entity:node
process:
  status: status
  created: created
  field_tags:
    plugin: sub_process
    source: field_tags_names
    process:
      target_id:
      - plugin: entity_generate
        source: name
        value_key: name
        bundle_key: vid
        bundle: tags
        entity_type: taxonomy_term
        ignore_case: true
        …

And that’s it; if we run the migration, it will create on the fly the terms if they do not exist and use them if they do exist.