Generally, when you use a font in lazarus, the font needs to be installed on the user's system in order for it to be properly shown. And sure, you could make an installer or package which installs the font system-wide, but that can be problematic for portable apps. A nice way around this problem is by embedding the font into the executable, and loading it at runtime. There's some examples on how to do this on Windows, but there isn't really any good cross-platform examples out there that I've seen. If you're using lazarus with qt (qt6 in my example) then qt already provides a nice cross-platform way of doing this, so we can leverage that mechanism and get something that works on all qt-supported platforms. Here's a quick little step-by-step guide: ======================================= Step 1: Include the font as a resource: ======================================= * Copy the font into your source directory tree. * Project->Project options, Resources, click (+) Add. Select the font, should show up as a relative path. Set the resource type to RCDATA, give it a name. ================================= Step 2: Load the font on startup: ================================= It's important to load the font BEFORE any other qt gui elements are initialized, otherwise, if the font wasn't seen by the system, it might have already picked a fallback font. A good place might be in your lpr file before Application.Initialize, for example. In the example code below, obviously replace 'FONT_RESOURCE_NAME' with whatever you named your resource. {$R *.res} ... uses qt6, LCLIntf, LCLType, LResources ... function QByteArray_Create: QByteArrayH; cdecl; external Qt6PasLib name 'QByteArray_Create'; overload; function QByteArray_Create( data: PChar; size: SizeInt): QByteArrayH; cdecl; external Qt6PasLib name 'QByteArray_Create2'; overload; function QByteArray_Create( size: Integer; c: Char): QByteArrayH; cdecl; external Qt6PasLib name 'QByteArray_Create3'; overload; procedure QByteArray_Destroy(handle: QByteArrayH); cdecl; external Qt6PasLib name 'QByteArray_Destroy'; procedure LoadFonts; var ByteArr: QByteArrayH; Res: TResourceStream; FontID: Integer = 0; begin Res := TResourceStream.Create(HInstance, 'FONT_RESOURCE_NAME', RT_RCDATA); try ByteArr := QByteArray_create(Res.Memory, Res.Size); try FontID := QFontDatabase_addApplicationFontFromData(ByteArr); finally QByteArray_Destroy(ByteArr); end; finally FreeAndNil(Res); end; end; ... So, we include qt6, but at this time, qtpas does not include the forward declarations needed for creating/destroying QByteArrays, instead it contains an incomplete stub class declaration, so we have to fill in the blanks. Thankfully, the qt6 unit already defines 'Qt6PasLib' for us so we don't have to go find the library file or hardcode it, which makes adding new external symbols relatively painless. Finally, it is important to note that while most controls have a Qt equivalent class, not all LCL controls are rendered with Qt, and for those controls, the font will not be found. One canonical example of this is TLabel, which renders it's own graphics, rather than using a QLabel internally. To get around this problem, and to make sure your loaded font is usable in labels, use TStaticLabel controls instead.