Services
Company
Blog
Contact
Open Source

Latest Updates / 3

Company and industry news, featured projects, open source code, tech tips, and more.

Run The Ollama API On macOS With Custom Host Bindings

Michael Argentini Avatar
Michael ArgentiniSunday, July 28, 2024

By default the ollama API runs on the localhost IP address of 127.0.0.1. If you want to host it on all of your Mac's IP addresses it requires that you set a system-wide environment variable. The problem with doing this is that Login Items (in System Settings) can launch before Launch Agents. This means that Ollama (in the menu bar) may not see the host settings. To solve this you need to launch Ollama at startup after a delay.

Here's how to add the host binding for all IP addresses on the Mac and then have Ollama launch 10 seconds after you sign in. This works in macOS 14.5 Sonoma and should work in later versions.

Step 1: Create a launch daemon plist file below. Save it as com.fynydd.ollama.plist.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.fynydd.ollama</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/launchctl</string>
        <string>setenv</string>
        <string>OLLAMA_HOST</string>
        <string>0.0.0.0</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>LaunchOnlyOnce</key>
    <true/>
</dict>
</plist>

Step 2: Copy the file to two locations:

/Library/LaunchDaemons/
~/Library/LaunchAgents/

This will set the host bindings at the system level, and also at the user level. So you should be covered no matter how you launch Ollama in the future.

Step 3: Set file permissions on the system-level file.

sudo chown root:wheel /Library/LaunchDaemons/com.fynydd.ollama.plist
sudo chmod 644 /Library/LaunchDaemons/com.fynydd.ollama.plist

Step 4: Install the launch agents:

sudo launchctl bootstrap system /Library/LaunchDaemons/com.fynydd.ollama.plist
launchctl load ~/Library/LaunchAgents/com.fynydd.ollama.plist

Now your system will start up and bind the Ollama host address to all IP addresses on the Mac.

Step 5: To launch Ollama after a 10 second delay, Open Script Editor and create the simple AppleScript file below.

delay 10
tell application "Ollama" to run

In the File menu choose Export, and then export it as type “Application” and name it “LaunchOllamaDelay”. Save it to your user Applications folder.

In System Settings go to Login Items and add the LaunchOllamaDelay application to the startup items. Also remove any existing Ollama startup item.

Now when you restart and sign in, Ollama will launch after 10 seconds which should be enough time for the Launch Agent to have executed. And if Ollama updates itself in the future it should also just work when it restarts.

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Sfumato CSS

Michael Argentini Avatar
Michael ArgentiniThursday, July 25, 2024

Sfumato is a lean, modern, utility-based CSS framework generation CLI tool. It is compatible with the Tailwind CSS class naming structure and has the following additional features:

  • Cross-platform multi-threaded native code; much faster than Tailwind's javascript code
  • System-wide CLI utility; one install works for all your projects
  • Embedded Dart Sass gives you all the benefits of using Sass/SCSS as part of your workflow
  • Additional utility classes for adaptive and scalable layouts
  • System theme matching as well as classes that include “light”, “dark”, and “auto"
  • Integrated form element styles (class compatible with Tailwind forms plugin)
  • Supports redirected input for use in automation workflows

Visit the repository to see how you can install this tool to begin using it right away.

How To Use

Create one simple sfumato.yml file (manually or using the Sfumato "init" command) for your web-based app or website project and run the Sfumato CLI "watch" command. It will watch your project files as you work, keeping track of your markup changes, and will transpile your SCSS files into custom, tiny CSS files based only on the Sfumato features you use.

Use the following command for more information on Sfumato commands and options:

sfumato help

Installation

1. Install Microsoft .NET

Sfumato requires that you already have the .NET 9.0 runtime installed, which you can get at https://dotnet.microsoft.com/en-us/download.

2. Install Sfumato

Run the following command in your command line interface (e.g. cmd, PowerShell, Terminal, bash, etc.):

dotnet tool install --global fynydd.sfumato

Later you can update Sfumato with the following command:

dotnet tool update --global fynydd.sfumato

Uninstall

If you need to completely uninstall Sfumato, use the command below:

dotnet tool uninstall --global fynydd.sfumato
Screenshots

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Automate The Installation of All Your Mac Apps Using Homebrew And Mas

Michael Argentini Avatar
Michael ArgentiniWednesday, July 10, 2024

On macOS it's pretty easy to automate the installation of all your apps, including Mac App Store apps, for those times when you get a new Mac or wipe your current one. As a software developer I find this capability indispensable, as would any professional or power user.

All you need to do is install Homebrew and then use it to install mas (which is an acronym for Mac App Store). Once they are installed, you can install all your software using a convenient Bash script. Homebrew will be used to install non-store apps, and mas will handle installing the Mac App Store apps.

Note: only Mac App Store apps you have already installed previously can be installed with mas. You cannot install new apps you have never installed from the store.

Why Do This?

The most obvious reason to script out your software installations is that it greatly reduces the time to set up a new Mac, as well as ensure that you don't forget to install one or more apps. It also provides a way to update all the apps at once via the brew upgrade command. And it also provides a way to update apps that don't have their own update feature.

Apps installed with mas will be updated normally by the Mac App Store.

How Does This Work?

In order to use this process you need to know the names of the Homebrew formulae/casks for each application, and you also need to know the IDs of the Mac App Store apps for mas. Fortunately this is super easy.

First, Homebrew has a tool for finding software available in their service at https://formulae.brew.sh/. Simply use this to find your apps and make sure you're installing the right ones. Those listed as “casks” are GUI Mac apps (normal apps you don't run from the Terminal). Ones listed as “formulae” are typically command line tools run from the Terminal or services without an interface.

Second, for Mac App Store apps you simply use mas to list what's currently on your computer from the Mac App Store.

mas list

This will give you a list of currently installed apps from the Mac App Store, with their IDs:

1569813296  1Password for Safari      (2.10.0)
975937182   Fantastical               (3.7.12)
409183694   Keynote                   (13.0)
etc.

You can also search for Mac App Store apps by name using the mas search command:

mas search Xcode

This will show a similar result for matches. You can even install all search results with a single “lucky” command. See the mas help for these and other options.

Script Example

Here's an example of a Bash script to get you started. I keep a similar script updated as I use new apps or stop using others. Then I'm ready to go when I have to set up a new or wiped Mac.

# Install Homebrew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# App Store Automation

brew install mas

# Install App Store Apps

mas install 409183694   # Keynote
mas install 409201541   # Pages
mas install 409203825   # Numbers

# Install Non-Store Apps

brew install --cask firefox
brew install --cask knockknock
# etc.

You can name the Bash script something like install-software.sh and execute it in a Terminal like this:

zsh install-software.sh

The first time you use the script will absolutely justify the time spent writing it. The second time you run it you will thank your past self for being so smart 😉.

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Project: Coursabi

Michael Argentini Avatar
Michael ArgentiniWednesday, July 3, 2024

Fynydd partnered with Blue Sequoyah Technologies to build a community-driven learning platform named Coursabi, which gives learners a simple but powerful way to grow as they follow their learning journey. Their dashboard shows them progress to-date and what assignments are next. They can explore the content library for elective learning, sign documents, and complete forms. And the community gives them a way to learn from peers and content authors.

Coursabi Mission Control is where authorized users can create and organize training content like documents, forms, and courses. There are also libraries for audio and video content, as well as imported learning modules. People and learning assignments are managed here. And administrators and training managers can stay up-to-date using dashboards, reports, notifications, community activity, and so much more.

  • Amazon AWS, CloudFront, S3, Okta SSO
  • SCORM/xAPI/HTML import, native Coursabi content
  • Courses, documents, audio, video, forms, events, community, and more
  • Real-time reporting and analytics suite
  • Native content builders
  • Assignments, progress tracking, notifications
  • Team and role-based security for authors, members, and content
Screenshots

Key Technologies

Front-End

Blazor

C#

CSS3

HTML5

JavaScript

Microsoft .NET

Sass/SCSS

Cloud Back-End

Amazon Web Services

C#

Github

Microsoft .NET

Microsoft Windows

SQL Server

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

SqlPkg for Microsoft SqlPackage

Michael Argentini Avatar
Michael ArgentiniMonday, July 1, 2024

SqlPkg is a 64-bit .NET command line (CLI) wrapper for the Microsoft SqlPackage CLI tool with the goal of making common backup and restore operations easier and more powerful. It does this through new Backup and Restore actions that provide additional features like the exclusion of specific table data in backups and destination prep prior to restore.

Visit the repository to see how you can install this tool to begin using it right away.

New Action Modes:

/Action:Backup
This mode is equivalent to Action:Export to create a .bacpac file, with the following differences.

  • Specify one or more /p:ExcludeTableData= properties to exclude specific table data from the bacpac file. The table name format is the same as the /p:TableData= property.
  • /SourceTrustServerCertificate: defaults to true.
  • /SourceTimeout: defaults to 30.
  • /CommandTimeout: defaults to 120.
  • /p:VerifyExtraction= defaults to false.
  • Destination file paths will be created if they do not exist.

/Action:Restore
This mode is equivalent to Action:Import to restore a .bacpac file, with the following differences.

  • The destination database will be purged of all user objects (tables, views, etc.) before the restoration.
  • If the destination database doesn't exist it will be created.
  • /TargetTrustServerCertificate: defaults to true.
  • /TargetTimeout: defaults to 30.
  • /CommandTimeout: defaults to 120.
  • Destination file paths will be created if they do not exist.

/Action:Backup-All
This mode will back up all user databases on a server.

  • Provide a source connection to the master database.
  • Provide a target file path ending with 'master.bacpac'. The path will be used as the destination for each database backup file, ignoring 'master.bacpac'.
  • Optionally provide a log file path ending with 'master.log'. The path will be used as the destination for each database backup log file, ignoring 'master.log'.
  • Accepts all arguments that the Backup action mode accepts.

/Action:Restore-All
This mode will restore all *.bacpac files in a given path to databases with the same names as the filenames.

  • Provide a source file path to 'master.bacpac' in the location of the bacpac files. The path will be used as the source location for each database backup file to restore, ignoring 'master.bacpac'.
  • Provide a target connection to the master database.
  • Optionally provide a log file path ending with 'master.log'. The path will be used as the destination for each database backup log file, ignoring 'master.log'.
  • Accepts all arguments that the Restore action mode accepts.

When not using SqlPkg special action modes, the entire argument list is simply piped to SqlPackage and will run normally. So you can use sqlpkg everywhere SqlPackage is used.

Installation

1. Install Microsoft .NET

SqlPkg requires that you already have the .NET 8.0 runtime installed, which you can get at https://dotnet.microsoft.com/en-us/download.

Because SqlPkg uses Microsoft SqlPackage, you will also need to install the .NET 6.0 runtime as well as SqlPackage.

dotnet tool install -g microsoft.sqlpackage

2. Install SqlPkg

Run the following command in your command line interface (e.g. cmd, PowerShell, Terminal, bash, etc.):

dotnet tool install --global fynydd.sqlpkg

Later you can update SqlPkg with the following command:

dotnet tool update --global fynydd.sqlpkg

Uninstall

If you need to completely uninstall SqlPkg, use the command below:

dotnet tool uninstall --global fynydd.sqlpkg
Screenshots

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Fdeploy for Web App Deployments

Michael Argentini Avatar
Michael ArgentiniSaturday, June 1, 2024

The Fdeploy project is a command line interface (CLI) application that can use simple YAML config files in your ASP.NET web projects to define deployment to one or more remote environments over SMB, like over a VPN connection using a network file share.

It can be configured to clean and purge the project, build, and publish, and even add files and folders to the published output prior to deployment.It can then deploy with various rules like "path ignore", "always update path", "clean orphaned files and folders", and more. You can even define content that can be deployed without taking the web app offline. And when it does, it uses an app offline file that you can also customize in the YAML settings.

Fdeploy also has robust retry support. When files are in-use on the remote server it will retry one or more times and wait a specified number of seconds between attempts.

Visit the repository to see how you can install this tool to begin using it right away.

Installation

1. Install Microsoft .NET

Fdeploy requires that you already have the .NET 8.0 runtime installed, which you can get at https://dotnet.microsoft.com/en-us/download.

2. Install Fdeploy

Run the following command in your command line interface (e.g. cmd, PowerShell, Terminal, bash, etc.):

dotnet tool install --global fynydd.fdeploy

Later you can update Fdeploy with the following command:

dotnet tool update --global fynydd.fdeploy

Uninstall

If you need to completely uninstall Fdeploy, use the command below:

dotnet tool uninstall --global fynydd.fdeploy
Screenshots

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Project: US Bank Knowledge Center Analysis

Michael Argentini Avatar
Michael ArgentiniSaturday, June 1, 2024
US Bank corporate headquarters in Minneapolis, MN US Bank corporate headquarters in Minneapolis, MN

US Bank partnered with Fynydd to perform deep analysis on how technology can be used to offload support calls, facilitating rapid growth through acquisition. The research involved tactics across domains, including in-branch interviews in multiple states across the U.S., existing technology reviews, and more.

US Bank was acquiring smaller banks and growing at a fast pace. And with growth comes hiring new employees. And with hiring comes training. They soon discovered that there was an opportunity to re-think how they manage internal support. But they weren't sure where to begin.

Fynydd was brought in to help analyze the situation and make technical recommendations based on thorough research with the next decade in mind. We coordinated with several key stakeholder groups, like human resources, IT, branch services, and others. We traveled to several states in the continental U.S. and spoke with branch managers, tellers, and bankers, to understand their challenges with existing processes, and see their environments.

Once we understood the current state and what was needed, we authored a 105-page bound reference report outlining our findings and technical recommendations.

Some of the highlights of the analysis includes:

  • 3,085 branches, 7 call centers with 25% turnover
  • 1,181,069 support calls per year; 3,236 per day
  • Analyzed existing intranet Knowledge Center and business processes
  • Content analysis, branch surveys and interviews, and concept modeling
  • 105-page phase 1 analysis and recommendations report (printed and bound)
Report Page Samples

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Namecheap DNS

Michael Argentini Avatar
Michael ArgentiniWednesday, May 15, 2024

The NameCheap project builds a command line interface (CLI) application that can add and remove text records using the NameCheap API.

It was originally built to allow for creating wildcard TLS certificates using win-acme (Let's Encrypt) on an IIS server. Creating wildcard certificates with win-acme requires DNS host validation. This application can be used with the win-acme script feature to allow it to communicate with the NameCheap API and create/delete TXT records that will validate domain ownership.

This tool does not support the complete NameCheap API. But it does handle the challenging task of adding and removing text records. Why is this challenging? The NameCheap API does not have functions to add or remove individual records, so the entire set of records must be downloaded, modified, and sent back.

How to Install

Download the project and publish it from the root project folder as below.

dotnet publish Fynydd.NameCheap/Fynydd.NameCheap.csproj -o publish -p:PublishSingleFile=true -c Release -r win-x64 --self-contained

In the publish folder, edit the appsettings.json file and supply your own values.

{
    "NameCheap": {

        "ApiKey": "{your namecheap API key}",
        "UserName": "{your namecheap username}",
        "ApiUserName": "{your namecheap API username}",
        "ClientIP": "{a whitelisted IPv4 address}"
    }
}

Note:

  • You can enable the NameCheap API and get a key on their website.
  • UserName and ApiUserName are usually the same value, and it is usually the user name you use to sign in to NameCheap.
  • ClientIP is a whitelisted IP address allowed to connect to the API. These whitelisted addresses can be added to NameCheap when/where you enable the API on their website. Note: API calls will check your current WAN IP with the one you provide in the settings. So they need to match.

Once the appsettings.json file is modified, put the contents of the publish folder on your server and you should be able to use the executable with win-acme or any other tool by calling it with a fully qualified path.

Usage

The command line is in the format below:

Fynydd.NameCheap.exe [create|delete] [hostname] [name] [value]

Some examples include:

Fynydd.NameCheap.exe create example.com * testrecord=yaddayadda
Fynydd.NameCheap.exe create example.com my.api mykey=yaddayadda
Fynydd.NameCheap.exe create example.com my.txt "val1=yadda; val2=yadda"

So in win-acme you would set your create script arguments to this:

create {ZoneName} {NodeName} {Token}

Likewise, your delete script arguments would be:

delete {ZoneName} {NodeName} {Token}

macOS and Linux

The tool can be used on Linux or macOS as well. If the published executable doesn't run on macOS you may need to manually sign the published application using something like this:

cd publish
codesign -s - Fynydd.NameCheap

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Project: BPCC Open Campus Mobile

Michael Argentini Avatar
Michael ArgentiniWednesday, May 1, 2024
Bossier-Parish Community College campus, Bossier City, LA. Bossier-Parish Community College campus, Bossier City, LA.

Fynydd was asked to build a hybrid iOS, Android, and web-based learning app platform for enrolled and public students at Bossier Parish Community College (BPCC) in Bossier City, Louisiana. This was a full-stack platform that included a data tier, API service with management interface, client apps (App Store, Google Play Store), and responsive website.

The goal of the project was to research the efficacy of gamification strategies with regard to testing up and testing out of courses prior to enrollment. Secondarily it provided a great way for students to study and hone their knowledge during each semester.

The platform provided various curriculum through video courses, which each had check your knowledge quizzing as students progressed. Students could earn badges as they advanced through their learning journey and also challenge each other to quiz games for additional badges and bragging rights via a leader board.

Some of the features of the platform include:

  • Hosted on Amazon EC2
  • Multilingual using i18n
  • Integration of Wiris MathType for complex math equations
  • Integration with Canvas LMS
  • Peer to peer learning games with badging, grading, and advanced tracking
  • Library of video courses, quiz engine
  • SSO with social platforms including Facebook, Twitter/X, and Google
Screenshots

Key Technologies

Front-End

Android

Angular

CSS3

HTML5

Ionic Framework

iOS

JavaScript

Sass/SCSS

Cloud Back-End

Amazon Web Services

C#

Github

Microsoft .NET

Microsoft Windows

React

SQL Server

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

Project: Ore-Ida Frozen Sweepstakes

Michael Argentini Avatar
Michael ArgentiniMonday, April 1, 2024

Fynydd was asked to help Ore-Ida and Disney by building a high-performance Sitecore platform for their upcoming sweepstakes supporting the movie Frozen. The sweepstakes was built as part of the Heinz multi-tenant Sitecore platform, with a high priority on security, performance, and availability.

The platform allowed visitors to enter the sweepstakes with enforcement of specific business logic regarding how often they could enter and how many times per day. It leveraged a two-tier caching system for optimal performance, including additional optimizations on media and delivery.

Some of the features of the platform include:

  • Sitecore multi-tenant platform
  • ASP.NET compiled and optimized
  • Microsoft SQL Server Enterprise database service
  • Security features for sweepstakes entrance restrictions
  • Abuse protections including bot identification, distributed denial of service (DDoS) mitigations, scripting attacks, etc.
  • SEO optimizations for optimal search engine placement
  • Transactional email system for entrant communications

Given the large brands behind the promotion, it garnered a large amount of traffic in a relatively short period of time and was a huge success.

The performance metrics include:

  • Recipes, product information, movie trailers, and more
  • Heinz multi-tenant Sitecore environment
  • 1,212,179 entrants in 75 days
  • 16,162 entrants per day
  • Opt-in conversion: 15%
Screenshots

Key Technologies

Front-End

CSS3

HTML5

JavaScript

Microsoft .NET

Sass/SCSS

Cloud Back-End

C#

Github

Microsoft .NET

Microsoft Azure

Microsoft Windows

Sitecore

SQL Server

Want to know more?

There's usually more to the story so if you have questions or comments about this post let us know!

Do you need a new software development partner for an upcoming project? We would love to work with you! From websites and mobile apps to cloud services and custom software, we can help!

© 2025, Fynydd LLC / King of Prussia, Pennsylvania; United States / +1 855-439-6933

By using this website you accept our privacy policy. Choose the browser data you consent to allow:

Only Required
Accept and Close