FM Publisher Preview

Published on June 15, 2020.

For a few months now, I've been working on a RapidWeaver stack that can be used to publish data that's stored in FileMaker databases. My goal is to make it as easy as possible to create database-driven Web sites and applications that look nice, are fast, secure, and reliable.

I announced the project on the RapidWeaver Forums a few months ago. I've recently received a few inquiries about the project, so I thought I'd take a few minutes to show some of the progress that I've made on it.

For clarity and consistency with some of the other stacks that I'm working on (including Air Publisher, the Airtable database publishing stack that I released in early May), I've renamed the stack. I'm now referring to it as "FM Publisher."

The FileMaker Database

The database that I used for this blog post is a simple inventory database. I created it using FileMaker's "Inventory" starter solution. Here's what that database looks like, with a few sample products loaded.

The database is hosted using FileMaker Server. In the database, I've setup an account that has read-only access, and it can connect to the database via the FileMaker Data API ("fmrest").

The Stacks

FM Publisher consists of two stacks: A "base" stack and a "portal" stack.

The FM Publisher Base stack is used to connect to a FileMaker database, specify what records you want to publish, and how the records should be displayed. You can publish data from a single record or multiple records. When publishing multiple records, you can choose to filter and/or sort the records.

The FM Publisher Portal stack is used to publish related records. You can use it to specify how each related record ("portal row") should be displayed. I'll discuss that stack briefly, but cover it in depth in a future blog post.

The FM Publisher Base stack

To use the FM Publisher Base stack, you first provide information about the FileMaker database, including the address of the FileMaker Server on which the database is hosted, the name of the database, the username and password that are to be used, and the layout that you would like to use. (The layout determines what fields and portals are returned by the Data API.)

Here's a screen shot that shows the settings for the FM Publisher Base stack.

As I mentioned above, you can use the Base stack to publish a single record or a group of records. To display a single record, you set its Record ID in the stack settings. To display a list of records, you leave the Record ID blank. You can specify Limit and/or Offset values to retrieve records in batches (which can be used for pagination).

If you'd like to display records that meet a certain set of criteria, you can specify the criteria in the "Record Filtering" area. The filter criteria are entered as a JSON array, with each element representing what is essentially a find request. Each request can have one or more criteria, and you can indicate if the request should be an "include" or "omit" type. In this example, I'm only records that are in the "Backpacks" category will be returned.

If you'd like to present the records in a specific order, you can use the "Record Sorting" area to specify the sort information. In this example, the records will be sorted in ascending order by the product name. You can, of course, sub-sort the records - but I'm not doing that in this example.

Here's a screen shot showing the "Record Filtering" and "Record Sorting" areas.

There are drop zones that can be use to specify the content that should be displayed both above and below a list of records. An additional drop zone can be used to display content that you'd like to display if no records are returned by the Data API.

The "Records" drop zone is where you specify how each record should be displayed. In this example, each record is displayed using two columns. In the left column, I've added tokens that represent the product's name, manufacturer, part number, description, and price. The right column includes the product's photo (and the tooltip for the photo is the product part number). The following screen shot shows the Records drop zone with stacks and tokens in it.

I mentioned above that the FM Publisher Portal stack can be used to publish related records. The "Inventory Transactions" HTML stack that is shown in the screen shot shows just how easy it is to publish related records. You simply add a token that represents a portal (using its name). I've disabled this stack for this example. But again, I'll cover it in a future blog post.

The Web Page

When the RapidWeaver site is published and the page loads, a call is made to the FileMaker Data API. If one or more records are returned, then the content in the Records Intro, Records, and Records Outro drop zones will be displayed. For each record, an instance of the stacks in the Records drop zone is created, and any tokens will be substituted using values from the record. Here's an example of what the page looks like in this example.

For this project, I've used the Foundry RapidWeaver framework, by Elixir Graphics. Foundry generates Bootstrap-based code, and as a result, the Web page is responsive.

Next Steps

I still have a few things to do before FM Publisher will be ready for release. If all goes well, I am hoping to make the stack available this week. In the meantime, please feel free to reach out to me with questions, or join the conversation on the RapidWeaver Forums.

About Me

Hello, I’m Tim Dietrich. I design and build custom software for businesses running on NetSuite — from mobile apps and Web portals to Web APIs and integrations.

I’ve created several widely used open-source solutions for the NetSuite community, including the SuiteQL Query Tool and SuiteAPI, which help developers and businesses get more out of their systems.

I’m also the founder of SuiteStep, a NetSuite development studio focused on pushing the boundaries of what’s possible on the platform. Through SuiteStep, I deliver custom software and AI-driven solutions that make NetSuite more powerful, accessible, and future-ready.

Copyright © 2025 Tim Dietrich.