Saturday, April 25, 2026
2cd9244d-0f9d-4669-a6f8-e471bf8cf475
| Summary | ⛅️ Mostly cloudy until evening. |
|---|---|
| Temperature Range | 15°C to 24°C (60°F to 75°F) |
| Feels Like | Low: 58°F | High: 83°F |
| Humidity | 71% |
| Wind | 8 km/h (5 mph), Direction: 165° |
| Precipitation | Probability: 32%, Type: No precipitation expected |
| Sunrise / Sunset | 🌅 06:04 AM / 🌇 07:27 PM |
| Moon Phase | Waxing Gibbous (30%) |
| Cloud Cover | 67% |
| Pressure | 1012.12 hPa |
| Dew Point | 56.78°F |
| Visibility | 5.9 miles |
Restoration work has begun on the roof of the Apostolos Varnavas church in the Famagusta district village of Engomi, technical committee on cultural heritage co-chairman Sotos Ktoris said on Friday.
He added that he hopes that work to restore the church’s iconostasis, a tiered screen towards the front of the church which is decorated with icons of important figures to Christianity, as well as frescoes on its walls, will begin in the near future.
Work on the church’s roof is being funded by the European Union and implemented under the technical supervision of the United Nations development programme.
The Apostolos Varnavas church was built at the end of the fifth century by the then archbishop Anthemius of Cyprus, under the sponsorship of Emperor Zeno of the Eastern Roman Empire, who had proclaimed the autonomy of the Church of Cyprus in 488.
Local Christian tradition states that Saint Barnabas appeared three times in Anthemius’ sleep, and that he chose for this reason to dedicate a church to the saint, who lived and died in Salamis four centuries prior.
According to Church tradition, Barnabas became a Christian martyr when he was stoned to death by Jewish people, though the Acts of Barnabus, a text apparently compiled by his companion John Mark, write that he was bound with a rope by the neck, and dragged to the site where he was burned to death.
The church was most recently renovated in the 18th century and was the site of pilgrimage until 1974.
Engomi had been a predominantly Greek Cypriot village up to that point, with its Greek Cypriot population being displaced thereafter.
The village is now inhabited by Turkish Cypriots who were displaced from Larnaca, as well as Turkish nationals originating from the Adana and Trabzon provinces.
The compensation for animals culled amid the ongoing measures to combat the foot and mouth disease are set to ‘significantly increase’ following a meeting at the agriculture ministry, agricultural organisations said on Friday.
“Today’s meeting was hopeful, it seems that we are going to help our people and what we want to emphasize is that only with such meetings, serious, responsible ones, can we address the problem,” said agricultural union president Michalis Lytras.
Following Friday’s forth meting of the committee under the minister of agriculture, Lytras said they had made significant progress and were awaiting the final approval of the special technical committee to proceed with the compensation.
“We have raised the prices significantly [from the previous prices they had submitted to ministry],” he said.
Lytras said that the next stage in the negotiations will be the replacement and reactivation of livestock units in another committee.
“We don’t want to stop just with compensation. We want the livestock farming profession to become active again and various meetings will be held on how to help these people become active again,” he said.
Agricultural association president Kyriakos Kailas, on his part, emphasised that although the risk of infection is currently lower due to higher vaccination rates among the animals, the problem has not yet been overcome.
“Foot-and-mouth disease will stay with us for a few years until we get rid of it,” he said.
He stressed that vaccinations were needed at regular intervals to ensure that the animals had enough antibodies and were not contagious or infected by the virus.
Kailas noted that livestock farming is a significant sector, with 25 per cent of the workforce in the country employed in this industry, underscoring the government’s responsibility to safeguard this sector.
“The bottom line is that the government and the President of the Republic himself and the minister of agriculture want to help the people whom we saw yesterday protesting rightfully, despite the fact that gatherings are something that is prohibited and we all know that the virus is transmitted more easily through these gatherings and we must avoid them,” he said.
EU leaders meeting in Cyprus called for stronger European defence cooperation, faster energy independence and closer engagement with the Middle East, as instability in the region continues to affect Europe’s security and economy.
Speaking after the informal meeting of EU heads of state and government, European Council President Antonio Costa said Cyprus’ hosting of the summit carried “important symbolism”, demonstrating the EU’s support for member states most affected by conflicts in the Middle East.
“Cyprus is a vital anchor of cooperation and European engagement in the region,” he said.
Costa said the EU was not part of the conflict, but would be “part of the solution” through support for diplomacy, de-escalation and freedom of navigation. He said recent ceasefires were welcome, but warned that all sides must now engage in good faith.
President Nikos Christodoulides said the summit marked a historic moment for Cyprus, as it was the first time the island had hosted an informal meeting of EU leaders.
He said Cyprus’ experience of occupation reinforced its belief in “more European integration and a more strategically autonomous union”.
Christodoulides said discussions focused on Ukraine, the Middle East, energy prices, the EU’s next long-term budget and the need to make the mutual defence clause, Article 42.7, operational in practice.
“When the sovereignty of one member state is threatened, the response is not a question of if, but how fast,” he said.
He added that the EU must move beyond ad hoc arrangements and create a clear manual for how Article 42.7 should work.
European Commission President Ursula von der Leyen said the war’s impact on Europe’s energy costs was already visible, noting that since the start of the conflict the EU’s fossil fuel import bill had increased by more than €25 billion. She said Europe must reduce its dependence on imported fossil fuels and accelerate the use of homegrown clean energy, including renewables and nuclear power.
Von der Leyen also said the Commission would present an electrification action plan by the summer, as part of efforts to strengthen Europe’s energy security and independence.
Importantly the leaders also signed the “One Europe, One Market” roadmap, aimed at completing the single market by the end of 2027. Von der Leyen said it would focus on simplifying rules, removing barriers to cross-border business, strengthening trade, lowering energy prices and accelerating digital and AI transformation.
On the EU budget, leaders said new “own resources” would be needed to fund Europe’s priorities, including competitiveness, defence, security, energy and repayment of NextGenerationEU borrowing.
Electric vehicle charging points across Nicosia will be out of service for one week as part of an upgrade linked to a new management agreement.
According to the municipality, all public charging stations will be temporarily unavailable from next Monday to May 3 to facilitate system improvements under a newly signed agreement with Petrolina.
The contract, signed on Thursday by mayor Charalambos Prountzos and Petrolina director Petros Fiakkas, intends to modernise infrastructure supporting electric vehicles in the capital.
Municipal authorities said the temporary shutdown is necessary to implement technical upgrades and prepare the network for a revised pricing structure.
Charging services will continue to be accessed through the pcharge application, which the municipality confirmed will remain as is once operations resume.
The upgrade also includes four additional electric vehicle chargers scheduled for installation.
Cyprus and Egypt have signed a joint declaration on a strategic partnership, marking a significant political upgrade in relations between the two countries on the sidelines of the Informal EU Council summit in Nicosia on Friday.
The declaration places the already close relationship on a more structured and institutional footing, strengthening cooperation in areas including energy, security, defence, trade, investment, technology, education and regional stability.
For Cyprus, the agreement carries particular geopolitical weight at a time of heightened instability in the Eastern Mediterranean and the Middle East. It also underlines Nicosia’s effort to build deeper ties with key regional partners through a consistent and targeted foreign policy.
President Nikos Christodoulides has invested heavily in strengthening relations with Egypt, as well as with other countries in the wider region. The Cyprus-Egypt relationship has developed through regular high-level contacts, political trust and practical cooperation.
A central part of the partnership remains energy as Cyprus and Egypt have already signed important agreements on the development of Cypriot natural gas fields, including Kronos and Aphrodite, with the latest declaration placing that cooperation within a broader framework of energy security, diversification and links between the Eastern Mediterranean and Europe.
The declaration also strengthens political coordination between the two governments, particularly on regional and international issues. Both countries see themselves as actors of stability in a region facing complex and interconnected challenges.
Economic cooperation is another key pillar, with the upgraded partnership expected to create better conditions for trade, investment, infrastructure projects and business ties.
The agreement also expands cooperation beyond traditional areas, covering technology, education, the environment, connectivity and people-to-people contacts.
President Nikos Christodoulides during a press conference at the Informal EU Heads of State summit in Nicosia on Friday, urged restraint and diplomacy amid escalating tensions in the Middle East, warning that instability in the region directly impacts Europe’s security and economy.
“We are experiencing in real time how quickly instability can transcend borders, threatening civilians, disrupting our economies and exposing critical infrastructure to risk,” he said.
He stressed that “restraint must prevail over escalation”, adding that diplomacy and dialogue remain the only viable path to restoring stability.
Christodoulides underlined that the European Union is actively engaged in the region, working closely with partners to promote stability, security and prosperity, a key priority of Cyprus’ EU Council presidency.
He expressed solidarity with countries in the Gulf and Jordan, while commending Egypt for its mediation efforts towards a ceasefire.
“The Gulf countries have proven yet again that they are reliable partners to Europe,” he said, adding that “their security is also Europe’s security”.
The president also reiterated support for Lebanon, praising the leadership of President Joseph Aoun and stressing the importance of engagement between Lebanon and Israel, as well as the need for an inclusive recovery process.
He said discussions with regional partners showed a “shared understanding of risks and a shared willingness to act”, with agreement on strengthening cooperation in specific areas.
“It is absolutely clear that the security and stability of this region is interlinked with that of Europe,” he said, describing the Middle East as a “vital neighbourhood” for the EU.
Christodoulides also pointed to the importance of the European Commission’s Mediterranean pact, calling it the most serious effort in two decades to reset relations with the southern neighbourhood.
“The pact is operational and delivers results,” he said, adding that focus will now shift to implementation.
He expressed hope that the meeting would mark the start of more consistent and results-driven dialogue between the EU and its partners, with Cyprus positioning itself as a bridge between Europe and the wider region.
“Crises and challenges can pave the way for opportunities,” he said.
Women facing domestic violence or other forms of abuse can now access the new ‘Pharos’ website, which provides support and information, the Mediterranean Institute for Gender Studies announced.
“The platform was created to fill a significant gap and strengthen the right of women experiencing violence to access information,” the institute said.
It stressed that access to reliable information is particularly important in situations of vulnerability, noting that it often remains difficult for those affected.
Through the platform, users can learn more about their legal rights and justice procedures, as well as access information on relevant authorities, referral mechanisms, and both state and non-state support services.
The platform was developed following an evaluation process involving women who have experienced violence, people from their immediate environment, and frontline professionals. Their feedback was incorporated into the final version.
The leaders of the European Union’s 27 member states on Friday resolved to demand the creation of a defence “playbook” at the day’s European Council summit in Nicosia, though Cypriot government sources lamented that “nothing has been done” in the decade since the first and only time that the bloc’s mutual defence clause has been activated.
It was France which triggered Article 42.7 of the Treaty of the European Union, better known as the Lisbon Treaty, after Paris was hit by a series of terrorist attacks in November 2015.
While the text of the treaty states that “if a member state is the victim of armed aggression on its territory, the other member states shall have towards it an obligation of aid and assistance by all the means in their power”, it is not attached to any formal operational plans or international military structures.
Other EU member states did step in to contribute to international military missions in 2015, allowing France to redeploy its own troops domestically, though the European external action service (EEAS) nonetheless released a “lessons learned” paper in 2022 with the aim of shoring up and formalising the EU’s mutual defence infrastructure.
However, government sources told the Cyprus Mail that despite that paper being produced, “nothing has been done” to advance the matter.
The sources lamented that at present, “there is no clear picture of procedures, capabilities, or response times across member states”, as well as what they described as a lack of clarity regarding the types of support which can be requested, what each member state may provide, and how quickly assistance can be delivered.
Additionally, they highlighted potential pitfalls regarding a lack of coordination at present, given that EU institutions have no given role following the clause’s triggering, unless the state which triggers it specifically requests it.
They also stressed that if a member state triggers Article 42.7, assistance must not be optional.
“It is a legal obligation, not a political choice,” they said, before adding that “member states cannot question the reasons” behind the triggering of the clause if it is triggered, provided that an armed attack has taken place.
Earlier, President Nikos Christodoulides had confirmed that leaders of the bloc’s member states had struck an agreement with the European Commission at the summit in Ayia Napa on Thursday night for the commission to “prepare a blueprint on how we respond in case a member state triggers Article 42.7”.
The debate comes as cracks appear in Nato, with the transatlantic military alliance’s Article Five having formed the bedrock of mutual European defence for more than half a century.
Exactly 24 of the EU’s 27 member states – all except Austria, Cyprus, and Ireland – are also Nato members, but the ironclad nature of the pact has been called into question in recent months, with the United States appearing at odds with Europe over Iran and Greenland, among other international affairs.
After US President Donald Trump met Nato Secretary-General Mark Rutte last month, he wrote in a post on social media that “Nato wasn’t there when we needed them, and they won’t be there if we need them again”. Rutte, meanwhile, only went as far as describing the meeting as “very frank” during an appearance on CNN.
Earlier in the year, relations between the US and Europe had soured after Trump demanded that sovereignty over Greenland, held solely by Denmark since the Treaty of Kiel of 1812, be handed over to the US, though he did back down on that front.
Most recently, arrivals at Friday’s summit were overshadowed after Reuters published content from an email warning of punishment for Nato member states which failed to provide what the US considered to be adequate support for the war in Iran.
The email suggested suspending Spain from the alliance, after the Spanish government had refused to allow American warplanes to overfly its airspace to carry out bombing raids on Iran launched from the Fairford airbase in the United Kingdom.
Additionally, it called for a reduction of “the sense of entitlement on the part of the Europeans”.
In response, a Nato official told the Anadolu Agency that “Nato’s founding treaty does not foresee any provision for suspension of membership or expulsion”.
Spanish Prime Minister Pedro Sanchez was asked about the email upon his arrival in Nicosia on Friday and said simply that he has “no worries”, before adding, “we are fulfilling our obligations toward Nato”.
“The Spanish government’s position is clear: absolute cooperation with our allies, but always within the framework of international law,” he added.
Italian Prime Minister Giorgia Meloni, too, was distinctly unimpressed with the situation upon her arrival in Nicosia.
“I do not see tensions over Nato as positive … I believe we need to work to strengthen Nato, to strengthen the European pillar of the alliance,” she said.
Turkish Cypriot leader Tufan Erhurman on Friday promised that he had “initiated the necessary steps” to resolve the matter of Cypriot art professor Senih Cavusoglu being refused entry to Turkey.
“I learned last night that Senih Cavusoglu was unable to enter Turkey and was experiencing difficulties. Following a conversation with him, I initiated the necessary steps,” he wrote in a post on social media.
He added that “the relationship between the Republic of Turkey and Turkish Cypriots is extremely special and important”, and that as such, “many of our citizens who have faced entry bans in Turkey completed their higher education there and have friendships and memories there”.
“These people have the right to receive information from us, the administrators of the Turkish Republic of Northern Cyprus, regarding the procedures to which they are subject and the reasons for them, and to request the correction of any errors or inaccuracies in those procedures,” he said.
He said he was “saddened by the difficulties Senih Cavusoglu is experiencing” but added that “I am also aware that my duty as president is not merely to be saddened”.
“It is public knowledge that since I took office, I have raised this issue in all my meetings with the Republic of Turkey’s relevant authorities. This includes my most recent meeting. Our efforts to resolve the uncertainties and the problems in this matter will continue,” he said.
Cavusoglu reported on Thursday evening that he had been turned back from Antalya airport, having appeared on Turkey’s “N-82” list.
At present, it is believed that around 15 Turkish Cypriots are on one of Turkey’s N-82 and G-82 lists. Having one’s name on the former means that one must apply in advance to the Turkish embassy in their country for pre-clearance to enter the country, while being on the G-82 list entails an outright ban from entering Turkey.
Neither list is publicly available, and as such, those on it generally do not find out until they arrive in Turkey.
The N-82 designation is listed by the Turkish government as “juristic preference” – in short, that Turkey has decided to exempt the individual from the unabridged right of entry. The G-82 designation is reserved for individuals deemed by the Turkish government to have “acted against national security”.
Earlier on Friday, former Turkish Cypriot leader Mustafa Akinci had moved to defend Cavusoglu, saying that the professor, “besides being an artist, is a decent human being”.
“He is clean and moral. He has a style which explains his thoughts with humour, and he is a valuable asset to us,” he said.
He then criticised the Turkish authorities for refusing him entry, saying that “the mentality which continues to treat our citizens who express their opinions using freedom of expression as terrorists at airports will surely find its place in the dustbin of history”.
Cooperation between Cyprus and the United States in energy, trade and investment is increasingly becoming a strategic necessity for regional stability and transatlantic energy security, Energy Minister Michael Damianos said on Friday.
Speaking at an event organised by the American Chamber of Commerce (AmCham) in Cyprus, the minister said the country’s natural gas prospects, alongside the participation of major US companies, are creating opportunities for economic growth, energy diversification and regional stability.
He highlighted the commercial exploitation of the Aphrodite field in Block 12, which is expected to involve a floating production unit in Cyprus’ exclusive economic zone (EEZ) and exports via an undersea pipeline to Egypt.
This, he said, underlines the geopolitical and economic importance of cooperation with the US.
Production from the Aphrodite field is expected to begin in early 2030, following a final investment decision.
Damianos also pointed to the presence of ExxonMobil in Cyprus’ EEZ as a key pillar of this strategic partnership, following the discovery of gas deposits in the Glaucus and Pegasus fields, which were declared commercially viable on March 30.
US companies such as SLB and Halliburton are also supporting offshore activities in the region, reinforcing Cyprus’ role as a regional hub for energy services, he added.
The minister is set to visit the EU in June to participate in a 3+1 (Cyprus, Greece, Israel, US) energy meeting and the Atlantic Council’s global energy forum.
Damianos also referred to trade, saying that Cypriot exports to the US more than doubled last year, from €24 million in 2024 to around €51m in 2025.
Halloumi remained the main export product to the US, amounting to €11m in 2025.
According to the minister, US direct investment stock in Cyprus reached €26.2 million at the end of 2024, reflecting investor confidence in the Cypriot economy.
He furthermore pointed out that Cyprus was in a position to act as a strategic business and commercial hub for US companies, as well as a place to establish or expand regional headquarters, particularly in the sectors of technology, telecommunications, business services, shipping and energy.
Referring to industry, Damianos said €350 million has been allocated for the 2021–2027 period to support energy efficiency, digital transformation, competitiveness and the green transition.
Cyprus remains committed to responsible and transparent policies, he said, adding that cooperation with the US is crucial for national growth as well as regional and international security.
The Paphos court ordered the renewal of detention for a further eight days for a 41-year-old woman and a 19-year-old man on Friday, who are under investigation for conspiracy to commit a felony, arson and other offences.
The two suspects were initially arrested on April 15 following an early-morning operation in Paphos. They were reportedly spotted parking outside a premises and approaching it while in possession of a bottle and an object resembling a bat.
Upon noticing police presence, the pair allegedly fled the scene by car, driving recklessly and dangerously.
During the pursuit, their vehicle collided with police cars before they escaped towards the Paphos–Limassol highway.
The vehicle, which was found to be fitted with false registration plates, was later located outside a residence in a village in the Nicosia district.
The 41-year-old woman was found inside the house, while the 19-year-old man was located shortly afterwards walking along a road in the area.
Police said that during his arrest, the 19-year-old allegedly assaulted an officer, striking him in the face, and was arrested on the spot for a flagrant offence.
A case of alleged animal abuse is under police investigation after a dog was found shot and seriously injured in the Nicosia district.
The incident, which occurred on Wednesday in the Pera Chorio area of Nisou, was brought to public attention on Friday by the Ecologists, which described the act as a “serious incident of violence against a defenceless animal”.
According to the report, the dog, named ‘Maili’, was discovered with gunshot wounds and immediately transported to a veterinarian, where it is presently receiving treatment.
A formal complaint has been filed with police, and investigations are ongoing at the local station.
Information available to authorities indicates that a suspect has already been identified.
The party called for “the immediate and in-depth investigation of the case”.
Animal action group coordinator, Anthi Mouzouri, said such incidents must be addressed firmly.
“Animal abuse is a serious social problem and an indication of dangerous behaviour that cannot be tolerated in a law-abiding society,” she said, adding that acts of this nature “cannot and should not go unpunished”.
The case has also drawn attention from the dog’s guardian, who has appealed to the public for information that could assist authorities.
The appeal, circulated on social media, urges anyone with knowledge of the incident to come forward.
Police have not released further details on the suspect or the circumstances surrounding the shooting but confirmed that the investigation remains active.
In the aftermath of the collapse of a building in Limassol, which killed two people, the Real Estate Development Association has called for the administration framework for co-owned buildings to be urgently updated.
“The absence of a modern framework leaves gaps that place human lives in danger and any further delay in taking decisions cannot be tolerated,” the association said on Friday.
It added that the immediate passing of legislation was necessary to secure the safety of people, properly maintain buildings and prevent any similar disasters in the future.
The priority of the new House, to emerge from the May 24 parliamentary elections, should be the immediate promotion and voting of the law on the management of co-owned buildings, it said.
“The establishment of a supervisory authority to secure transparency, compliance and effective control, the passing of standard operating regulations and increasing responsibilities of the management committees, so they can proceed unhindered with the necessary maintenance work and ensure the recovery of costs, are imperative,” the association pointed out.
Baby milk and medical supplies are set to be sent to Cuba in the coming days, after being handed over on Tuesday by PEO to the country’s ambassador in Cyprus, Ruben Pino Martinez.
The donation follows an appeal by the World Federation of Trade Unions and the Cyprus-Cuba Friendship Association to support the Cuban people.
PEO secretary-general Sotiroula Charalambous said Cypriot workers had once again demonstrated their commitment to solidarity.
She noted that the aid campaign was completed in two weeks and called the workers’ response “moving.”
“For us, the struggle of the Cuban people to determine their own country and future is deeply human, a struggle rooted in the principles and values on which modern humanity should stand,” she said.
Charalambous added that it was unacceptable for babies to be left without milk, arguing that such shortages serve broader political objectives aimed at undermining Cuba.
She also told the ambassador that the response from workers in Cyprus had been “moving”, noting that the supplies were collected during a campaign lasting just two weeks.
Pino Martinez expressed gratitude on behalf of the Cuban people, highlighting the longstanding ties of solidarity between Cyprus and Cuba.
“To receive this support, particularly from the working class of Cyprus at a time when the Cuban people face such difficulties, reflects the historic and traditional solidarity of the Cypriot people,” he said.
He stressed that the economic, energy and trade restrictions faced by Cuba are not abstract but a daily reality.
The aid from Cyprus will be distributed to two hospitals and a social support programme, the statement added.
The day before I visited ChimChim, I was still racking my brain for a new place to try out. You see, while Limassol isn’t short of dining options, I’ve become increasingly leery when a new restaurant pops up. Because until proven otherwise, I expect to leave either hungry or destitute.
So, when a friend casually suggested “that new Asian spot down in old town”, I was intrigued. Moreover, they backed both the food and the pricing. Expectations were duly raised. Pleasingly, I’m here to tell you that they were right on both accounts.
ChimChim is on one of the many side roads leading into Limassol’s historic Ayiou Andreou street, the erstwhile retail hub of the city, and not too far from the medieval castle. If you’re parked anywhere from Anexartisias street to the Old Port area, you’re close enough to walk there. It’s a relatively small place and somewhat easy to miss.
There is a dining area just as you enter the restaurant, which looks completely renovated from whatever it has replaced. There is also another dining area at the back. The staff were friendly and politely greeted us when we walked in.
At a relatively early, at least for Cyprus, dining time of 7.15pm on a weekday, we had most of the place to ourselves. It started to get considerably busier around 8:30pm, so perhaps it’s best to book a table, especially if you’re visiting on what I imagine would be a more in-demand Friday or Saturday night.
We started with two small plates, the chicken bao buns and the vegetable spring rolls. The latter was just crispy enough on the outside without being excessively greasy, as is the case with many mainstream variants. The cabbage, carrots and noodles were well-cooked, soft and retained their respective flavours. The portion contains four rolls, perfect for two people to share. It also comes with a somewhat spicy, tangy dipping sauce, if you want to heat things up a bit.
The bao buns were one of the standout items of the evening. They were delightful. Soft, tender chicken, breaded and fried for just the right amount of time, dressed with fresh cucumber slices, which added a coolness to the mix. They were dressed with spicy mayonnaise and fresh cream. These were quite substantial for a starter and, depending on your appetite, could fill you up if you ate both of them.
For mains, we ordered the red curry tofu and the Japanese BBQ chicken. The creamy red curry features well-cooked green beans, carrots and mushrooms in a prominently coconut base that offers a bit of a spicy kick, at least for the average Cypriot palette. The tofu pieces are crisp on the outside but very soft once you bite into them, providing a very good textural contrast to the rich sauce.
The chicken was made using incredibly tender chicken thigh, prepared in a flavourful Japanese BBQ style that balances sweetness with a more savoury taste. This delicious dish was complemented by a fresh side salad topped with a vibrant minty sauce. Another dish I can heartily recommend.
A quick note on the one side we ordered, steamed rice. Nothing exciting to report aside from it being well-executed. That said, it’s probably only enough for one person, so if there’s two of you, order a second bowl.
In terms of dessert, they offer fried ice cream, but we were quite full and decided on trying that next time. With drinks, including a fragrant, aromatic jasmine tea served in a lovely cast iron pot, it came to around €25 per person, but could easily fall to €15-20 depending on your choices. All in all, everything was on point and I’ll be definitely returning.
VITAL STATISTICS
SPECIALTY Asian cuisine
WHERE ChimChim, Ellados 12, Limassol
WHEN Monday to Friday 5-11pm, Saturday-Sunday 12pm-11pm
CONTACT 96 739775
HOW MUCH €6-7 for starters, €12-18 for mains
Cyprus recorded a 22.2 per cent rate of online political and social participation among young people in 2025, placing the country slightly below the European Union average.
The data released by Eurostat on Friday, indicates that just over one in five individuals aged 16 to 29 in Cyprus engage digitally in civic life, including expressing opinions, or taking part in online voting.
Across the EU, the corresponding figure stands higher at 24.3 per cent, meaning “almost one in four young people” uses the internet for such activities.
The data describes this as a broader shift towards digital platforms for civic engagement, where “young people show higher levels of online political and social participation compared to the general population”.
Despite this, Cyprus remains below the EU average, positioning it in the middle range among member states.
Considerably higher participation levels were recorded elsewhere, with Slovenia leading at 49.4 per cent, followed by Latvia at 33.3 per cent and the Netherlands at 31.3 per cent.
At the lower end of the scale, Belgium reported 12.3 per cent, while the Czech Republic stood at 14.3 per cent.
Sweden and Greece both recorded 16.1 per cent, placing them among the lowest-performing countries in terms of youth digital engagement.
Anti-flood works in Paralimni will be going ahead with a budget of €14,280,000, funded by the finance ministry and the EU’s Thalia 2021-2027 social cohesion programme, the Famagusta district government organisation (EOA) announced on Friday.
The infrastructure strengthens the areas’ anti-flood protection, improves the management of rainwater and promotes the safety of people and property, the EOA said.
It added that it will “continue to promote projects of strategic importance that enhance safety, sustainable development and the quality of life in the Famagusta district”.
Pensioners’ organisations have demanded the “immediate lifting of an injustice against widowers” so that their rights are “equal for all”, regardless of the date of death of their spouse.
In a letter said to the labour ministry and the cabinet, the organisations said the state should take a “clear stance on the issue without further delay”.
In a press release on Friday, the organisations said they have demanded an “immediate meeting” with the labour minister to explain that the widowers were “not just a social but also a deeply institutional issue, as it had to do with equality, social justice and dignity”.
Currently, men whose spouses died before January 2018 are not entitled to a widower’s pension.
The organisations will be meeting on May 6 at 3.30pm to discuss developments.
Larnaca mayor Andreas Vyras on Tuesday inspected ongoing works as part of the urban redevelopment project along part of Makarios avenue in Livadia.
Joined by Livadia deputy mayor Marios Armenis, Vyras was briefed on the progress of the project by the contractor, S. Hadjichristofi Construction Ltd, as well as by the design team from George Karas & Associates Architects Civil Engineers LLC.
According to a statement, works are currently underway along Makarios Avenue and Ayia Paraskevi street, with the new stormwater drainage system already completed along Ayia Paraskevi street.
The project, with a total budget of €3.025 million plus VAT, aims to upgrade the area functionally, aesthetically and environmentally.
Planned works include the removal of existing asphalt and pavements, excavation to create new parking areas, and the installation of new drainage systems. Infrastructure for electricity and telecommunications services will also be installed, alongside sewerage works, road resurfacing and pavement reconstruction.
Additional improvements include landscaping and tree planting, the construction of shelters, flower beds and a fountain, as well as the installation of signage, road markings and urban equipment.
The Peristerona community organises a charity running event on May 2 to pay tribute to the memory of its beloved member, the late Constantinos Hadjimichael. In his honour, his family and wider community present the 2nd Constantineios Love Run, a day of celebration, wellness, music and food, raising funds for the Day Care Centre for Adults with Disabilities of the Morphou District Communities.
“Constantinos was a young man who deeply cared about the common good and was always at the forefront of volunteer and charitable initiatives,” say organisers. “Through this event, we honour his memory and continue his legacy of giving, while at the same time promoting a culture of sports, solidarity and community spirit among the residents of our village and the surrounding areas.”
Three races are planned: a 10km running race, a 5km running or walking route and a 1km children’s race. All will set off and finish from the village square, in front of the five-domed church of Saints Barnabas and Hilarion.
Following the races, a small community celebration will take place with music and food, reflecting the warm hospitality of the volunteers of Peristerona. The net proceeds raised will be donated to the Day Care Centre based in Peristerona which provides care, education and daily activities for adults with disabilities in the wider Morphou region.
2nd Konstantineios Love Run
10km and 5km races for adults and 1km children’s race. In memory of Constantinos Hadjimichael. May 2. Peristerona village square, Nicosia district. 7.30am (10km race), 9am (5km race), 10.30am (1km race). Registrations: www.konstantinosloverun.com
Starting April 27th 2026 and over the coming weeks, we will begin a staged rollout that updates the format of newly minted GitHub App installation tokens, making them more performant and improving the reliability of our API surface. If your application expects or relies on installation tokens being exactly 40 characters long, it may not handle this new token format correctly.
We’re now supporting a new, stateless token format for GitHub App installation tokens that improves token issuance performance under increased load and helps us deliver higher reliability at scale.
Newly issued GitHub App installation tokens will use an updated format with the changes below:
ghs_ tokens) will be changing to ghs_APPID_JWT.Note that the prefixes for any of the GitHub token types is not changing and installation tokens will still be prefixed with ghs_.
The JWT is signed using a GitHub-internal issuer and cannot nor should not be validated by a client app. It contains details about the token such as the target installation, the application, and basic validation details. As with all access tokens, client apps must not take a dependency on the contents of this JWT.
In the coming weeks, we will be doing a staged rollout for the format changes to GitHub App installation tokens:
GITHUB_TOKEN and the GitHub App installation tokens issued to all the other first-party featured integrations (e.g., Dependabot, Slack, and Teams). This should not impact your existing Actions workflows. Reach out to GitHub Support if you see this change affecting your Actions workflows and want to temporarily opt-out of the change.
Mid-May to late-June 2026: We’ll begin a staged rollout of the updated format to all the GitHub App installation tokens. We will be providing more guidance over the coming weeks on how to test these new tokens locally to validate that your GitHub Apps continue to work as expected before we roll out the change more broadly. We’ll introduce a brownout period to identify integrations that still depend on token format assumptions, followed by broad enablement of the updated format.
It’s recommended that you treat tokens as opaque strings and avoid validating them against hardcoded patterns.
To help prepare for this change, ensure that:
ghs_[A-Za-z0-9]{36} that validate a token. These may not match the new tokens.Join the discussion within GitHub Community.
The post Notice about upcoming new format for GitHub App installation tokens appeared first on The GitHub Blog.
Two updates will change the way GitHub notifications and repository watches are retained. These updates are rolling out soon, and are expected to be completed over the next few months.
Web notifications will be retained for three months, reduced from five months. After that, the notifications will be removed from your inbox on GitHub. This change keeps your inbox focused on recent activity and reduces the amount of stale data we hold on your behalf.
Email notifications are not affected by this change.
If you are not a collaborator on a repository that has been archived for more than six months, your watch on that repository will be removed. Archived repositories are read-only and cannot generate notifications, so these watches no longer have any effect on what you receive.
Repository owners, organization members, direct collaborators, and team members with access will keep their watches.
If a repository is later unarchived and you would like to watch it again, you can resubscribe with one click from the repository page. Repository owners may notice that the watcher count on archived repositories decreases as non-collaborator watches are removed.
To learn more, see Configuring notifications.
The post Changes to notification retention and archived repository watches appeared first on The GitHub Blog.
GPT-5.5, OpenAI’s latest GPT model, is now rolling out on GitHub Copilot. In our early testing, GPT-5.5 delivers its strongest performance on complex, multi-step agentic coding task and resolves real-world coding challenges previous GPT models couldn’t.
Note that this model is launching with a 7.5× premium request multiplier as part of promotional pricing.
GPT-5.5 will be available to Copilot Pro+, Copilot Business, and Copilot Enterprise users.
You’ll be able to select the model in the model picker in:
Rollout will be gradual. Check back soon if you don’t see it yet.
Copilot Enterprise and Copilot Business plan administrators must enable the GPT-5.5 policy in Copilot settings.
To explore all models available in GitHub Copilot, see our documentation on models and get started with Copilot.
Join the GitHub Community to share your feedback.
The post GPT-5.5 is generally available for GitHub Copilot appeared first on The GitHub Blog.
This update introduces inline agent mode in preview, enhancements to Next Edit Suggestions, global auto approve, and more flexible controls for terminal commands and file edits. It also includes several user experience refinements and quality improvements across GitHub Copilot for JetBrains IDEs.
Inline agent mode is now available in public preview. This brings agent mode capabilities into the existing inline chat experience, making it possible to invoke more powerful, in-context assistance directly from the editor without switching over to the chat panel.
To access inline agent mode, first open Inline Chat. You can use the default shortcuts Shift+Ctrl+I (Windows) or Shift+Cmd+I (Mac). Alternatively, right-click in the editor and select Open Inline Chat, or click the gutter icon and choose Inline Chat. Then switch to agent mode in the Inline Chat panel.
Note: If you are a Copilot Business or Copilot Enterprise subscriber, an administrator will have to enable the Editor preview features policy before you can use this feature.
Next Edit Suggestions now includes inline edit previews and support for far-away edits.
Far-away edits: We enhanced the far-away edit experience with a quick direction indicator in the gutter, so when the next suggested edit is several screens away, you can jump directly to it.
To use Next Edit Suggestions, go to Settings > GitHub Copilot > Completions and select Enable Next Edit Suggestions (NES) in your JetBrains IDE.
Note: If you are a Copilot Business or Copilot Enterprise subscriber, an administrator will have to enable the Editor preview features policy before you can use this feature.
Global auto approve is now available. When enabled, it automatically approves all tool calls across all workspaces and overrides per category auto approve settings, including for potentially destructive actions such as file edits, terminal commands, and external tool calls. Only enable this if you understand and accept the security risks. To configure it, go to Settings > GitHub Copilot > Chat > Auto Approve > Global Auto Approve in your JetBrains IDE.
We also added two granular controls in auto approve settings: Auto-approve commands not covered by rules and Auto-approve file edits not covered by rules. These let you set default auto approve behavior for unmatched terminal commands and file edits without creating every rule manually. To enable them, go to Settings > GitHub Copilot > Chat > Auto Approve in your JetBrains IDE.
We have improved the overall user experience across JetBrains IDEs, making chat workflows more responsive and stable, including:
Quality remains one of our key priorities, and this release includes additional reliability improvements:
We encourage you to try out the latest version of the GitHub Copilot plugin and share your feedback. Your input is invaluable in helping us refine and improve the product.
Your feedback drives improvements. We’d love to hear about your experience in the following channels:
The post Inline agent mode in preview and more in GitHub Copilot for JetBrains IDEs appeared first on The GitHub Blog.
Not a first time gamedev for context,
I and a small team (consisting of myself handling most of the coding and put together of the game, an asset designer, an artist, and a few people on standby if we need help in any areas) are setting out to create a game, no duh. The game itself functions like this:
Experience some story breakdown with an opening cutscene
choose your class
load into the start area, a congregational room with a few NPC’s to talk to and an Altar in the center
exit the area and Load into the first floor of the Inverted Cathedral (a linear map of 3-5 rooms all randomized with some items appearing after killing the enemies within)
find relics along the way that give you lore insight and some reliable buffs (relics will always have the same effect as they do in all runs)
get to the end of the first floor
return to the congregation area and choose to place any relics you found on the alter
if you choose to offer any to the alter you get to choose between 3 options of randomized buffs or items to help you, these can range from basic “+ 0.5 movement speed” to “for every consecutive attack increase your damage by 50% (max 200%)”
return to the inverted cathedral
get to the end of level 2 and fight a boss to return to the congreg area
rinse repeat this process (every 2 floors fight a boss) once you get to the 7th floor you’ll have reached the last level and will get an ending based on what you choose to do
what I would like to ask is if anyone has recommendations for the game itself or would like to see something in it, maybe some recommendations on how we can approach this and anything else you’d just like to say we’re open to everything. Thank you for listening to this massive rant.
mind you we’re going to be making it in Godot using Aseptite for sprite creation and Krita where needed. It’s going to be a 2D game with some elements of platforming in it as well (such as each room having some assortment of platforms or levels added to it so you can move up and down the screen).
Hello, i was wondering if i should be a freelance game artist. I don't know if i want to do 3d modeling, enviromental art, or level design. Which would you recommend? Do you think i should do something differently?
Hi everyone,
I launched the Steam page and trailer for my game yesterday, and it got a bit over 400 wishlists on the first day, which I believe is a good sign… but I honestly have no idea how to interpret it.
It feels like there is some kind of momentum right now, and that I should probably be doing something to take advantage of it from a marketing perspective.
The problem is… I have no idea what that “something” is.
I really enjoy making games, and to be honest, I struggle with the idea of shifting focus into marketing. It is not something I am experienced with, and it feels like stepping away from the part I actually chose to do.
At the same time, it seems pretty clear that without putting effort into visibility, the chances of the game finding an audience are very low.
So I guess my question is:
When you see this kind of early spike, what do you actually do next?
Is there anything concrete that is worth focusing on in the short term to keep that momentum going?
Any advice or experiences would be really appreciated.
| I'm developing a 3D FPS Tower Defense game called Shard Defense: Rogue. I've created this terrain for the first level, but I feel like it could look better. What do you think should be added or improved? [link] [comments] |
What do you people think about this? The s&box engine and platform is being developed by less than 20 people, should be sustainable long term? [link] [comments] |
So i have started developing a voxel game, and i program on linux. But because i want it to be able to be played on windows, i try to test if it works on windows every once in a while. But now, when i checked, this wierd flickering appeared and i have no idea what it could be. looks a bit like a depth issue? is anyone familiar with this?
the library is glow, opengl binds for rust.
image: https://imgur.com/a/Vjbbxqa
So, I want to create a game. I’ve been doing some research and saw a lot of people here recommending starting small and breaking the project into smaller parts. Basically, I cut a lot of ideas and tried to keep only the essentials.
The current idea is this: a character wakes up in an unknown room and finds 3 doors. Each door leads to a small scenario where they have to solve mini games/puzzles. After that, a fourth door appears, they leave that world… and that’s the end.
In my head, this feels like something possible for a beginner, but I’m not sure. Am I on the right track, or am I underestimating the difficulty?
Another point: I still need to choose an engine. From what I’ve seen, people often recommend two main options for this type of game: Godot and RPG Maker. The problem is that I have no experience with game development at all.
I’d like to understand which one would be better for a horror/adventure/puzzle game focused on story, something in the style of games like Corpse Party, OneShot, Re:Turn - One Way Trip, and YAMIGATARI: FOR3ST.
If anyone could share some advice or experience with these engines, I’d really appreciate it!
I’ve been struggling with burnout for too long and I’m worried I won’t be able to recover. I shipped a AAA a couple of years ago and pulled crazy hours (pretty much no weekends, 11+ hour days, the whole nine yards). But it was clear like many AAA games that as we were finishing the game, there was no way we would hit the unrealistic expectations that had been set out for us so while crunching I got nervous wondering if I would have another job at the end of if.
I got a new gig at the same company thankfully, but it was a weird position that didn’t feel crazy stable so while dealing with burnout from the last crunch I pushed myself again to try to solidify the position. It worked for a couple of months, then they reorged and I had to do it all over again. 6 months later, wasn’t stellar but had figured out the position and somehow hit another reorg. Around that time, more layoffs started to be expected once again I thought maybe a change of company would solve my problems
7 months of applications to get a gig with good work life balance (and I recognize where things are at, that was a super short turn around and I am so lucky and thankful). But I’m so burnt out and struggling with even basic tasks. I have gotten negative feedback already and I’m worried the stress of possibly losing this job is going to keep exacerbating the problems but who can find a new job in the industry these days, let alone after spectacularly flaming out as I seem to be doing
Does anyone have any experience coming back from something like this? Or any advice on how to navigate it? Any hope right now would be super helpful
How much do yall estimate it would be for a 200 tile tileset with this level of detail https://ibb.co/b52xM80D and per tile? Please be reasonable with estimates. These are 32x32 tiles btw. My other question is, if I wanted to make a demo of my game and JUST have this biome (the magical foresty biome) in it, how many tiles do you estimate I'd need for a 3 or 4 hour demo (maybe 5, but that'd definitley be on the higher end)?
Sorry, I assume these posts are common and annoying. But if you're willing to take the time, I'd really appreciate it.
I love little games. Not necessarily retro games, I was born well after the Game Boy's day and have no nostalgia for it, but since retro consoles had a lot of quaint and narrowly-scoped games, I do find myself really enjoying them.
At age 27 I've decided to dip my toe into making games. Not as a career, just as a form of expression and for fun. I'm hoping to use GB Studio to make Game Boy games that I can show people on my various emulation devices, or use the Playdate game making kit to make games for my Playdate.
If anyone has used both and has a recommended place to start, that would be great.
But more importantly, are there any video tutorials people recommend? Discords to join? Should I start with making some super simple, or should I start by trying my hand at sprite artwork, music, etc., before putting it all together? Any beginner's mistakes to avoid?
I'm sure the answer is "do it however you want", but I'd love some guidance or ideas on how to not get too intimidated. I've never written a line of code in my life, which is why I've always stayed away from Game Dev. But I'm hoping these accessible tools allow to me make little games inspired by my friends dnd characters, or my wife and I's inside jokes, or whatever else. Maybe I'll like it so much I'll decide to learn how to code... but probably not.
(Just to be clear, I have no interest in using AI assets or code in any way. Not saying anyone was going to suggest that, but just to cover one base immediately)
I'm working right now as a data analyst at a small manufacturing company, and I was looking to make a pivot towards user research. I'm really interested in the gaming industry, have some experience with UX design, and a lot of experience with my job in bridging the gap between a lot of the tools our programmer creates with users at the company - so it feels like a reasonable move.
So my question is - what's the best way to get experience? Job market's rough right now, so I was looking to build a portfolio. Any general advice on where to get started? I was considering either looking at historical data of certain games and making mock reports/presentations, or working with indie devs who'd let me take a look at their user data. Thanks.
Hey yall! I'm new to the whole game dev scene but I managed to form a small team of passionate friends with whom I am trying to make a short game with a psychological and dark theme. So far so good but I figured a survey might help us with the directions we are taking; so if you have a few minutes to spare I'd be very thankful if some of you could fill out this survey!
I'll share the survey results of the non-write your own answer questions (to prevent potential opinion clashing) in about two-three weeks.
It is fully anonymous.
I am trying to make games in c++ (in unreal engine), and i am trying to figure out how i learn it. I am super frustrated because i just cannot start, theres only ancient or none c++ tutorials, and i already have been trying to learn the basics with a long tutorial. Learning the basics wont help much because that wont change the fact that there are no good resources to learn game developement in c++ especially without using blueprint. I hate those tutorials which claim to use c++ but then use blueprint. using AI to learn code is also a horrorible idea, it will just give you a massive load of code and wont explain anything.
Seeing Replaced has given me newfound inspiration to make a project I’ve been meaning to make for a couple of years now, and I’m not sure whether to go with Unity or Unreal to make the vertical slice with. My buddy says he wants to just make a game engine from scratch but I feel like that’s a bit too big of a piece for us to chew at the moment.
So I have a small game that I'm currently working on, and I plan to eventually publish it on Steam. Looking online though, everyone seems to recommend having an LLC. Now if game-dev was a consistent thing I do, then it makes sense, but I don't have any plans to make and publish more games once I'm done with this. Is it really worth the cost of forming an LLC just to publish what will probably be at most one game?
For some additional context, I plan to release the source code for the game under the GNU GPL (though the artwork would be under a separate, more restrictive license). All the game assets I use are either made from scratch, or CC0.
Hi all! Me and my artist friend are currently facing a tough decision in making our game. We are making a psychological horror game where, when you start the game, you wake up from a long coma in the freezing arctic.
My artist friend recommended to add a cutscene/short cinematic to add to the horror, by showing a few footsteps belonging to the main character in the snow and a rapid succession of some images foreshadowing what the player will find out in the story (with no major spoilers, just adding to the tension). After the cutscene the idea is the player wakes up (as he should've before the idea and starts the game). The idea of the cutscene is to trade the "how did I end up here?" for more unease and unsettling feelings.
Now we are faced with 4 options:
Add the cutscene/cinematic, giving a small insight in what happened before he woke up (Maybe this will add to the tension, seeing the disturbing/unsettling stuff)
Don't add the cutscene and keep the mystery, letting the player ask "Where am I?" and "What's going on?"
Add the cinematic in the demo, but not the game.
Adding the cinematic in the game, but not the demo.
Some insight and personal opinions would really help. Thank you!
| Here's an archive of 100GB of game development materials from the middle of development of Snowblind Studio's Lord of the Rings: War in the North. Concept art, design documents, source code, source art assets, and more. Recovered from the deleted sectors of a hard drive from a game studio, so some files are overwritten. It's a great time capsule of this game's development and a good reference for what game development looked like around 2010. [link] [comments] |
Hey everyone, my first game Ironroot just got approved for the Basic Launch phase on CrazyGames. It's a tower defense survivor game and I'm really excited.
This is my first time putting a game on a big web portal. I know a lot of you have experience launching on CrazyGames or places like Poki, so I'd love to get some feedback.
What should I be focusing on during these first few days? I'm curious about which metrics matter most to get past the basic phase and if there are any rookie mistakes I should avoid.
Any advice or stories from your own launches would be awesome. Thanks!
Hi everyone ! I’m currently working on a game about being a music artist, creating music , career management, studio customisation and so on .
But right now i have some doubts concerning the accessibility of the game . For now the player can make music by singing over pre-made music I composed , or composing his own music, then sing over it. It’s not required for the player to sing well or to have great lyrics, it’s more a sandbox for free expression.
Despite the process being very straightforward, I’m afraid it might push back some players who are not really interested in the pure aspects of « making music » and want more the aspect tycoon/management.
The first thing i thought was to propose a « scenario mode » were the music production part is skipped put it cuts 25% of the game
Do you have any idea how to balance this ? I feel a bit lost
It's very common advice (and good advice, I think) to get the game in front of people as soon as possible and make sure the foundation gets that "hold on I'm not done playing" reaction BEFORE adding a bunch of detail and variety.
I'm aware most genres can be reduced to something game-jam appropriate. What about the ones that can't? Like I can't think of any possible way to reduce an adventure game to a tiny prototype. And I've never tried to make them, but I suspect RTS and tycoon games must require a good deal of scaffolding in place before they're fun?
When do you show it to people?
Honest confession: my 3D modeling is genuinely terrible and I have basically zero artistic eye for it, so I've been looking into hiring a 3D artist to collaborate with.
Found someone with 3 years of game-specific modeling experience who quoted me per asset:
- Simple Prop (low-poly + textures): $180 to 480
- Mid-Complexity Environment Asset: $480 to 1,080
- Vehicle / Weapon (high detail): $720 to 1,800
- Standard NPC Character (UV + textures): $960 to 2,400
- Hero Character (with rig, animatable): $2,400 to 7,200
- Full Scene Module Pack: $3,600 to 18,000+
Honestly this feels a bit steep to me but I genuinely don't know if I'm just being cheap or if this is actually above market rate. What are you guys paying your 3D artist collabs?
Also secondary question, any advice on actually improving my own modeling skills? I don't want to be permanently dependent on paid collaborators. What resources or workflows helped you go from "my models look like a fever dream" to something shippable?
Appreciate any input, this community always delivers.
This video introduces the Stack family, which allows us to position objects and shapes within the same space by layering them on top of one another so they overlap.
In contrast, the Flex family—such as Row and Column—arranges objects next to each other horizontally or vertically.
The video first explains the key concepts, then walks through practical examples to help you understand them more deeply and become comfortable using them
I released ai-rulez v4. Been using it constantly since I built it - and introduced it into several organizations, including https://github.com/kreuzberg-dev -- which you can see using across many different repos.
AI Rulez supports most major AI tools. Its very useful when using more than a single agent provider, or for organizations where you need complex / shared setup across repositories, or handle monorepos.
It has a lot of bells and whistles: it supports remote includes and composition. It also has very extensive builtins - for most major programming languages, and including substantial AI workflows.
The last capability - which is actually quite important today - it basically allows allows using the ecosystems of Claude or Codex in other tools. For example, you can install Claude plugins, and use them in codex or cursor etc.
Its important to write here that this is Vibe Coded. I got feedback in the past people would like to know. This is not slop - its a fully functioning, and for me very useful tool. But its vibe coded. A few words on metholdogy:
My methodology is heavily TDD (Test Driven Development) orientated - I start with the API surface, the schema defining the configuration, and then build tests (failing) for these. The implementation then starts by fulfilling the contract of the tests. I then iterate on the code with manual testing and optimizing - usually by benchmarking and profiling. Which these days I also do using agents (ask your agents to profile and inspect the "flamegraphs" to identify performance hotspots, its really quite helpful when optimizing cli perf).
Testing it was basically using it in various projects and with various teams. I strongly believe in OSS - open source really makes a huge difference when vibe coding. Because you get much better feedback, and a lot more testing done. I think its a good quid pro quo - when done by serious devs.
Happy for feedback! And stars! (don't forget the stars lol).
I got tired of glueing together bcrypt + golang-jwt + oauth2 + sessions every time I added auth to a Go service, so I built Limen. Tagged v0.1.0 today.
It's a composable auth library, and the core ships sessions/cookies/CSRF/rate-limiting, and each auth method is a separate module you compose in.
auth, _ := limen.New(&limen.Config{ BaseURL: "http://localhost:8080", Database: sqladapter.NewPostgreSQL(db), Plugins: []limen.Plugin{ credentialpassword.New(), oauth.New(oauth.WithProviders( oauthgoogle.New() )), twofactor.New(), }, }) mux.Handle("/api/auth/", auth.Handler()) That's signup, signin, Google OAuth, and 2FA. auth.GetSession(r) works the same regardless of how they sigin-in. Framework-agnostic http.Handler, so it drops into net/http, Gin, Echo, Chi, Fiber.
Current plugins: credential/password, OAuth (10+ providers), 2FA (TOTP + backup codes). Adapters for database/sql and GORM
It's v0.1.0 — pre-1.0. I would love feedback on API ergonomics and security defaults, and things that can be better.
I’m using e2e tests based on docker-compose via testcontainers.
The service under test runs inside a container and makes HTTP calls to an external service.
I want to intercept these HTTP requests in tests and mock/override responses.
I tried using httptest, but it runs on the host process side and is not reachable from inside the container, resulting in connection refused.
Question:
What are the working approaches or tools for mocking/intercepting HTTP calls made from containers in e2e tests using docker-compose?
I’m specifically looking for solutions that:
Hi everyone,
I wanted to share Senchabot, an open-source bot I've been working on since 2022 to bridge Twitch and Discord.
GitHub repo link: https://github.com/senchabot-opensource/monorepo
I'm looking for some harsh feedback from experienced Go devs. How is my current folder structure? Feel free to open an issue or leave a comment here. If you find the project interesting, a star is always appreciated.
Last time I posted about what I thought might be a language spec bug, I was hesitant to say so, but my suspicions were confirmed, so I'm gonna try again and see what happens. This time it feels like the compiler is blatantly lying to me about why it can't do something. I also hit a obvious compiler bug that causes rust-analyzer to consume all my machine's memory, but that's not what I'm posting about here because I haven't yet been able to come up with a minimal reproduction of the problem yet.
The code is a couple of pages long, so I'll just include a playground link with the problematic code, copiously commented to explain what's going on. The juicy part is at line 76.
For some optional background, I'm working on implementing a wrapper type around num_bigint::BigInt using various encoding schemes to use machine-sized integers to avoid allocation when possible. The convention with BigInt is to pass values to operations like Add::add by reference most of the time to avoid unnecessary cloning, but for the encodings I'm using, it's preferable to pass them by value most of the time, because the encoding itself can usually store a reference to a BigInt, and I want the primitive integer type to always be passed by value. To make it work without making users think too much about when to pass by value vs. reference, I'm trying to implement encodings that can only hold a BigInt by reference, which can be returned by a `borrow` method of my encoded integer type. Those are sort of "second-class" encodings because they can't always own a BigInt, so I've added an Owned associated type to my encoding trait so that results of operations like addition always return an encoding that is capable of owning the resulting BigInt when necessary.
Hey all,
NoctaVox is my attempt at writing a terminal music player for local files. I started this project around 2 years ago as a way to develop my skills as a programmer and now I finally feel like the project is in a place where I'm comfortable sharing it.
The project boasts a number of features including gapless playback, OPUS support, a custom theme engine, live reloading for both theme and library modifications, a variety of different visualization widgets, vim-inspired key bindings, OS media control integrations, and much more. In order to make a lot of this happen, a custom backend was written: the Voxio project.
NoctaVox is designed to be extremely lightweight and fast- as such, it does NOT overwrite user files, nor does it have any online capabilities. However, the project expects that user files are tagged accurately as tagging is how the project collects and creates the internal library.
I know this subreddit is littered with AI vibe-coded garbage, and I'm happy to report that Noctavox does not fall into that category. With that said, NoctaVox does uses very little AI generated code (<5%). However, the Voxio backend was developed using significantly more AI tooling.
Please check out NoctaVox on GitHub or crates.io and let me know what you think. Thanks!
Github: https://github.com/Jaxx497/NoctaVox
Crates.io: https://crates.io/crates/noctavox
Okay so I was sitting with a pico 2 W, I was thinking to myself What more can this do? The reason I initially bought the thing was for a totally different project. Automating a boat so we can legallyish sail the canals of Amsterdam with a autobob.
Like I think for many of us in this sub, we have somewhat of a foundational understanding of low level hardware control but that practice is just not adopted quite often anymore because of a bunch of great frameworks.
So yeah, I fell in to a rabbit-hole. This repository had been sitting for a while locally on my system for another project I had surrounding ZK-proofs and since I never have dealt with MCU's before I was pretty amazed at how fast and consistent it is in a bunch of stuff, like it's one of those things that one technicality knows it can do better. Just no access or need for it, and messing around with that thing made me realize it might just be perfect for zero knowledge proof verification.
So I have been benchmarking for some days and the results are pretty interesting. You can read all the results on the GitHub repo, there is a documentation site on the way but that will be Monday business.
Turns out you can get SNARK verification running on a Cortex-M33 ~1.01 seconds
RISC-V (Hazard 3) ~1.05 seconds.
And all on 111KB RAM on a RP2350
I haven't even touched the DSP-intrinsics (SMLAL, UMAAL) for the M33 yet. There is still a lot of "boring" manual assembly optimization left to do to shave off more milliseconds, but seeing it hit ~1s on a Pico 2 was a big "Aha!" moment for me to be honest.
Yeah, pretty wild stuff. Never knew that would fit on such a small cheap piece of silicon. All no_std.
For some context, I recently had to a bunch of leetcode questions as part of an assignment, and I chose to do them in Rust.
One of the problems I had to do was longest palindromic substring, which I obviously used Manacher’s algorithm for.
For those who don’t know, the algorithm adds a preprocessing step where you add start and end sentinels (typ. @ and $) and insert padding characters (typ. #) between each character in the original string. This guarantees a nonmatching pair at either end and transforms all palindromes to have an odd-length, simplifying things.
Obviously, I had to convert to u8 Vec for this, which isn’t a problem since all the characters in the test cases are ASCII. However, I decided to make use of ASCII’s reserved characters for my sentinels (2=Start of Text, 3=End of Text, 0=Null for pad bc strings aren’t null-terminated) so it could work with any ASCII text, symbols included.
I just defined my special tokens as global u8 constants, but I couldn’t stop thinking about how I could theoretically represent it as a transparent u8 enum, since the variant is also fully described by the value.
enum Token {
Pad=0,
Start=2,
Stop=3,
Char(u8)
}
Is there an easy way to do something like that? Enough that doing so would make sense?
Tangential question, is there a way to specify invalid states for null-pointer optimization? Like, for example, that a signed integer is always non-negative? I know there’s NonZero but that’s only one invalid bit pattern to take advantage of.
This is an experiment I did to test the toolchain compatibility of the top 100 crates and push backwards compatibility to the max.
EPANET is a computational model for solving hydraulic networks, such as drinking water distribution systems, sprinkler systems, etc. It is the academic and industry standard for hydraulic calculations due to its robustness, numerical stability and extensive validation.
The core EPANET codebase, although still actively maintained, is several decades old and written in C, making it difficult to maintain, extend and optimize using modern software engineering practices. In addition, modern applications of the solver, such as leak detection algorithms using Monte Carlo analysis and real-time digital twins of massive hydraulic networks require solving thousands of scenarios in parallel, something the original C code is not really well suited for.
I've spent the past few months translating the legacy C version of EPANET to a Rust project called EPANET-RS, using a modern Faer based solver. My main motivation for doing so was to learn Rust by using this project as a perfect example, and to get a better understanding of the inner workings of EPANET. My company however, also plans to integrate hydraulic models in the core automation systems (think PLC/Scada level). Mission critical systems where using 'unsafe' C code is increasingly being frowned upon.
Translating a legacy C project, that is essentially one massive global state machine full of intersected structs, global methods and variables, to clean and safe Rust code has been a challenge to say the least. Especially hard things to solve were the unit-conversion minefield, and keeping the network, solver and internal state in sync.
The last problem occurs mainly when you try to change network properties (pipe diameter/roughness for example) with a 'hot' solver based on said network. I was really struggling with the rust borrow checker to make that work, and ended up with a system that uses change tracking to notify a solver of the need to update its internal state.
The current version of EPANET-RS is capable of accurately solving most of the reference EPANET networks, and has about 90% of the features of the original C version. Performance wise it is about as fast as the C version for standard calculations, but is also able to solve multiple scenarios and timesteps in parallel for a massive performance boost.
It is my first Rust project so I'm sure there is lots of room for improvement, but I'm curious to see what you think of my work so far.
You can find the library here and the source code on GitHub
AI/LLM Disclaimer:
The use of AI/LLM models was mostly limited to generate test cases, for advice on dealing with the borrow checker, and to generate boilerplate for modifying networks. The majority of the code was written by hand (with the use of copilot autocomplete).
This week I experienced really interesting bug hunt where Windows ARM target platform started failing CI while other environments passed successfully.
I learnt how to:
Hope you like it :)
Hey r/rust, I built a small crate for proc-macros that's been saving me a lot of headache: comperr.
When writing proc-macros, you often need to emit a compile_error! to report invalid input. The naive approach: rust format!("compile_error!(\"{}\");", msg) .parse::<TokenStream>() .unwrap() ... points to the wrong thing. Another naive approach is pulling syn, which is a great crate, but bloats compilation time like crazy.
Usage: rust pub fn my_macro(input: TokenStream) -> TokenStream { return comperr::error(span, "expected a string literal"); }
Or for multiple errors: ```rust use comperr::Error;
let mut errors = Error::empty(); for field in &fields { if !is_valid(field) { errors.combine(Error::new(field.span(), "unsupported field type")); } } if !errors.is_empty() { return errors.to_compile_error(); } ```
This started out as a learning project or a wrapper crate to my own projects, but it turned out super useful so I figured I'd publish and update it.
Stats: - One tiny dependency: proc_macro2 - MSRV: Rust 1.85 - Tested - Super cool
Available on crates.io: cargo add comperr
Check it out at https://codeberg.org/razkar/comperr.
Would love feedback, especially from proc-macro authors!
first post: https://www.reddit.com/r/rust/comments/1ss7zqa/litext_a_zerodependency_crate_for_procmacro/
Hey! I've been working on a small proc-macro helper crate and wanted to share it.
litext is for when your proc-macro receives a TokenStream and you just need to pull a typed value out of it. The boilerplate for doing that correctly is annoying enough that I got tired of copying it between projects.
rust let text: String = litext!(input); let count: u32 = litext!(input as u32); let flag: bool = litext!(input as bool);
As of 1.1, multi-extraction is in:
rust // input: "hello" , 42 let (name, count): (String, u32) = litext!(input as (String , u32));
The separator can be any single punctuation character.
(String, u32)and(String , u32)are identical to the tokenizer; the space in examples is just to visually flag that the comma is the separator, not Rust tuple syntax.
Some things worth knowing that aren't obvious from the surface:
The separator in the tuple form can be any single punctuation character, not just commas. Semicolons, pipes, whatever matches your DSL. Multi-character sequences like -> and :: don't work though, Rust tokenizes those as multiple tokens and only the first gets consumed.
bool is handled transparently even though true and false are identifier tokens in Rust's token stream, not literals. You don't have to think about that.
Byte literal \x escapes accept the full 0x00..=0xFF range. String \x is restricted to ASCII by the Rust tokenizer itself, not by this crate.
There's a try form if you want a Result instead of early return: rust litext!(try input as T)
Span-aware types (LitStr, LitInt<T>, LitBool, etc.) are there if you need the source location for diagnostics. They all implement ToTokens so you can extract, validate, and emit back with the original span.
Honest limitations: negative numbers are two tokens (- and a positive literal), the crate doesn't handle them.
Type arguments in the tuple form have to be single-token identifiers, so LitInt<u8> won't work there, use LitInt or just i32.
Deps are just proc-macro2 and comperr (my other small crate for span-accurate compile errors).
Repo: https://codeberg.org/razkar/litext
Crates.io: https://crates.io/crates/litext
Docs: https://docs.rs/litext
Would really love feedback, especially if something doesn't cover a case you actually hit.
Hey everyone! I've been learning Rust for a while now I finished the Rust Book, worked on a few small projects along the way, and I'm currently building something a bit more ambitious. Overall, I'm really enjoying the journey! That said, I've been running into something that's been a little frustrating: even though I have a decent understanding of Rust's core concepts (ownership, lifetimes, traits, etc.), I often find myself struggling when it comes to actually using the standard library in practice. I know *of* many functions, but figuring out how they work together in a real project context is a different story. I think part of the challenge is that the standard library really is its own world there's so much there, and knowing the language itself doesn't automatically mean you know how to navigate all of it efficiently. Has anyone else gone through this? Did you find that it just takes time and repetition, or are there specific resources / strategies that helped you get more comfortable with the standard library while building projects? I'd love to hear how others approached this stage of the learning curve.
Github - https://github.com/ohaswin/pyscan
I have been working (on and off) for 3 years on this project. Here's the first post i made when it released 3 years ago.
Pyscan was engineered to solve the performance and memory bottlenecks of traditional Python-based security tools in production CI/CD pipelines:
What it does: Pyscan automatically traverses your Python project, extracts dependencies across various packaging formats (uv, poetry, filt, pdm, requirements.txt, SBOMs, even source code), and cross-references them against the Open Source Vulnerabilities (OSV) database
One honest thing: Pyscan is on-par with uv audit , sometimes faster. If you use uv in your Python environment you actually don't need pyscan at all. Pretty cool since uv is Rust-based as well.
The recent release added:
bom.json) and SPDX (spdx.json) files.In the upcoming releases, I'll be improving QoL for CI/CD users and trying to see if i can make it faster than uv while also adding some interesting new features.
There's been an influx of AI slop in r/Python and I couldn't post it there, I hope it doesnt get removed here as well lol. Would love to hear feedback and answer any questions!
The Rust Foundation recently received access to Claude Mythos, and has been using it to review the standard library for security issues. The more severe issues are being kept under embargo for now, but a couple minor ones are now public:
CString::clone_into(): https://github.com/rust-lang/rust/pull/155707slice::join() with certain pathological Borrow impls: https://github.com/rust-lang/rust/pull/155708Thanks to the Rust Foundation, wg-security-response, and Anthropic for working to find and fix these issues!
I've been learning Rust for a week now. So far I love the experience. My initial guide for the very basics like the syntax and stuff was https://google.github.io/comprehensive-rust/, which was recommended to me by an LLM for developers who already know what they're doing to a certain extent.
After that, I began working on small projects. My first, somewhat real project apart from the exercises in that Google guide was https://pastecord.com/BzEfZ2ZYxMhcwhJFz3ZSlBSZUDQT8gxY. Where my impression with things like if let [name @ .., ext] = &filename.split(".").collect::<Vec<_>>()[..] was very pleasant. My error handling on this one is still pretty C-like I think (ie., non-existant), lol.
By now I had some basic knowledge on Rust, so I began working on a proper project. I recently found out about this site called toscrape.com which lets you scrape their dummy sites. I decided to make a API wrapper in Rust for their book catalog: https://github.com/eeriemyxi/toscrape/.
My primary goal in this project was to be idiomatic (or doing things in a "Rustacean" way) and to learn about the packaging structure for Rust projects. I also played with traits, macro_rules, and so on. I loved the macros, they were very useful to me on several occasions and being able to actually understand them unlike a certain other language, was very pleasant to me. Like here and here.
If you go back to the initial commits, you'd notice that the package structure was terrible and there was no error handling anywhere in sight, lol. I was mainly focused on learning idiomatic ways to handle the many things I had going on back then. I actually didn't know how to do error handling during then. Once I had reached a satisfying base, I decided to research into things and found out about thiserror and anyhow crate. I used thiserror in this project. Error handling was very pleasant as well. The ergonomics that Rust has for error handling lets me properly handle errors right away, which helped me in several occasions during the debugging. I actually had useful, contextual errors.
Now that project depends on reqwest, but initially it was depending on a project called hyprcurl which FFIs to curl. There was a point in time when I had to debug a segfault with gdb, and I found that pretty funny somehow, lol. I liked that the backtrace was actually readable.
Eventually, I also got my hands dirty with std::thread. I actually never worked with threads before in a low-level language. It was my first time with it. I learnt how to do multi-threading from rust-lang's tutorial. The mpsc::channel() is really cool. You can find the implementation details on commit 381b256 if you're interested. I would love some advice in that regard, actually.
I just completed working on my newest project, https://github.com/eeriemyxi/waydrate, I'd love some advice regarding this project and toscrape wrapper's code if anybody is willing to do a review. Thank you so much.
All the code in my projects is written by hand, and my own thoughts for the most part. I took abstract help and several code reviews from LLMs to learn the basics on idiomatic Rust. I think this fast, contextual feedback loop really helped get going sooner.
We already got a tiny taste of quaternions, but that was just the surface we Have seen the the imaginary numbers and we talked about how Xi + Yj + Zk really works but this represents a point on a 3D graph (P = Xi + Yj + Zk). Now we’re getting into the real deal the Rotation the actual Rotation.
Usually People call these 3D quaternions but calling them 3D quaternions is wrong. Quaternions are 4D engines built to spin things in 3D space. That’s why we use the full W + Xi + Yj + Zk setup.
Our big focus now is W.
You’ve got to understand that W sets the angle of the spin, but it has no physical direction. Why? Because direction needs an axes (X, Y, or Z), but W is a pure scalar. It’s just a raw number like 1, 2, or -1. You can plot it on a 1D line, but it doesn't point anywhere in your 3D room. It’s not a vector. It’s part of the quaternion, but it doesn't represent the axis you’re rotating around. It’s just the numerical weight.
W is like a football referee. He is the most important guy on the field because he controls the rules and the clock, but he isn’t a player. He doesn't kick the ball or play for a team. W is that referee. It stays outside the 3D play (the axes), but it decides exactly how much the axes (X, Y, Z) are allowed to move.
We will see the role of W later in our Rotation later it was just an intro for now. It's time to our School math which we have seen in the part 1 too.
We previously discussed flipping. Flipping is just taking a point on the X axis and giving it a 180 degree turn. Now it is -X. Mathematically, you are doing X . -1 = -X. That move to the opposite side of an axis is what we call flipping.
That -1 at the end in The School Math image is actually the cancellation of rotation. Why? Let us use a wall to explain this. Suppose your friend is behind a wall. You are on the the other side. To see this, imagine the X axis as the straight line on the floor that represents the path between you and your friend and the Y axis as the vertical line of the wall itself.
When you calculate X . i, your point moves off the floor and onto the wall. Since the floor and the wall sit at 90 degrees to each other, there is now a 90 degree angle. And if you multiply it again (X . i . i)? Now you are at your friend. Why? Because i . i is 180 degrees.
But what if the Y axis disappears? Only X is left. Can you make a 90 degree angle in that physical space? No. Physical space needs at least two dimensions (a 2D plane) for an angle to even exist. But here is the trick: When we talk about 3D space, for any rotation to physically occur, a 2D plane (like Y and Z) is needed because an angle simply cannot be formed without a plane. But when we talk about quaternion math, the quaternion does not need all three axes within itself. If you only want to rotate around the X-axis, then only 'i' will appear in the quaternion formula (like W + Xi). This formula does not need 'j' and 'k' to survive and do its job.
While the physical space needs a plane to rotate, the quaternion itself only needs to define ONE single axis. That single axis acts as the invisible pole that spins the 2D plane. A quaternion functions perfectly and survives with just one axis.
The School math is telling us something here. When two identical imaginary numbers multiply together (i . i), the spatial rotation stops. You get a scalar. No axis means no direction, and no direction means there is no active spatial rotation.
The quaternion doesn't just vanish. It just stops spinning. It flattens out into a pure number with zero direction. And that is exactly how a rotation ends. Because when we talk about imaginary numbers, we are really just talking about direction. And you can't have a direction without an axis. Axis gone? Direction gone. The moment that axis collapses into a pure scalar, the rotation is dead. So we can see how the rotation ended. When we talk about imaginary numbers, we are really talking about direction.
Hamilton's fundamental formula
Look at this part carefully: i . j . k = -1. You just moved through all three axes one after the other. And the result is just a flat -1. But what does that -1 actually mean in physical space? In quaternion W = Cos(theta / 2). If your W hits -1 the math is telling you that the half-angle is exactly 180 degrees. Multiply that by 2 to get your real angle. You get 360 degrees. So it does not matter if you multiply the same two axes together (i . i = -1) or if you chain all three together (i . j . k = -1). Hitting that -1 scalar means your system just did a complete 360 degree spin. The object is sitting exactly where it started. This single fact is the absolute foundation the entire quaternion system is built on.
The system needs a raw value whose square is exactly 0.5. That specific value is 0.707 because 0.707 . 0.707 = 0.5. So the value for Cos(45) is 0.707 and the value for Sin(45) is also 0.707. Here no extreme 0 or 1 is formed. Both values are perfectly equal.
This proves W is a normalized number. Normalized means the total system capacity is always restricted to a strict length of 1. When W is 1 the rotation is 0 and the axes have 0 energy. When W is 0 the rotation is 180 and the axes hold all the energy.
Why are we actually dividing the theta angle by 2? The physical rotation is 90 degrees but we feed 45 degrees into the Cos and Sin functions.
The answer lies in the mathematical sandwich approach known as q . v . q***\**-1*.
q applies half the rotation (theta/2) and q-1 applies the other half (theta/2) from the opposite side to keep the vector in 3D space. Without multiplying from both sides, the 3D vector gets pulled into 4D quaternion space.
To rotate a vector we must multiply it by a quaternion from the left and its inverse from the right. This structure applies the rotation effect twice. If we want a final physical rotation of theta we must use theta / 2 on the left and theta / 2 on the right so they add up perfectly to the full target angle.
We have learnt Scalar means the axis is completely gone and it adds in W. But how does this newly formed scalar actually make that jump, and what exactly causes W to grow?
When you multiply two terms together like 2i and 3i you end up with 6(i . i). Since we already know that i . i is -1, that entire chunk just becomes -6. Just like that, the 'i' axis is wiped out completely.
You are left with a flat -6, which is a pure scalar. Because it lost its directional axis, it mathematically cannot exist in the X, Y, or Z positions anymore. Basic algebra dictates that like terms have to group up. So, that -6 has nowhere else to go. It is forced to shift over and add itself directly to your existing W value. And that is the exact mechanical way W absorbs these numbers.
What happens if all three axes (i, j, k) become scalars during a complex calculation? W accumulates the sum in a single numerical flow.
W = W + (2i . 3i) + (4j . 5j) + (6k . 7k) = W - 6 - 20 - 42 = W - 68
W is a normalized number. Normalized means the total system capacity is always restricted to a strict length of 1. When W is 1 the rotation is 0 and the axes have 0 Rotation. When W is 0 the rotation is 180 and the axes hold all the Rotation.
We will understand the role of W in rotation through a concept similar to the law of conservation of energy. We will only look at values from 0 to 1 for W in this context. If W is 1 it means there is zero rotation and the object is at its exact starting place. As the rotation begins on the physical axes X to Y and Y to Z the value of W starts decreasing. We know that a full face turn to the back means the object rotated 180 degrees. At this exact 180 degree angle all the energy from W is drained out and W becomes 0.
This proves the total energy in the system is fixed and it simply transfers from W to the physical axes. The mathematical equation W2 + X2 + Y2 + Z2 = 1 must always be fulfilled. Energy is neither created nor destroyed but it simply moves between the scalar W and the vector axes. This is why the value of W travels precisely between 0 and 1 during rotation. If we take that same object and rotate it in reverse by 180 degrees back to 0 degrees it will return to its exact starting position. All the rotational energy transfers back from the 3D axes to W making W equal to 1 again.
Now we will use Cos(theta/2) and Sin(theta/2). These trigonometric functions map exactly to our energy law. The Cos(theta/2) function calculates the value of W which represents the pure quaternion math rotation. The Sin(theta/2) function calculates the distribution of that energy across the physical 3D axes. The physical 3D world axes and the quaternion W exist in completely different mathematical spaces. This is why the 3D graph angle is not the exact same value as the internal quaternion math angle.
You will see a complementary relationship between Cos(theta/2) and Sin(theta/2). Suppose the physical rotation angle is 180 degrees. The formula divides this by 2 so we get 180 / 2 = 90. Now we calculate Cos(90) and Sin(90). Both functions take the same 90 degree input but their outputs are exactly opposite in a complementary way. The value of Cos(90) is 0 and the value of Sin(90) is 1. Since Cos calculates W and Sin calculates the axes this physically means at 180 degrees of rotation W drops completely to 0 and the axes hold all the energy as 1. The mathematical rule 0***\**2* + 1***\**2* = 1 is perfectly maintained.
But because theta is divided by 2 there will also be a situation where Cos and Sin have exactly equal parts. Let us look at a real world angle of 90 degrees. The formula divides this by 2 which gives 45 degrees. We now need the limit for Cos(45) and Sin(45). If you trace this on a graph 45 degrees is the exact midpoint where the two lines cross. Because it is the exact halfway point between 0 (stationary) and 180 (fully rotated) degrees the math values must be split equally between W and the axes. Remember our rule W***\**2* + Axes***\**2* = 1. If W and the Axes must be exactly equal we need a number that gives 0.5 when multiplied by itself. We need 0.5 + 0.5 = 1.