PortfolioSection
apps/www/src/components/PortfolioSection.astro · 164 lines · group Misc
mgmt.tools caches portfolio images for 24h; a daily marker busts it
Used by
- pages.gitt.one / × 2
- pages.gitt.one /portfolio/ × 2
- codeexpert.se / × 2
- codeexpert.se /portfolio/ × 2
- posexpert.se / × 2
- posexpert.se /portfolio/ × 2
- posexpert.se / × 2history: commit d82a01f (2026-08-20)
- posexpert.se /portfolio/ × 2history: commit d82a01f (2026-08-20)
Live sites: pages.gitt.one, codeexpert.se, posexpert.se.
Samples 8
Our Portfolio
Elfster Anchovy
Developing Slack-application that facilitates the organisation of Secret Santa exchanges. Users can set a budget, create wishlists and anonymously communicate with "Secret Santa"
www.elfster.comProduktpoolen
Set of POS-solutions: POS-servers, fiscal data storage services, integrations, mobile cash-registers, terminals ect. More 40 customers and 3000 POS integrations. Java, ReactJS.
https://posexpert.se/Enterprise AI Through RAG
Intelligent business automation: RAG-powered document access, multilingual assistant, and code factory for legacy migration. Python/TS, FAISS, S3, CAMEL/MCP, CI/CD, Kubernetes.
MDX of this sample
<PortfolioSection
title="Our Portfolio"
showMoreText="Show more projects"
showMorePath="/portfolio/"
issuesId="9064,17880,21766"
/>Our Portfolio
Elfster Anchovy
Developing Slack-application that facilitates the organisation of Secret Santa exchanges. Users can set a budget, create wishlists and anonymously communicate with "Secret Santa"
www.elfster.comProduktpoolen
Set of POS-solutions: POS-servers, fiscal data storage services, integrations, mobile cash-registers, terminals ect. More 40 customers and 3000 POS integrations. Java, ReactJS.
https://posexpert.se/Enterprise AI Through RAG
Intelligent business automation: RAG-powered document access, multilingual assistant, and code factory for legacy migration. Python/TS, FAISS, S3, CAMEL/MCP, CI/CD, Kubernetes.
Pinpointer
The digital service for environmentally efficient waste management: it matches senders and recipients, keep documentation and trace lifecycle of a mass. ReactJS, React Native.
Goda Grannen
Mobile app for "good-neighbourliness", that allows house owner be confident for the house while he/she is away or find other help. Chat, message board, alarm-mode. ReactNative.
Watch nowBargarn
Mobile application used by insurance agents for time recordings when check-out insurance case. App was integrated with Fortnox. Written in ReactJS, engine in MeteorJS
https://www.bargarn.seGuldkortet
Discount mobile app that create a new way for businesses to reach out to new customers - users will get the offers and discounts that can be used over and over again. Written in VueJS.
VR Presenter
Program for creation and management of real time presentations in Virtual Reality. Suitable for education and remote presentations.
Founders.team
Development of Mobile app (iOS, Android) with 250+ screens. The app helps companies to hire new members using same approach like Tinder.
Visulate
The customer’s data analysis for submission in the requested form. Providing Data optimisation and creating dashboards in PowerBI.
Taxex
Services for business process optimisation and automation; human resource management. Landing design.
https://taxex.lite.network/TestCenter
Application for automated testing of integrated devices for professional testers, that solves a problem of test coverage of the code.
https://testcenter.one/Emotian
The app that gathers and analyses the emotions of people in real time and translates it to the map of the city. Big Data analysis.
SandBase
Online service that matches buyers (create request) with suppliers (price proposal) of any material (sand, asphalt crumbs etc.) ReactJS, NodeJS.
Frontliner
Algorithm that checks if the user tries to "google" the passing test. Integrated with online course platforms. Written in React and NodeJS.
WineLab
Mobile and wen-application for alcohol retailer - distributer of alcoholic and non-alcoholic beverages in all popular categories for one of the largest retailers.
Service-bot
The bot that used as first line of technical support, able to communicate with customers using the neural network. Implemented in various messengers. Written in Python.
Winsty
Mobile app for merchandising management, that keeps communication with manufacturer, uses technology of image recognition for product photo analysis. Written in React Native.
Spare parts optimiser
Algorithm for calculating the planned costs for purchasing airline consumables, based on historical data (12 years) by models Wilson and Halström. Written in Java.
Kalkylator
Application that calculates of the amount of required fertilisers, delivery costs etc. based on soil pH, delivery distance and commercial rules of business. Java.
app for internal useEDWS
System for internal use by ship’s fleet company to calculate the power consumption of ships to report to public authorities. Written in Java.
app for internal useHotelManager
Web panel for the administration of the hotel database for the subsequent sale of this database to companies that provide room reservation services. Java.
app for internal useGuidex
WebApp that provides workflow organisation services for tour guides. Calendars, filters of events, users can create own customer and the best guides database. Written in React, NodeJs.
mgmt.tools
Set of essential tools that IT companies can use for effective management: bookkeeping, project management, time reporting, bank processing etc. Written in Python.
https://mgmt.tools/api/Sallads Magasinet
UI/UX development of mobile application for online food store.
www.salladsmagasinet.se/VRDecor
Platform that unites furniture factories and allows buyers can observe all models of furniture and interior, as in real life, without leaving the dealer’s salon. Oculus GO, Android.
VRCalm
Application for VR glasses that immerses patient into realistic scenes to fight the symptoms of Alzheimer's disease. Content is managed by a doctor via admin panel. ExpressJS, AframeJS, ThreeJS.
Thinskin
Android-application that recognises face position on camera and displays human face skin thickness as a heat map, gathering data from Bluetooth device.
OakWallet
UX/UI design of mobile and web-application (iOS, Android) - online wallet that provides virtual IBAN and integrated with Mastercard for P2P transactions.
Nearsitter
Website to find a babysitter for a child or register as a nanny and look for parents, interested in babysitting, based on geolocation. Angular, Kotlin, Stripe.
Kidolab
Smartwatch app for children with autism, that displays schedule, activities. Admin for teachers and for parents. Developed in cooperation with Danish schools.
Bank of Eternity
Mobile app stores important information and memories. Allows relatives of the deceased get an access to all digital media after the user's death. Business analysis and UI design.
MDX of this sample
<PortfolioSection
title="Our Portfolio"
issuesId="9064,17880,21766,8835,8832,8836,8837,16666,8824,16665,8843,9063,8865,8818,16661,16657,17871,8839,16668,8813,16662,8810,8809,9907,8840,16660,8817,8815,8829,8828,8819,8827,8826,8825,8823"
sourceChangedTitle={{ '8832': 'Watch now ' }}
page={true}
/>Our Portfolio
codeexpert.se
Corporate website of Scandinavian Code Expert AB — a Swedish software development company.
codeexpert.seitgrows.today
Product website of IT Grows — AI chatbots and business automation — with a bilingual blog.
https://itgrows.today/en/posexpert.se
Landing page of POS Expert — custom software for POS terminals and payment processing.
https://posexpert.se/MDX of this sample
<PortfolioSection
title="Our Portfolio"
showMoreText="Show more projects"
showMorePath="/portfolio/"
issuesId="20256,20264,20259"
/>Our Portfolio
codeexpert.se
Corporate website of Scandinavian Code Expert AB — a Swedish software development company.
codeexpert.seitgrows.today
Product website of IT Grows — AI chatbots and business automation — with a bilingual blog.
https://itgrows.today/en/posexpert.se
Landing page of POS Expert — custom software for POS terminals and payment processing.
https://posexpert.se/skattedosan.se
Product website of Skattedosan — a Swedish fiscal control unit by Axena.
https://skattedosan.se/posplus.se
Landing page of POSplus — a point-of-sale product for the Swedish market.
https://posplus.se/gitt.one
Landing page of gitt.one — private GitLab hosting; the ecosystem Gitt One Pages itself is built on.
https://landing.gitt.one/redmine.pro
Landing page of redmine.pro — a managed Redmine service for project management.
https://landing.redmine.pro/srv4pos.com
Website of srv4pos — the Swedish fiscal Cloud Control Unit and POS platform.
https://new-version.srv4pos.com/astilabor.lite.network
Website of Astilabor — personal AI development for business, built for Superb.
https://astilabor.lite.network/MDX of this sample
<PortfolioSection
title="Our Portfolio"
issuesId="20256,20264,20259,20260,20261,20258,20262,20263,20257"
page={true}
/>Our Portfolio
Wally-Wallet
Developed web-application to create company wallet using API. Float accounts, functionality to make instant p2p payments within the wallet.
https://wally-wallet.com/SRV4POS
Developed Web-service 24/7/365, that keeps data of POS terminals and cash transactions. Top receiver of fiscal data in Sweden. More than 40 customers and 3000 POS integrations.
https://srv4pos.com/POS4mobile
Cash register app on Android for mobile devices. Ability to specify goods and groups, customize user interface, connect cheque printers, print X and Z reports, etc. Free for use.
https://play.google.com/store/apps/details?id=com.pos4mobile&hl=ru&gl=USMDX of this sample
<PortfolioSection
title="Our Portfolio"
showMoreText="Show more projects"
showMorePath="/portfolio/"
issuesId="9048,9046,9045"
/>Our Portfolio
Wally-Wallet
Developed web-application to create company wallet using API. Float accounts, functionality to make instant p2p payments within the wallet.
https://wally-wallet.com/SRV4POS
Developed Web-service 24/7/365, that keeps data of POS terminals and cash transactions. Top receiver of fiscal data in Sweden. More than 40 customers and 3000 POS integrations.
https://srv4pos.com/POS4mobile
Cash register app on Android for mobile devices. Ability to specify goods and groups, customize user interface, connect cheque printers, print X and Z reports, etc. Free for use.
Download nowSKV2021
Realization and certification of the new version of the Swedish Tax Agency's Regulation of the fiscal data storage to replace hardware Control Unit by special software.
Open RegulationLibcastle
Developed a library for a cash register app installed in on smartphone to connect to the Interpay V3 payment terminal to proceed a payment.
Cashbow
Development of an application for an OS Android tablet, used as a payment terminal for ATM-devices. Replicates user experience of ATMs.
Oakwallet
Web and Mobile Application development (iOS, Android), UI/UX design for MasterCard® integrated mobile wallet
oakwallet.comE-wallet
Mobile e-wallet Android app, allows to deposit funds to the account from credit cards, transfer funds between wallet owners, deposit/withdraw cash through special ATMs, cash out to popular payment systems
Interpay
Development of the system that automates the process of providing EMV payment terminals to clients via integration of bank, terminal supplier and payment system
MDX of this sample
<PortfolioSection
title="Our Portfolio"
issuesId="9048,9046,9045,8833,8806,17889,18111,17890,17888"
sourceChangedTitle={{ 9045: 'Download now', 8833: 'Open Regulation' }}
page={true}
/>Our Portfolio
Wally-Wallet
Developed web-application to create company wallet using API. Float accounts, functionality to make instant p2p payments within the wallet.
https://wally-wallet.com/SRV4POS
Developed Web-service 24/7/365, that keeps data of POS terminals and cash transactions. Top receiver of fiscal data in Sweden. More than 40 customers and 3000 POS integrations.
https://srv4pos.com/POS4mobile
Cash register app on Android for mobile devices. Ability to specify goods and groups, customize user interface, connect cheque printers, print X and Z reports, etc. Free for use.
https://play.google.com/store/apps/details?id=com.pos4mobile&hl=ru&gl=USMDX of this sample
<PortfolioSection
title="Our Portfolio"
showMoreText="Show more projects"
showMorePath="/portfolio/"
issuesId="9048,9046,9045"
/>Our Portfolio
Wally-Wallet
Developed web-application to create company wallet using API. Float accounts, functionality to make instant p2p payments within the wallet.
https://wally-wallet.com/SRV4POS
Developed Web-service 24/7/365, that keeps data of POS terminals and cash transactions. Top receiver of fiscal data in Sweden. More than 40 customers and 3000 POS integrations.
https://srv4pos.com/POS4mobile
Cash register app on Android for mobile devices. Ability to specify goods and groups, customize user interface, connect cheque printers, print X and Z reports, etc. Free for use.
https://play.google.com/store/apps/details?id=com.pos4mobile&hl=ru&gl=USSKV2021
Realization and certification of the new version of the Swedish Tax Agency's Regulation of the fiscal data storage to replace hardware Control Unit by special software.
https://skatteverket.se/servicelankar/otherlanguages/inenglishengelska/businessesandemployers/startingandrunningaswedishbusiness/cashregisters/formanufacturersandsuppliers.4.b1014b415f3321c0de2166.htmlLibcastle
Developed a library for a cash register app installed in on smartphone to connect to the Interpay V3 payment terminal to proceed a payment.
Cashbow
Development of an application for an OS Android tablet, used as a payment terminal for ATM-devices. Replicates user experience of ATMs.
Oakwallet
Web and Mobile Application development (iOS, Android), UI/UX design for MasterCard® integrated mobile wallet
oakwallet.comE-wallet
Mobile e-wallet Android app, allows to deposit funds to the account from credit cards, transfer funds between wallet owners, deposit/withdraw cash through special ATMs, cash out to popular payment systems
Interpay
Development of the system that automates the process of providing EMV payment terminals to clients via integration of bank, terminal supplier and payment system
MDX of this sample
<PortfolioSection
title="Our Portfolio"
issuesId="9048,9046,9045,8833,8806,17889,18111,17890,17888"
page={true}
/>Props
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| title | string | yes | ||
| description | string | |||
| issuesId | string | yes | Comma-separated Redmine issue ids, e.g. "101, 102, 103" | |
| sourceChangedTitle | Record<string, string> | Per-project override of the source link text, keyed by issue id | ||
| showMoreText | string | |||
| showMorePath | string | '/portfolio/' | ||
| page | boolean | false | Full-page variant (light, big h1) vs dark strip variant |
Source apps/www/src/components/PortfolioSection.astro @ gitt.one
---
import ChevronRight from 'astro-heroicons/outline/ChevronRight.astro';
import pagesConfig from '../../pages.config.js';
interface Props {
title: string;
description?: string;
/** Comma-separated Redmine issue ids, e.g. "101, 102, 103" */
issuesId: string;
/** Per-project override of the source link text, keyed by issue id */
sourceChangedTitle?: Record<string, string>;
showMoreText?: string;
showMorePath?: string;
/** Full-page variant (light, big h1) vs dark strip variant */
page?: boolean;
}
interface Project {
id: number;
image: string;
title: string;
description: string;
source?: string;
sourceTitle?: string;
}
const {
title,
description,
issuesId,
sourceChangedTitle,
showMoreText,
showMorePath = '/portfolio/',
page = false,
} = Astro.props;
const { portfolioUrl, portfolioBearer } = pagesConfig as {
portfolioUrl?: string;
portfolioBearer?: string;
};
// mgmt.tools caches portfolio images for 24h; a daily marker busts it
const buildDate = new Date().toISOString().slice(0, 10);
let projects: Project[] | null = null;
if (!portfolioUrl) {
console.warn('PortfolioSection: pagesConfig.portfolioUrl is not set, rendering nothing');
} else {
try {
const ids = issuesId.replace(/\s/g, '');
const resp = await fetch(portfolioUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${portfolioBearer}`,
},
body: JSON.stringify({ issues: ids }),
});
if (!resp.ok) throw new Error(`${resp.status} ${resp.statusText}`);
const data: Project[] = await resp.json();
const byId = new Map(data.map((p) => [String(p.id), p]));
projects = [];
for (const id of ids.split(',')) {
const project = byId.get(id);
if (!project) continue;
const override = sourceChangedTitle?.[String(project.id)];
if (override) project.sourceTitle = override;
projects.push(project);
}
} catch (e) {
console.warn(`PortfolioSection: portfolio fetch failed (${e}), rendering nothing`);
projects = null;
}
}
const withVersion = (url: string) => `${url}?v=${buildDate}`;
---
{
projects && (
<div class="bg-white">
<div class:list={['mx-auto', !page && 'bg-stone-800 py-12 px-4 sm:px-6 lg:px-8']}>
<div class:list={['space-y-12 mx-auto', !page && 'max-w-7xl']}>
{page ? (
<div class="pb-16 pt-12 bg-stone-800 sm:pb-20 sm:pt-16">
<div class="max-w-md mx-auto px-4 sm:max-w-lg sm:px-6 lg:max-w-7xl lg:px-8">
<h1 class="text-4xl leading-10 font-extrabold tracking-tight text-white text-center sm:text-5xl sm:leading-none lg:text-6xl">
{title}
</h1>
{description && (
<p class="mt-6 max-w-3xl mx-auto text-xl leading-normal text-white/80 text-center">
{description}
</p>
)}
</div>
</div>
) : (
<div class="max-w-7xl mx-auto space-y-5 sm:space-y-4">
<h2 class="text-3xl text-white font-extrabold tracking-tight sm:text-4xl">
{title}
</h2>
</div>
)}
<div
class:list={[
'max-w-7xl mx-auto space-y-12 sm:grid sm:grid-cols-2 sm:gap-x-6 sm:gap-y-12 sm:space-y-0 lg:grid-cols-3 lg:gap-x-8',
page && 'pb-12 px-4',
]}
>
{projects.map((item) => (
<div class="bg-white flex flex-col rounded-lg shadow-lg overflow-hidden">
<div class="flex-shrink-0 lg:min-h-[4rem] lg:flex items-center justify-center">
<img
src={withVersion(item.image)}
loading="lazy"
width="600"
height="320"
class="max-h-80 sm:h-auto w-full object-cover"
alt={item.title}
/>
</div>
<div class="flex-1 bg-white flex flex-col justify-between p-4">
<div class="flex-1">
<div class="block mt-2">
<p class="text-xl font-semibold text-stone-900">{item.title}</p>
<p class="mt-3 text-base text-stone-500">{item.description}</p>
{item.source && (
<a
href={
item.source.includes('https://')
? item.source
: `https://${item.source}`
}
class="inline-block mt-3 text-base text-primary-700 hover:text-primary-800"
>
{item.sourceTitle || item.source}
</a>
)}
</div>
</div>
</div>
</div>
))}
</div>
{showMoreText && (
<div class="text-center">
<a
href={showMorePath}
class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary-700 hover:bg-primary-800 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-700"
>
{showMoreText}{' '}
<ChevronRight class="flex-shrink-0 w-6 h-6 text-primary-200" aria-hidden="true" />
</a>
</div>
)}
</div>
</div>
</div>
)
}Source links point to engine-astro@e857a859. Samples are cut from the sites' own content by scripts/gallery-extract.mjs; nothing is merged or removed yet.