Creating Together a Useful and Sustainable Digital World

Moving forward together. This is the same project that we have been proposing to our customers and employees for over 40 years.
A partnership that helps everybody achieve their goals, working together towards a shared success, at the service of our users  

Our News

All our news
  • An error occurred while processing the template.
    The following has evaluated to null or missing:
    ==> image.getAttribute("alt")  [in template "20100#20127#NEWS_THUMBNAIL" at line 15, column 50]
    
    ----
    Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
    ----
    
    ----
    FTL stack trace ("~" means nesting-related):
    	- Failed at: ${image.getAttribute("alt")}  [in template "20100#20127#NEWS_THUMBNAIL" at line 15, column 48]
    ----
    1<#setting locale = locale /> 
    2<#assign liferayUtils = serviceLocator.findService("com.sully.liferay.utils.LiferayUtils")/> 
    3<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")/> 
    4<#assign journalArticleResourceLocalServiceUtil = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")> 
    5 
    6<#assign journalArticleId = .vars['reserved-article-id'].data> 
    7<#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/> 
    8<#assign articleEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", articleResourcePK) /> 
    9<#assign typesActualite = liferayUtils.getEntryCategoriesForVocabulary(articleEntry,"type d'actualite") /> 
    10 
    11<#compress> 
    12    <a href="${friendlyURL}" class="tw-flex tw-gap-6 tw-overflow-hidden tw-group tw-flex-col" > 
    13 
    14        <div class="tw-aspect-[16/9] tw-w-full tw-overflow-hidden"> 
    15            <img src="${image.getData()}" alt="${image.getAttribute("alt")}" 
    16                 class="tw-w-full tw-object-cover group-hover:tw-scale-[1.04] tw-transition-all tw-duration-300"/> 
    17        </div> 
    18 
    19        <div class="tw-flex-1 tw-flex tw-flex-col"> 
    20            <h3 class="tw-line-clamp-3 group-hover:tw-underline tw-mb-0">${title.getData()}</h3> 
    21            <div class="tw-flex tw-items-center tw-gap-2 tw-order-first"> 
    22                <#if typesActualite?hasContent> 
    23                    <#list typesActualite as typeActualite> 
    24                        <#assign color = liferayUtils.getCategoryProperty(typeActualite.categoryId,"color") /> 
    25                        <div class="tw-text-xs tw-uppercase tw-font-semibold tw-px-2 tw-py-1 tw-rounded-md 
    26                            tw-bg-sully-${color} tw-text-sully-${color}Dark"> 
    27                            ${typeActualite.getTitle(locale)} 
    28                        </div> 
    29                    </#list> 
    30                </#if> 
    31                <#assign date_Data = getterUtil.getString(date.getData())> 
    32                <#if validator.isNotNull(date_Data)> 
    33                    <#assign date_DateObj = dateUtil.parseDate("yyyy-MM-dd", date_Data, locale)> 
    34                    <p class="tw-text-sm tw-my-0"> ${dateUtil.getDate(date_DateObj, "dd MMM yyyy", locale)}</p> 
    35                </#if> 
    36            </div> 
    37        </div> 
    38    </a> 
    39</#compress> 
  • CANUT, a program that has proven its worth

    Achievements

    15 Jun 2026

  • Sully at Mistral’s AI Now Summit: Balancing Sovereignty and Specialization

    Tech

    04 Jun 2026

  • Eurométropole de Strasbourg website factory: a successful partnership between Liferay and Sully Group

    Achievements

    25 Feb 2026

  • 800+

    Employees

  • 83 M€

    of turnover in 2025

  • 46

    years of experience

  • 10

    OFFICES

Working at Sully...

DISCOVER OUR CAREER SPACE
…is to work towards one goal – together – striving for every individual’s personal growth. Is being entrusted with responsibilities with an emphasis on agility, accountability, and open communication. Is to have the chance of progressing in the direction of your choosing, supported by a closely-knit management and sustainable outlooks.
What our teammates have to say

"Join a local agency"

Maxime Java developer for technical support in Nantes

See all the testimonials

Our job offers

Our Vision

People are at the heart of what we do:
we work for the satisfaction of our clients, our employees and our users.