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

Live sites: pages.gitt.one, codeexpert.se, posexpert.se.

Samples 8

codeexpert.se/

Our Portfolio

Elfster Anchovy

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.com
Produktpoolen

Produktpoolen

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

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"
/>
codeexpert.se/portfolio/

Our Portfolio

Elfster Anchovy

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.com
Produktpoolen

Produktpoolen

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

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

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

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 now
Bargarn

Bargarn

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.se
Guldkortet

Guldkortet

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

VR Presenter

Program for creation and management of real time presentations in Virtual Reality. Suitable for education and remote presentations.

Founders.team

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

Visulate

The customer’s data analysis for submission in the requested form. Providing Data optimisation and creating dashboards in PowerBI.

Taxex

Taxex

Services for business process optimisation and automation; human resource management. Landing design.

https://taxex.lite.network/
TestCenter

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

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

SandBase

Online service that matches buyers (create request) with suppliers (price proposal) of any material (sand, asphalt crumbs etc.) ReactJS, NodeJS.

Frontliner

Frontliner

Algorithm that checks if the user tries to "google" the passing test. Integrated with online course platforms. Written in React and NodeJS.

WineLab

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

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

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

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

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 use
EDWS

EDWS

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 use
HotelManager

HotelManager

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 use
Guidex

Guidex

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

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

Sallads Magasinet

UI/UX development of mobile application for online food store.

www.salladsmagasinet.se/
VRDecor

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

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

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

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

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

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

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}
/>
pages.gitt.one/

Our Portfolio

codeexpert.se

codeexpert.se

Corporate website of Scandinavian Code Expert AB — a Swedish software development company.

codeexpert.se
itgrows.today

itgrows.today

Product website of IT Grows — AI chatbots and business automation — with a bilingual blog.

https://itgrows.today/en/
posexpert.se

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"
/>
pages.gitt.one/portfolio/

Our Portfolio

codeexpert.se

codeexpert.se

Corporate website of Scandinavian Code Expert AB — a Swedish software development company.

codeexpert.se
itgrows.today

itgrows.today

Product website of IT Grows — AI chatbots and business automation — with a bilingual blog.

https://itgrows.today/en/
posexpert.se

posexpert.se

Landing page of POS Expert — custom software for POS terminals and payment processing.

https://posexpert.se/
skattedosan.se

skattedosan.se

Product website of Skattedosan — a Swedish fiscal control unit by Axena.

https://skattedosan.se/
posplus.se

posplus.se

Landing page of POSplus — a point-of-sale product for the Swedish market.

https://posplus.se/
gitt.one

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

redmine.pro

Landing page of redmine.pro — a managed Redmine service for project management.

https://landing.redmine.pro/
srv4pos.com

srv4pos.com

Website of srv4pos — the Swedish fiscal Cloud Control Unit and POS platform.

https://new-version.srv4pos.com/
astilabor.lite.network

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}
/>
posexpert.se/

Our Portfolio

Wally-Wallet

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

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

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=US
MDX of this sample
<PortfolioSection
  title="Our Portfolio"
  showMoreText="Show more projects"
  showMorePath="/portfolio/"
  issuesId="9048,9046,9045"
/>
posexpert.se/portfolio/

Our Portfolio

Wally-Wallet

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

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

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 now
SKV2021

SKV2021

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 Regulation
Libcastle

Libcastle

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

Cashbow

Development of an application for an OS Android tablet, used as a payment terminal for ATM-devices. Replicates user experience of ATMs.

Oakwallet

Oakwallet

Web and Mobile Application development (iOS, Android), UI/UX design for MasterCard® integrated mobile wallet

oakwallet.com
E-wallet

E-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

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}
/>
posexpert.se/history: commit d82a01f (2026-08-20)

Our Portfolio

Wally-Wallet

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

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

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=US
MDX of this sample
<PortfolioSection
  title="Our Portfolio"
  showMoreText="Show more projects"
  showMorePath="/portfolio/"
  issuesId="9048,9046,9045"
/>
posexpert.se/portfolio/history: commit d82a01f (2026-08-20)

Our Portfolio

Wally-Wallet

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

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

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=US
SKV2021

SKV2021

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.html
Libcastle

Libcastle

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

Cashbow

Development of an application for an OS Android tablet, used as a payment terminal for ATM-devices. Replicates user experience of ATMs.

Oakwallet

Oakwallet

Web and Mobile Application development (iOS, Android), UI/UX design for MasterCard® integrated mobile wallet

oakwallet.com
E-wallet

E-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

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

NameTypeRequiredDefaultDescription
titlestringyes
descriptionstring
issuesIdstringyesComma-separated Redmine issue ids, e.g. "101, 102, 103"
sourceChangedTitleRecord<string, string>Per-project override of the source link text, keyed by issue id
showMoreTextstring
showMorePathstring'/portfolio/'
pagebooleanfalseFull-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.